2009-12-14 69 views
2

我在XML格式酒馆键:根公钥

<RSAKeyValue><Modulus>xF9y25EXh8n99sXtU/JAsYTwML6PB7gSCE8tWw8Www2KBfDqohQBL8FMs8jzsDQa7WwoEmiVJ1resEC9YXJGbwQyWgb9qgooC9oSnCB/TkRdBybwby0DKuZOzq+609OBGkwWpgnS4QVCBc6eW+10l3qE3/2hKdcSV+08iRYp7zs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue> 

所以我尽量的三卤甲烷是这样的:

from M2Crypto import RSA 
from xml.dom.minidom import parseString 
import base64 

dom = parseString(pubKey) 
e = base64.b64decode(dom.getElementsByTagName('Exponent')[0].childNodes[0].data) 
n = base64.b64decode(dom.getElementsByTagName('Modulus')[0].childNodes[0].data) 
rsa = RSA.new_pub_key((e, n)) 

遇到错误:

... 
    rsa = RSA.new_pub_key((e, n)) 
    File "/usr/lib/pymodules/python2.6/M2Crypto/RSA.py", line 390, in new_pub_key 
    m2.rsa_set_e(rsa, e) 
M2Crypto.RSA.RSAError: invalid length 

有什么想法?

回答

3

RSA.new_pub_key文档指出en需要在OpenSSL的MPINT格式(4字节大端比特计数,随后的位的适当数量)。好像至少你的e不是这种格式。如果你看看test_rsa.py,你可以看到评论说,说:

'\000\000\000\003\001\000\001' # aka 65537 aka 0xf4 

看来你e只是 '\ 001 \ 000 \ 001'。如果我们在它前面添加'\ 000 \ 000 \ 000 \ 003',您的示例应用程序会稍微进一步,但尝试设置n时失败。我没有看过如何创建有效的OpenSSL MPINT值,所以这不是对你的问题的完整答案。

0

我读了M2Crypto源文件,发现有m2 PyObject。

//I think these is hex. 
e = base64.b64decode(dom.getElementsByTagName('Exponent')[0].childNodes[0].data) 
n = base64.b64decode(dom.getElementsByTagName('Modulus')[0].childNodes[0].data) 

变化十六进制MPI

from M2Crypto import m2 
bnE=m2.hex_to_bn(e) 
bnN=m2.hex_to_bn(n) 

e=m2.bn_to_mpi(bnE) 
n=m2.bn_to_mpi(bnN) 

完成!

rsa = RSA.new_pub_key((e, n))