Общий открытый ключ из файла данных xml с использованием M2Crypto для проверки подписи - PullRequest
2 голосов
/ 14 декабря 2009

У меня есть ключ pub в формате 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 ]

3 голосов
/ 14 декабря 2009

Документация 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. Я не изучал, как создать действительные значения MPINT OpenSSL, так что это не полный ответ на ваш вопрос.

0 голосов
/ 16 августа 2012

Я прочитал исходный код 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))
0 голосов
/ 06 января 2012

Я знаю, что это древний вопрос, но он все еще часто встречается в поисках по этой теме, поэтому я добавляю свои два цента. Мне нужна была именно эта функциональность для проекта PyVEP, и вы можете найти функцию, которую я написал здесь: https://github.com/mozilla/PyVEP/blob/master/vep/jwt.py#L242

...