iOS SecItemCopyMatching RSA公钥格式是什么?

5
我正在尝试从已生成的密钥对(两个SecKeyRef)中提取一个1024位RSA公钥,以便通过网络发送。我只需要一个简单的(modulus, exponent) 对,应该占用131字节(128字节用于模数,3字节用于指数)。
然而,当我将密钥信息作为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

这是常见的ASN.1 RSA公钥格式的DER编码:`RSAPublicKey :: = SEQUENCE {           modulus INTEGER, - n          publicExponent INTEGER - e}`请参见[PKCS-1](http://tools.ietf.org/html/rfc3447#appendix-A.1.1) - President James K. Polk
1个回答

2
假设您想让解决方案在iOS下运行,请参考此线程。该帖子确认编码为DER,并显示了如何从您开始使用的NSData对象中提取指数和模数。
还有另一种解决方案,适用于桌面系统(包括MacOS X)中已安装OpenSSL的这个线程。即使您正在寻找仅适用于iOS的解决方案,您仍然可以使用它来验证代码是否正确工作。

谢谢。基本上,他的代码返回与我使用的暴力解决方案相同的密钥,因此问题必须在我的代码的其他地方。 - Vladimir Mitrovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接