我想在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,我不能创建SecKeyRef (密钥),只能通过生成密钥对或导入证书来创建,而这是我没有或不需要的。
有没有办法手动创建一个模数+指数的密钥?如果是这样的话,你能给我一个提示吗?
提前感谢
发布于 2011-05-10 12:44:22
你的指数和模数是如何编码的?如果它们位于PKCS#12 blob中,您可以使用SecPKCS12Import()和SecIdentityCopyPrivateKey()来实现您想要的效果。
编辑:假设您有原始密钥,您可能会对苹果的-[SecKeyWrapper addPeerPublicKey:keyBits:]示例provided感兴趣。
发布于 2012-05-18 05:45:09
现在,我有一个库可以让您创建二进制数据来导入模数和指数形式的RSA密钥:
https://github.com/StCredZero/SCZ-BasicEncodingRules-iOS
SCZ-基本编码规则-iOS
实施基本编码规则,以使用指数将RSA密钥导入iOS KeyChain。代码以具有ARC的iOS 5为目标。
假设您已经在名为pubKeyModData和pubKeyExpData的变量中拥有来自RSA公钥的模数和指数作为NSData。然后,以下代码将创建一个包含该RSA公钥的NSData,然后可以将其插入到iOS或OS密钥链中。
NSMutableArray *testArray = [[NSMutableArray alloc] init];
[testArray addObject:pubKeyModData];
[testArray addObject:pubKeyExpData];
NSData *testPubKey = [testArray berData];这将允许您使用苹果CryptoExercise示例中的SecKeyWrapper中的addPeerPublicKey:keyBits:方法来存储密钥。或者,从低级API的角度来看,您可以使用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);https://stackoverflow.com/questions/5942712
复制相似问题