11

私はopensslで秘密鍵/公開鍵を作成し、いくつかのデータに署名しました:

openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
echo 'data to sign' > data.txt
openssl dgst -md5 < data.txt > hash
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash  > signature

今Pythonで、私はこのデータを検証しようとしています:

pubKey = open('public.pem').read()
data = open('data.txt').read()
signature = open('signature').read()

from Crypto import PublicKey
key = PublicKey.RSA.importKey(pubKey)
pub = key.publickey()
hash = MD5.new(data).hexdigest()
# here, hash is same, as contents of 'hash' file
print pub.verify(hash, signature) # <-- here

問題は、pub.verify2 番目のパラメーターが大きな数を持つ 1 つの要素のリストであることを期待することです。signatureファイル内のバイナリデータをこの整数に変換する方法がわかりません。pycrypto に関するすべての例は、pycrypto から生成された署名を示しており、形式key.sign()で正しい署名を生成します(1832273432...2340234L, )。しかし、外部署名の使用方法がわかりません。

これが必要な場合は、以下に追加情報を示しますが、解釈方法が正確にはわかりません。

簡単な技術情報:

  • デジタル署名の形式: PKCS#7 “Signed-Data”</li>
  • 公開鍵手続き:DSS
  • キーの長さ: 512 ~ 1024 ビット
  • 公開指数: 2 +1
  • 公開鍵形式: X.509 v3 証明書
  • MD (メッセージ ダイジェスト) アルゴリズム: MD5 または RIPEMD-160 16
4

4 に答える 4

8

Crypto.Signatureモジュールはあなたが望むものですCrypto.Signature.PKCS1_v1_5ドキュメントから:

key = RSA.importKey(open('pubkey.der').read())
h = SHA.new(message)
verifier = PKCS1_v1_5.new(key)
if verifier.verify(h, signature):
   print "The signature is authentic."
else:
   print "The signature is not authentic."
于 2012-05-13T07:10:34.200 に答える
0

これが解決策です。

from Crypto.Util import number
signature  = number.bytes_to_long(signature) #Convert the signature to long
print pub.verify(hash, (signature,) ) #Pass tuple to verify
于 2011-08-26T09:00:33.353 に答える
-1

この投稿はあなたに最良の答えを与えます。 Python で RSA SHA1 署名を検証するにはどうすればよいですか?

pycrypto は、OpenSSL によって作成された署名を検証できませんでした。M2Crypto を試すことができます。

于 2011-07-12T05:48:33.903 に答える