
本文共 5606 字,大约阅读时间需要 18 分钟。
#������Security.framework���������RSA������������������
RSAPrivateKey���������������
������������������������������������������Apple���Security.framework���������������RSAPrivateKey���������������������������������������iOS���macOS���������������������������
1. ������������������������
���������������������������DER���������������������loadPublicKeyFromFile
���������������������������������������������������������������������������������������������������������loadPublicKeyFromData
���������SecKeyRef���������������������������������
- (SecKeyRef)getPublicKey{ if (!_publicKey) { [self loadPublicKeyFromFile:self.derFilePath]; } return _publicKey;}- (void)loadPublicKeyFromFile:(NSString *)derFilePath{ if (!derFilePath) { return; } self.derFilePath = derFilePath; NSData *derData = [NSData dataWithContentsOfFile:derFilePath]; [self loadPublicKeyFromData:derData];}- (void)loadPublicKeyFromData:(NSData *)derData{ _publicKey = [self getPublicKeyRefFromeData:derData];}- (SecKeyRef)getPublicKeyRefFromeData:(NSData *)derData{ SecKeyRef publicKeyRef = NULL; CFDataRef myCertData = (__bridge CFDataRef)derData; SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)myCertData); if (!cert) { NSLog(@"���������������������%@", self.derFilePath); return nil; } SecPolicyRef policy = SecPolicyCreateBasicX509(); SecCertificateRef certArray[1] = {cert}; CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL); SecTrustRef trust; OSStatus status = SecTrustCreateWithCertificates(myCerts, policy, &trust); if (status != noErr) { NSLog(@"SecTrustCreateWithCertificates������������������������%d", (int)status); CFRelease(cert); CFRelease(policy); CFRelease(myCerts); return nil; } SecTrustResultType trustResult; status = SecTrustEvaluate(trust, &trustResult); if (status != noErr) { NSLog(@"SecTrustEvaluate fail������������������%d", (int)status); CFRelease(cert); CFRelease(policy); CFRelease(trust); CFRelease(myCerts); return nil; } publicKeyRef = SecTrustCopyPublicKey(trust); CFRelease(cert); CFRelease(policy); CFRelease(trust); CFRelease(myCerts); return publicKeyRef;}
������������loadPrivateKeyFromFile
���loadPrivateKeyFromData
���������������P12���������������������������������������������P12������������������������PrivateKey
������������������
2. RSA���������������������
���������rsaEncryptString
���rsaDecryptString
���������������������������������������������������������������SecKeyEncrypt
���SecKeyDecrypt
���������������������������������
- (NSString *)rsaEncryptString:(NSString *)string{ NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptedData = [self rsaEncryptData: data]; NSString *base64 = [encryptedData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; return [base64 stringByReplacingOccurrencesOfString:@"=" withString:%( // ������URL���������64������������=���������������������������������������64���������������������������URL���������������������������=���-������������������������������������������base64���������{ return base64;}
3. ������������������
rsaEncryptData
������������SecKeyEncrypt
���������������������������������SecKeyEncrypt
������������������������������������������������������������������������������
- (NSData *)rsaEncryptData:(NSData *)data{ SecKeyRef key = [self getPublicKey]; const uint8_t *srcbuf = (const uint8_t *)[data bytes]; size_t srclen = data.length; size_t block_size = SecKeyGetBlockSize(key) * sizeof(uint8_t); void *outbuf = malloc(block_size); size_t src_block_size = block_size - 11; NSMutableData *ret = [NSMutableData alloc]; for(size_t idx = 0; idx < srclen; idx += src_block_size) { size_t data_len = srclen - idx; if (data_len > src_block_size) { data_len = src_block_size; } size_t outlen = block_size; OSStatus status = noErr; status = SecKeyEncrypt(key, kSecPaddingPKCS1, srcbuf + idx, data_len, outbuf, &outlen); if (status != noErr) { ret = nil; break; } else { [ret appendBytes:(const void *)outbuf length:outlen]; free(outbuf); } } return ret;}
������������rsaDecryptData
������������SecKeyDecrypt
���������������
4. ���������������������
������������������������������������������������������������������������
EncryptTool *tool = [[EncryptTool alloc] init];NSString *publicPath = [[NSBundle mainBundle] pathForResource:@"rsacert" ofType:@"der"];[tool loadPublicKeyFromFile:publicPath];NSString *returnEncypt = [tool rsaEncryptString:encyptString];NSLog(@"���������������%@", returnEncypt);NSString *privatePath = [[NSBundle mainBundle] pathForResource:@"p" ofType:@"p12"];[tool loadPrivateKeyFromFile:privatePath password:@"123456"];NSString *returnDecrypt = [tool rsaDecryptString:returnEncypt];NSLog(@"���������������%@", returnDecrypt);
������������������publicPath
���������������������������privatePath
���������������������������123456
���������������������
���������������������������������������RSAPrivateKey���������������������������������������������������������������������������������������������������������������������������
发表评论
最新留言
关于作者
