2

我有 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

有任何想法吗?

4

3 回答 3

4

RSA.new_pub_key文档声明并且需要采用 OpenSSL MPINT 格式(4 字节大端位计数后跟适当的位数)看起来至少你不是那种格式。如果您查看test_rsa.py,您会看到以下评论:ene

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

看来你e只是'\001\000\001'。如果我们在其前面添加 '\000\000\000\003',您的示例应用程序会更进一步,但尝试设置n. 我尚未研究如何创建有效的 OpenSSL MPINT 值,因此这不是您问题的完整答案。

于 2009-12-14T18:52:31.017 回答
0

我阅读了 M2Crypto 源码,发现有m2PyObject。

//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))
于 2012-08-16T16:43:37.267 回答
-1

我知道这是一个古老的问题,但它仍然在这个主题的搜索中出现很高,所以我加了两分钱。我需要 PyVEP 项目的这个功能,你可以在这里找到我写的功能: https ://github.com/mozilla/PyVEP/blob/master/vep/jwt.py#L242

于 2012-01-05T22:29:20.453 回答