首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS -从exponent+modulus创建SecKeyRef

iOS -从exponent+modulus创建SecKeyRef
EN

Stack Overflow用户
提问于 2011-05-10 05:28:18
回答 2查看 9.6K关注 0票数 12

我想在iPhone上解密一个RSA编码的blob,用指数和模数作为私钥。在Java (使用javax.crypto)中,这可以通过如下代码轻松实现:

代码语言:javascript
复制
// 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 (密钥),只能通过生成密钥对或导入证书来创建,而这是我没有或不需要的。

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

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-10 12:44:22

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

编辑:假设您有原始密钥,您可能会对苹果的-[SecKeyWrapper addPeerPublicKey:keyBits:]示例provided感兴趣。

票数 1
EN

Stack Overflow用户

发布于 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密钥链中。

代码语言:javascript
复制
NSMutableArray *testArray = [[NSMutableArray alloc] init];
[testArray addObject:pubKeyModData];
[testArray addObject:pubKeyExpData];
NSData *testPubKey = [testArray berData];

这将允许您使用苹果CryptoExercise示例中的SecKeyWrapper中的addPeerPublicKey:keyBits:方法来存储密钥。或者,从低级API的角度来看,您可以使用SecItemAdd()。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5942712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档