升级ios9后RSA加密SecItemAdd出问题

madrid366 2015-09-22 07:26:09
ret = SecItemAdd((__bridge CFDictionaryRef) publicKeyDict, (CFTypeRef*)&pubKeyRef);

在iOS8系统下下面的上面这句代码没问题,ret = 0,pubKeyRef的值是:
po pubKeyRef
<SecKeyRef algorithm id: 1, key type: RSAPublicKey, version: 3, block size: 1024 bits, exponent: {hex: 10001, decimal: 65537}, modulus: B5CE747C46781C81488F169C72828B72233E6E3B70525D2CE088665EC1B61F3F5FC7FE96CFB8BFFA699D61D0316ACC8C021A03ABF703C75510990F95008E4A3303ACF424B3E7EFEA001D0499CE00EB293A79B2054D11852E66D81EABF9B714A0013611059810C4CD670B50AC5D2E6B743049A5297AD38690C25BB3BBF95A331D, addr: 0x15e0baa00>

在ios9下,这句返回值ret = 0,但是pubKeyRef得到的值为空。
具体的代码在下面。
跪求大神。。。

+(NSData*)rsaEncrypt:(NSData*)publicKey rawData:(NSData*)rawData
{
SecKeyRef pubKeyRef = NULL;

CFTypeRef pubKeyRefTmp = NULL;
OSStatus ret;

//这里的公钥部分的数据是按BER格式保存,module在前,exponent部分在后,其具体的格式为:
// 序列类型 | 2部分的总长度 |[ [数值类型 | module的长度 | module的内容] | [数值类型 | exponent的长度 | exponent的内容] ]
NSData *publicKeyData = publicKey;


NSData *publicKeyTag = [@"xxxxxxxx " dataUsingEncoding:NSUTF8StringEncoding];


NSMutableDictionary *publicKeyDict = [[NSMutableDictionary alloc] init];
[publicKeyDict setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];
[publicKeyDict setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[publicKeyDict setObject:publicKeyTag forKey:(__bridge id)kSecAttrApplicationTag];


//从钥匙串中删除已经存在的密码
ret = SecItemDelete((__bridge CFDictionaryRef)publicKeyDict);

//将密码添加入钥匙串中。
[publicKeyDict setObject:publicKeyData forKey:(__bridge id)kSecValueData];
[publicKeyDict setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)kSecAttrKeyClass];
[publicKeyDict setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];

ret = SecItemAdd((__bridge CFDictionaryRef) publicKeyDict, (CFTypeRef*)&pubKeyRef);

if (ret != 0 || pubKeyRef == NULL)
{
return nil;
}


//用生成的公钥加密数据,RSA加密算法对要加密的数字进行分块处理,每一块的长度 = 公钥长度 - 11(这里是对其字节数)
//而对空出的11个字节采用了随机数的填充方法,所以每次用公钥加密出来的密文都是不一样的。
NSMutableData *encryptedData = [[NSMutableData alloc] init];

size_t cipherBufferSize = SecKeyGetBlockSize(pubKeyRef);
uint8_t *cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));
memset((void *)cipherBuffer, 0x0, cipherBufferSize);


NSData *plainTextBytes = rawData;
int blockSize = __ISIOS5 ? cipherBufferSize - 12 : cipherBufferSize -11;
int numBlock = (int)ceil([plainTextBytes length] / (double)blockSize);
for (int i=0; i<numBlock; i++) {

int bufferSize = MIN(blockSize, [plainTextBytes length] - i * blockSize);
NSData *buffer = [plainTextBytes subdataWithRange:NSMakeRange(i * blockSize, bufferSize)];
OSStatus status = SecKeyEncrypt(pubKeyRef, kSecPaddingPKCS1,
(const uint8_t *)[buffer bytes],
[buffer length],
cipherBuffer,
&cipherBufferSize);

if (status == noErr)
{
[encryptedData appendBytes:cipherBuffer length:cipherBufferSize];

}
else
{
break;
}

}

if (cipherBuffer) {
free(cipherBuffer);
}

CFRelease(pubKeyRef);

return encryptedData;

}
...全文
1011 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycace 2017-05-15
  • 打赏
  • 举报
回复
引用 12 楼 u012874859 的回复:
楼主,这个问题解决了吗
通过这个方法解决了 http://www.jianshu.com/p/f43fc057fba4
以技术之名 2016-04-15
  • 打赏
  • 举报
回复
楼主,这个问题解决了吗
ylgwhyh 2015-11-10
  • 打赏
  • 举报
回复
看看我找的这个方法能够帮到你们吗? http://blog.csdn.net/ylgwhyh/article/details/49756209
ylgwhyh 2015-11-09
  • 打赏
  • 举报
回复
楼主,你的问题解决了吗?
ylgwhyh 2015-11-05
  • 打赏
  • 举报
回复
楼上的解决方法无效啊!
  • 打赏
  • 举报
回复
我写了blog投机取巧地解决了这个问题,如果觉得有用的话,点个赞吧~ http://blog.csdn.net/suusatoshigi/article/details/49535391
xillkey 2015-10-31
  • 打赏
  • 举报
回复
目前有一个解决方案,你看看ok不? http://blog.csdn.net/suusatoshigi/article/details/49535391
ylgwhyh 2015-10-21
  • 打赏
  • 举报
回复
大神们,你们解决这个问题了吗?
QQDAOCOM 2015-10-08
  • 打赏
  • 举报
回复
在网上找了那些方法 在iOS9上加密都有问题
QQDAOCOM 2015-10-08
  • 打赏
  • 举报
回复
大神们 你们解决了吗 ? RSA加密 我在iOS9真机 也出现问题了 模拟器没问题的
lilongcnc 2015-09-23
  • 打赏
  • 举报
回复
我们公司的框架也出现问题.....快要醉了....同求问题啊
madrid366 2015-09-23
  • 打赏
  • 举报
回复
有没有大神帮忙看看呀。。。。或者是否有其他的方法把已经获得的NSData类型的公钥转换成要用的SecKeyRef类型?

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧