4

Pythonで実行されているサーバーがあり、m2cryptoを使用してメッセージsha256ダイジェストに署名しています。openssl CLIによって生成された公開および秘密RSAキーを使用しています。サーバー側では、すべてが問題ありません
Pythonコード:

privateKey = M2Crypto.RSA.load_key (sys.argv[2])
signedDigest = privateKey.sign (ダイジェスト、「sha256」)

署名が適切であることを再確認します。

pubKey = M2Crypto.RSA.load_pub_key("key.pub.pem")
if pubKey.verify(digest, signedDigest, 'sha256') (など....)

署名済みの sha256 ダイジェストをファイルに保存し、元のメッセージと共にクライアントに送信します。
クライアント側では、c++ vc6 で実行され、署名済みの sha256 ダイジェスト (バイナリとして) と署名済みのメッセージを読み込みます。ここでの目的は、署名付きの sha256 と共にメッセージを検証することです。静的リンクとして cryptopp を使用していますが、sha256 を計算し、Python の sha256 と比較して同じ結果を得ることができるため、正常に動作することがわかっています。コードは次のとおりです。

RSA::公開鍵 pubKey;
pubKey.Load( FileSource(LicenseControl::pubKeyPath, true));
RSASS< PKCS1v15, SHA >::検証者 検証者(pubKey);
//shaDigest は新しく計算された sha256、signatureByte はサーバーから受信したメッセージの署名です。
result = verifier.VerifyMessage( shaDigest, CryptoPP::SHA256::DIGESTSIZE, signatureByte, 512);

これはコンパイルして実行しますが、常に false を返します。署名が有効であることを確認するために、openssl CLI を直接使用して検証しました (m2crypto python ラッパー経由ではありません)。

openssl dgst -sha256 -verify key.pub.pem -signature sign original_file
検証済み OK

これにより、署名された sha256 ダイジェストが問題なく、公開鍵を使用してメッセージを正常に検証できることが確認されます。DER および PEM 形式を認識しています (openssl には PEM、cryptop には DER を使用)。したがって、公開鍵は正しいと思います。今私の問題は、暗号化ライブラリを使用して署名を検証する方法です??? 私はドキュメントを読みましたが、何日も経った後でも、まだ中国語のように見えます. 私は次のようなことを試しました

RSASS< PSSR、SHA >::Verifier verifier(pubKey);

PSSR を使用して Python コードで暗号化しますが、運はありません...署名された sha256 ダイジェストを公開鍵でのみ復号化し、受信ファイルから計算された新しい sha256 ダイジェストと比較することを検討しています。しかし、その単純でさえ、ドキュメントには見つかりませんでした...ベリファイアを適切に使用する方法はありますか?
公開鍵を使用して復号化する方法は? 前の質問が解決できない場合

4

1 に答える 1

1

ここで私が思う2つの問題:

まず、SHA inRSASS< PKCS1v15, SHA >は SHA_256 ではなく SHA-1 を意味します。SHA256代わりにここが欲しいでしょう。

また、VerifyMessageハッシュだけでなく、メッセージ全体を取得します。ハッシュは内部で計算されます。したがって、メッセージを検証しようとしているとき、実際には (Crypto++ に関する限り) SHA-1(SHA-256(msg)) を検証しようとしているため、当然失敗します。余分な SHA-256 計算をスキップして、代わりに実際のメッセージ全体を渡します。

于 2011-06-30T19:39:52.007 に答える