2

私はxml形式のpubキーを持っています:

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

だから私はこのようなthmsを試してみます:

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のドキュメントにはenOpenSSL 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 値を作成する方法を調べていないため、これはあなたの質問に対する完全な回答ではありません。

于 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)

16 進数を 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

これは古くからの質問であることは承知していますが、このトピックに関する検索では今でも多く表示されるので、2 セント追加します。PyVEP プロジェクトにはまさにこの機能が必要でした。ここに書いた関数を見つけることができます: https://github.com/mozilla/PyVEP/blob/master/vep/jwt.py#L242

于 2012-01-05T22:29:20.453 に答える