1

公開指数と係数を含むファイルがあります。それらはpem、xml、またはder形式ではなく、オフセットで書き込まれた値にすぎません。

M2Cryptoを使用してそれらから公開鍵を作成するにはどうすればよいですか?同じ形式の秘密鍵も持っています。誰かがここStackoverflowに投稿したコードを使用して、phpでPEMファイルを生成することができましたが、これは非常にばかげた方法のようです。

これも1回限りのことではありません。署名を確認するには、この形式のファイルから公開指数とモジュラスを読み取れる必要があります。

4

1 に答える 1

2

ここでラースに感謝します:http://blog.oddbit.com/2011/05/09/signing-data-with-ssh-agent/

elong公開指数 の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
説明:
文字列の末尾のゼロバイト
于 2012-04-29T00:04:52.273 に答える