5

公開鍵と秘密鍵のペアを生成する次の Java コードがあるとします。

KeyPairGenerator generator = KeyPairGenerator.getInstance ("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

generator.initialize (1024, random);

KeyPair pair = generator.generateKeyPair();
RSAPrivateKey priv = (RSAPrivateKey)pair.getPrivate();
RSAPublicKey pub = (RSAPublicKey)pair.getPublic();

// Sign a message
Signature dsa = Signature.getInstance("SHA1withRSA");
dsa.initSign (priv);
dsa.update ("Hello, World".getBytes(), 0, "Hello, World".length());

byte[] out = dsa.sign();
/* save the signature in a file */
FileOutputStream sigfos = new FileOutputStream("sig");
sigfos.write(out);
sigfos.close();

PHPでファイル「sig」をどのように解読して復号化しますか? ファイルを変換する関数を提供する投稿を読みました: https://stackoverflow.com/a/1662887/414414 (Java から公開鍵も保存すると仮定します)。DERPEM

私は次のようなことを試しました:

$key = openssl_pkey_get_public ("file://pub_key.pem");
$data = null;
openssl_public_decrypt ( file_get_contents ("sig"), $data, $key);
echo $data, "\n";

メッセージは正常に復号化されますが、多くの奇妙な文字が含まれています。

私たちのシナリオは、メッセージを PHP サーバーに送信する Java クライアントですが、秘密鍵でデータを暗号化します。PHP は、メッセージの復号化と検証に使用する公開鍵を認識しています。

SO でこの問題に関する多くの投稿を読みましたが、特に異なるアルゴリズムが使用されている場合など、これは少し具体的な問題であることに気付きました。これが重複している可能性がある場合は申し訳ありません。

どんなフィードバックでも大歓迎です!

4

2 に答える 2

3

PKCS#1 のような公開鍵プロトコルもパディング スキームを指定し、すべての署名スキームはメッセージの代わりにメッセージのダイジェストを暗号化するため、「RSA 署名」は通常、「秘密鍵で暗号化し、公開鍵で復号化する」以上のものです。完全なメッセージ。Java の署名スキームが PKCS#1 で指定された署名パディング スキームを使用している場合、ドキュメントは見つかりませんが、そうではないかと疑っています。

そうである場合は、ここopenssl_verifyに記載されている PHPのメソッドを代わりに使用することをお勧めします。これは、署名が無効または有効な場合、それぞれ 0 または 1 を返します。

Java がパディング スキームを使用しない場合、問題は、署名で暗号化されたデータが、メッセージ自体ではなく、メッセージのハッシュであるということです (Java コードで、SHA-1 ハッシュを使用していることがわかります)。アルゴリズム)。したがって、PHP 側では、sha1 メソッド$raw_outputtrue に設定してメッセージの sha1 ハッシュを取得し、それらの文字列を比較して、メッセージが有効であることを確認する必要があります。

于 2013-03-14T16:34:07.413 に答える
-1

スニペットから

$key = openssl_pkey_get_public ("file://pub_key.pem");

公開鍵を参照しているように見えますが、これは解読するのに間違ったものです。ダブルチェック?

于 2013-03-14T14:19:43.070 に答える