我有xml格式的pub键:
<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
有什么想法吗?
答案 0 :(得分:3)
RSA.new_pub_key文档指出e
和n
需要采用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值,所以这不是你问题的完整答案。
答案 1 :(得分: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)
将hex更改为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))
答案 2 :(得分:-1)
我知道这是一个古老的问题,但它在这个主题的搜索中仍然表现得很高,所以我加了两分钱。我需要PyVEP项目的这个功能,你可以找到我在这里写的函数:https://github.com/mozilla/PyVEP/blob/master/vep/jwt.py#L242