iOS_RSA加密-生成秘钥的使用
发布日期:2021-05-10 10:08:47 浏览次数:14 分类:精选文章

本文共 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���������������������������������������������������������������������������������������������������������������������������

上一篇:如何用MAC上的Safari检查iPhone手机App运行的Html页面
下一篇:iOS_RSA加密-秘钥生成

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月22日 01时39分28秒