Iphone iOS-从指数+;模数

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

我想在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(密钥)

有没有办法手动创建具有模数+指数的键?如果是的话,你能告诉我怎么做吗


提前感谢

您的指数和模数是如何编码的?如果它们在一个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);