iOS – 从指数+模数创buildSecKeyRef
我想通过指数和模数作为私钥来解密iPhone上的RSA编码的blob。 在Java中(使用javax.crypto),可以通过如下代码轻松实现:
// 1) key RSAPublicKeySpec keySpec = new RSAPublicKeySpec(myModulus, myPublicExponent); KeyFactory fact = KeyFactory.getInstance("RSA"); Key pubKey = fact.generatePublic(keySpec); // 2) cypher Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, keySpec); // 3) use cypher to decode my block to an output stream
但与iPhone安全API我不能创build一个SecKeyRef(密钥),而不是通过生成一对或导入证书,我没有/要。
有没有办法创build一个模数+指数手动键? 如果是这样,你可以给我一个线索,如何?
提前致谢
你的指数和模数如何编码? 如果他们在PKCS#12 blob中,可以使用SecPKCS12Import()
和SecIdentityCopyPrivateKey()
来实现你想要的。
编辑 :鉴于你有原始密钥,你可能有兴趣看看苹果提供的-[SecKeyWrapper addPeerPublicKey:keyBits:]
示例。
我有一个库,可以让你创build二进制数据来导入模数和指数的RSA密钥:
https://github.com/StCredZero/SCZ-BasicEncodingRules-iOS
SCZ-BasicEncodingRules-IOS
基本编码规则的实现,以使用指数将RSA密钥导入iOS KeyChain。 代码以ARC为目标iOS 5。
比方说,已经有一个RSA公钥模数和指数作为名为pubKeyModData和pubKeyExpData的variables的NSData。 然后下面的代码将创build一个包含该RSA公钥的NSData,然后您可以将其插入到iOS或OS X钥匙串中。
NSMutableArray *testArray = [[NSMutableArray alloc] init]; [testArray addObject:pubKeyModData]; [testArray addObject:pubKeyExpData]; NSData *testPubKey = [testArray berData];
这将允许您使用Apple CryptoExercise示例中的SecKeyWrapper的addPeerPublicKey:keyBits:方法来存储密钥。 或者,从低级API的angular度来看,您可以使用SecItemAdd()。
NSString * peerName = @"Test Public Key"; NSData * peerTag = [[NSData alloc] initWithBytes:(const void *)[peerName UTF8String] length:[peerName length]]; NSMutableDictionary * peerPublicKeyAttr = [[NSMutableDictionary alloc] init]; [peerPublicKeyAttr setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; [peerPublicKeyAttr setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; [peerPublicKeyAttr setObject:peerTag forKey:(__bridge id)kSecAttrApplicationTag]; [peerPublicKeyAttr setObject:testPubKey forKey:(__bridge id)kSecValueData]; [peerPublicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnPersistentRef]; sanityCheck = SecItemAdd((__bridge CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef *)&persistPeer);