iOS SecItemCopyMatching RSA公钥格式?

我试图从一个已经生成的密钥对(两个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> 

有更多的encryption经验的人可以帮助我确定这是什么编码? DER? 我如何正确解码模数和指数?

我尝试手动剥离模数和指数使用

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

但是当试图解密使用那个“密钥”编码的远程主机的数据时,我得到错误。

编辑:

这是我最终用来解压缩RSA blob的解决scheme的一个要点: https : //gist.github.com/vl4dimir/6079882

假设你想要解决scheme在iOS下工作,请看看这个线程 。 该post确认编码是DER,并展示了如何从你开始的NSData对象中提取指数和模数。

还有另外一种解决scheme在iOS上不起作用,但是可以在安装了OpenSSL的桌面系统(包括MacOS X)上运行。 即使您正在寻找仅支持iOS的解决scheme,仍然可以使用它来validation代码是否正常工作。