Iphone iOS-从指数+;模数
我想在iPhone上解密一个RSA编码的blob,使用指数和模作为私钥。在Java中(使用javax.crypto),这可以通过以下代码轻松实现:Iphone iOS-从指数+;模数,iphone,ios,security,rsa,Iphone,Ios,Security,Rsa,我想在iPhone上解密一个RSA编码的blob,使用指数和模作为私钥。在Java中(使用javax.crypto),这可以通过以下代码轻松实现: // 1) key RSAPublicKeySpec keySpec = new RSAPublicKeySpec(myModulus, myPublicExponent); KeyFactory fact = KeyFactory.getInstance("RSA"); Key pubKey = fact.generatePublic(keySpe
// 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(密钥)
有没有办法手动创建具有模数+指数的键?如果是的话,你能告诉我怎么做吗
提前感谢您的指数和模数是如何编码的?如果它们在一个blob中,您可以使用
SecPKCS12Import()
和SecIdentityCopyPrivateKey()
来实现您想要的
编辑:假设您有原始密钥,您可能有兴趣查看Apple提供的
-[SecKeyWrapper addPeerPublicKey:keyBits:][/code>示例。我有一个库,可以让您创建二进制数据,以导入模数和指数形式的RSA密钥:
SCZ基本编码规则
实现基本编码规则,以便将RSA密钥导入iOS
使用指数键链。代码以带ARC的iOS 5为目标
假设你已经有了一个从
RSA公钥作为名为pubKeyModData和
pubKeyExpData。然后,下面的代码将创建一个包含该RSA的NSData
公钥,然后可以将其插入iOS或OS X密钥链
NSMutableArray *testArray = [[NSMutableArray alloc] init];
[testArray addObject:pubKeyModData];
[testArray addObject:pubKeyExpData];
NSData *testPubKey = [testArray berData];
这将允许您使用Apple CryptoExecute示例中SecKeyWrapper中的addPeerPublicKey:keyBits:方法存储密钥。或者,从低级API的角度来看,可以使用SecItemAdd()
谢谢我的指数和模没有编码,它们只是存储在内存中的大整数,无论是大的还是小的endian。谢谢,这个例子看起来不错,但是我找不到任何关于导入密钥的预期格式的文档(这只是一组不清楚的592位);指数是如何编码的,它是在模数之后还是之前,等等。有关于这方面的文档吗?并且可以用于interchange@SedateAlien我还是有点困惑。在我的例子中,它是一个公钥,指数和模的形式如下:yOTe0L1/NCbXDZYdlis82MiTe8VD5WD23S4RDsebJOFzCLbsyb4d+K1M5FB+xPfCkji1zQjPijiToZ7JSj/2ww==AWAB
我如何从中获取公钥?@pixelfeak..你的查询得到答案了吗?我也有同样的问题。如果你有一些示例代码/链接plz可以帮助我,你能给我同样的指导吗?我尝试了berData
,得到的公钥与我在.NET实现中得到的公钥不同。你确定这个有效吗?我已经成功地使用了它。你能提供更多的上下文信息吗?我有。。指数和模数作为android guy的字符串,我是否需要使用:dataUsingEncode:NSUTF8StringEncoding来获取pubKeyModData和pubKeyModData?
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);