2012-10-17 50 views
4

我试图从一个已经生成的密钥对(两个SecKeyRef s)中提取1024位RSA公钥,以便通过线路发送它。我需要的只是一个普通的(modulus, exponent)对,它应该占用131个字节(128为模数,3为指数)。iOS SecItemCopyMatching RSA公钥格式?

但是,当我取的关键信息作为NSData对象,我得到140位,而不是131.下面是一个例子结果:

<30818902 818100d7 514f320d eacf48e1 eb64d8f9 4d212f77 10dd3b48 ba38c5a6 
ed6ba693 35bb97f5 a53163eb b403727b 91c34fc8 cba51239 3ab04f97 dab37736 
0377cdc3 417f68eb 9e351239 47c1f98f f4274e05 0d5ce1e9 e2071d1b 69a7cac4 
4e258765 6c249077 dba22ae6 fc55f0cf 834f260a 14ac2e9f 070d17aa 1edd8db1 
0cd7fd4c c2f0d302 03010001> 

重试之后,密钥生成几次,比较所产生的NSData对象,保持不变的所有密钥的字节是第一个7:

<30818902 818100> 

最后三个字节看起来像指数(65537,一个共同的价值)。还有两个字节的“模数”和指数之间:

<0203> 

有人更加密的经验可以帮我鉴定一下编码是什么? DER?我如何正确解码模数和指数?

我试着手工剥出使用

NSData* modulus = [keyBits subdataWithRange:(NSRange){ 7, 128 }]; 
NSData* exponent = [keyBits subdataWithRange:(NSRange){ 7 + 128 + 2, 3 }]; 

系数和指数,但试图解密使用“钥匙”的远程主机编码数据时,我得到的错误。

编辑:

这是我结束了使用解开RSA BLOB的解决方案的要点是:https://gist.github.com/vl4dimir/6079882

+0

这是此共同ASN.1 RSA公钥格式的DER编码: 'RSAPublicKey :: = SEQUENCE { 模量INTEGER - , - N publicExponent INTEGER - 电子 }' 见[PKCS -1](http://tools.ietf.org/html/rfc3447#appendix-A.1.1) –

回答

2

假设你要解决的iOS下工作,请看看this thread。该帖子确认编码是DER,并显示如何从开始的NSData对象中提取指数和模数。

还有另一种解决方案不适用于iOS,但可用于在this thread中安装OpenSSL的Desktop系统(包括MacOS X)。即使您正在寻找仅支持iOS的解决方案,您仍然可以使用它来验证您的代码是否正常工作。

+0

谢谢。基本上,他的代码返回与我使用的蛮力解决方案相同的密钥,所以问题必须在我的代码中的其他位置。 –