设为首页 加入收藏

TOP

基于OpenSSL的RSA加密应用(非算法)(三)
2017-10-12 18:08:10 】 浏览:10177
Tags:基于 OpenSSL RSA 加密 应用 算法
Data getBytes:cKey length:keySize]; // 设置 IV 向量 uint8_t cIv[blockSize]; bzero(cIv, blockSize); int option = kCCOptionPKCS7Padding | kCCOptionECBMode; if (iv) { [iv getBytes:cIv length:blockSize]; option = kCCOptionPKCS7Padding; } // 设置输出缓冲区 size_t bufferSize = [data length] + blockSize; void *buffer = malloc(bufferSize); // 加密或解密 size_t cryptorSize = 0; CCCryptorStatus cryptStatus = CCCrypt(operation, algorithm, option, cKey, keySize, cIv, [data bytes], [data length], buffer, bufferSize, &cryptorSize); NSData *result = nil; if (cryptStatus == kCCSuccess) { result = [NSData dataWithBytesNoCopy:buffer length:cryptorSize]; } else { free(buffer); NSLog(@"[错误] 加密或解密失败 | 状态编码: %d", cryptStatus); } return result; } #pragma mark - RSA 加密/解密算法 - (void)loadPublicKeyWithFilePath:(NSString *)filePath; { NSAssert(filePath.length != 0, @"公钥路径为空"); // 删除当前公钥 if (_publicKeyRef) CFRelease(_publicKeyRef); // 从一个 DER 表示的证书创建一个证书对象 NSData *certificateData = [NSData dataWithContentsOfFile:filePath]; SecCertificateRef certificateRef = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certificateData); NSAssert(certificateRef != NULL, @"公钥文件错误"); // 返回一个默认 X509 策略的公钥对象,使用之后需要调用 CFRelease 释放 SecPolicyRef policyRef = SecPolicyCreateBasicX509(); // 包含信任管理信息的结构体 SecTrustRef trustRef; // 基于证书和策略创建一个信任管理对象 OSStatus status = SecTrustCreateWithCertificates(certificateRef, policyRef, &trustRef); NSAssert(status == errSecSuccess, @"创建信任管理对象失败"); // 信任结果 SecTrustResultType trustResult; // 评估指定证书和策略的信任管理是否有效 status = SecTrusteva luate(trustRef, &trustResult); NSAssert(status == errSecSuccess, @"信任评估失败"); // 评估之后返回公钥子证书 _publicKeyRef = SecTrustCopyPublicKey(trustRef); NSAssert(_publicKeyRef != NULL, @"公钥创建失败"); if (certificateRef) CFRelease(certificateRef); if (policyRef) CFRelease(policyRef); if (trustRef) CFRelease(trustRef); } - (void)loadPrivateKey:(NSString *)filePath password:(NSString *)password { NSAssert(filePath.length != 0, @"私钥路径为空"); // 删除当前私钥 if (_privateKeyRef) CFRelease(_privateKeyRef); NSData *PKCS12Data = [NSData dataWithContentsOfFile:filePath]; CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data; CFStringRef passwordRef = (__bridge CFStringRef)password; // 从 PKCS #12 证书中提取标示和证书 SecIdentityRef myIdentity; SecTrustRef myTrust; const void *keys[] = {kSecImportExportPassphrase}; const void *values[] = {passwordRef}; CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); // 返回 PKCS #12 格式数据中的标示和证书 OSStatus status = SecPKCS12Import(inPKCS12Data, optionsDictionary, &items); if (status == noErr) { CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0); myIdentity = (SecIdentityRef)CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity); myTrust = (SecTrustRef)CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemTrust); } if (optionsDictionary) CFRelease(optionsDictionary); NSAssert(status == noErr, @"提取身份和信任失败"); SecTrustResultType trustResult; // 评估指定证书和策略的信任管理是否有效 status = SecTrusteva luate(myTrust, &trustResult); NS
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇实现iOS图片等资源文件的热更新化.. 下一篇iOS多线程技术方案

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目