来自xml数据文件的Gen公钥,使用M2Crypto进行签名验证

时间:2009-12-14 10:21:33

标签: xml key rsa public m2crypto

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

有什么想法吗?

3 个答案:

答案 0 :(得分: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值,所以这不是你问题的完整答案。

答案 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