2011-05-09 65 views
12

我想通过将指数和模数作为私钥在iPhone上解密RSA编码的blob。在Java(带javax.crypto中),这可以很容易地通过这样的代码来实现:iOS - 从指数+模数创建SecKeyRef

// 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(键)比生成一对或导入其他证书,我没有/想要。

有没有办法创建一个手动模数+指数的密钥?如果是这样,你能给我一些线索吗?

在此先感谢

+1

我有同样的问题。如果你有一些示例代码/链接plz帮助我,你能指导我吗? – 2012-12-03 11:14:31

回答

1

如何你的指数和模数编码?如果他们在PKCS#12 blob中,则可以使用SecPKCS12Import()SecIdentityCopyPrivateKey()来实现您想要的。

编辑:既然你有原始的钥匙,你可能会感兴趣的看着苹果的-[SecKeyWrapper addPeerPublicKey:keyBits:]例子provided

+0

谢谢。我的指数和模数不是编码的,它们只是存储在内存中的大整数,不管是大还是小的。 – Hashi 2011-05-10 22:41:53

+0

@Hashi:我已经更新了我的答案。 – 2011-05-11 22:27:43

+0

谢谢,这个例子看起来不错,但我找不到任何有关导入密钥的预期格式的文档(它只是一个592位的不明确的集合);指数是如何编码的,在模数之后还是之前等等。有没有关于这个的文档? – Hashi 2011-05-17 09:39:29

1

我有一个图书馆,让你创建的二进制数据导入RSA密钥的模量和现在李氏指数:

https://github.com/StCredZero/SCZ-BasicEncodingRules-iOS

SCZ-BasicEncodingRules-IOS

基本编码规则的实施,使使用指数将RSA密钥导入到iOS KeyChain。代码以ARC为目标iOS 5。

假设您已经有一个模数和指数,从 一个RSA公钥作为名为pubKeyModData和 pubKeyExpData的变量中的NSData。然后,下面的代码将创建一个NSData,其中包含RSA 公钥,然后您可以将其插入到iOS或OS X钥匙串中。

NSMutableArray *testArray = [[NSMutableArray alloc] init]; 
[testArray addObject:pubKeyModData]; 
[testArray addObject:pubKeyExpData]; 
NSData *testPubKey = [testArray berData]; 

这将允许你存储使用addPeerPublicKey的关键在于:从SecKeyWrapper在苹果CryptoExercise实例方法: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); 
+0

我尝试了'berData',结果公钥与我在.NET实现中得到的不同。你确定这有效吗? – pixelfreak 2013-10-20 05:19:54

+0

我已经成功地使用了它。你能提供更多的上下文信息吗? – StCredZero 2013-11-07 20:38:30

+0

我有..指数和模数字符串从一个android的家伙,我需要使用:dataUsingEncoding:NSUTF8StringEncoding获取pubKeyModData和pubKeyModData? – Devarshi 2014-05-14 09:51:39