ここでラースに感謝します:http://blog.oddbit.com/2011/05/09/signing-data-with-ssh-agent/
e
long
公開指数
のPythonです。パブリックModulusn
のPythonです。long
彼が投稿したコードは次のとおりです。
import M2Crypto
key = M2Crypto.RSA.new_pub_key((
M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hex(e)[2:])),
M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hex(n)[2:])),
))
hexは、ある種のhex文字列を生成する0xA45E
ため、。の後にすべてを取得しているだけ0x
です。
私はファイルからキーを読んでいるので、それほど長くはありません。私は最終的に以下を使用しました:
import M2Crypto
from binascii import hexlify
e = f.read(4)
n = f.read(0x80)
key = M2Crypto.RSA.new_pub_key((
M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hexlify(e))),
M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hexlify(n))),
))
チャームのように働いた!
new_pub_key
ドキュメントによると、受け入れられる形式は次のようになります。
OpenSSLのMPINT形式-4バイトのビッグエンディアンビットカウントとそれに続く適切なビット数
これがタイプミスかどうかはわかりませんが、私の指数(16進数)00010001
は最終的には。になり000003010001
ました。ビット数ではなく、バイト数だと思います。また、最初の0x00を削除しました。それが標準なのか、それとも空のバイトだったのかはわかりません。
編集:私はフォーマットについて少しよく理解していると思います。
最初のバイトが負の場合、最初にゼロバイトが追加されます。先頭の(最初に)ゼロバイトがある場合、最初のバイトが負になる場合を除いて、それらは削除されます。負になる場合は、ゼロバイトが1つだけ残ります。
いくつかの例:
書式なし:
\ x23 \ x24 \ x25 \ x26
フォーマット済み:
\ x00 \ x00 \ x00 \ x04 \ x23 \ x24 \ x25 \ x26
説明:
そのままの文字列とパックされたバイト数
書式なし:
\ x00 \ x23 \ x55 \ x35
フォーマット済み:
\ x00 \ x00 \ x00 \ x03 \ x23 \ x55 \ x35
説明:
先行ゼロバイトが削除され、バイトカウントが3になりました
書式なし:
\ x80 \ x43 \ x55 \ x27
フォーマット済み:
\ x00 \ x00 \ x00 \ x05 \ x00 \ x80 \ x43 \ x55 \ x27
説明:
\ x80が負であるため、先行ゼロバイトが追加されました
書式なし:
\ x00 \ xff \ x43 \ x23
フォーマット済み:
\ x00 \ x00 \ x00 \ x04 \ x00 \ xff \ x43 \ x23
説明:
\ xffが負であるため、先行ゼロバイトが残っています
書式なし:
\ x23 \ x53 \ 66 \ x00
フォーマット済み:
\ x00 \ x00 \ x00 \ x04 \ x23 \ x53 \ 66 \ x00
説明:
文字列の末尾のゼロバイト