2

.Net RSACryptoServiceProviderで署名されたメッセージを受け取りました。メッセージは、m2crypto(opensslベースのlib)で署名を検証しようとするPythonソフトウェアに送信されます。

メッセージが署名された秘密鍵のペアである公開証明書を持っています。

.Netソフトウェアがsingを送信する前に、ByteArrayToStringを使用して変換します。これは、符号が次のコードで生成されるためです。

  //Convert plain text into a byte array to sign.
   byte[] data = new UTF8Encoding().GetBytes(phrase);
   SHA1Managed sha1 = new SHA1Managed();
   byte[] hashBytes = sha1.ComputeHash(data); 

   byte[] sig = csp.SignData(hashBytes, CryptoConfig.MapNameToOID("SHA1")); 

したがって、受信者に送信される署名は

ByteArrayToString(sig)

Pythonの部分は次のとおりです。

   def verify(message, signature, cert_path):
      msg = hashlib.sha1(message).hexdigest()
      certificate = M2Crypto.X509.load_cert(cert_path)
      pubkey = certificate.get_pubkey()
      pubkey.reset_context(md='sha1')
      pubkey.verify_init()
      pubkey.verify_update(msg)
      sgn = signature.decode('base64')
      is_verified = pubkey.verify_final(sgn)

そして、検証を取得できません... Python部分の署名エンコーディングに問題がある可能性があると思いますが、誰かがここで他のバグを見ることができるかもしれませんか?

自分の証明書(opensslで生成されたもの)を使用してPython自体からのメッセージに署名し、署名をエンコードして送信し、デコードしてすべてが正常に機能していることを確認する場合...

コメントをいただければ幸いです。

4

1 に答える 1

0

m2cryptoを使用したことがないため、回答を保証することはできませんが、メッセージは2回ハッシュされていると思います。の

sha1.ComputeHash(data)

csp.SignData(hashBytes、CryptoConfig.MapNameToOID( "SHA1"))

に関するMSDNドキュメントでは、次のことをSignData指定しています。

指定されたハッシュアルゴリズムを使用して指定されたバイト配列のハッシュ値を計算し、結果のハッシュ値に署名します。

したがって、署名を作成する前にメッセージを事前にハッシュする必要はないと思います。

于 2012-01-06T18:03:51.123 に答える