2013-03-14 17 views
5

で復号化し、私は官民の鍵ペアを生成するには、以下のJavaコードを持っていると仮定しますRSA暗号、PHP

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/414414DERファイルをPEM(私はまた、公開鍵をJavaから保存すると仮定して)に変換する機能を提供しています。

私のようなものを試してみました:

$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はパブリックキーについて知っています。パブリックキーは、メッセージの復号化と検証に使用する必要があります。

私はここでこの問題に関する多くの記事を読んだことがありますが、これはちょっとした問題です。特に使用されるアルゴリズムが異なる場合などです。重複

ご意見をいただければ幸いです!あなたは間違ったものを解読することです公開鍵を、参照しているように見えますスニペット

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

から

+2

"メッセージは正常に復号化されますが、それは奇妙な文字です。" - あなたはそれについてより具体的になりますか?それは単純にエンコードの問題でしょうか? –

+1

デコードされたメッセージは元のテキストのように見えるか、または完全に文字化けしていますか? –

+0

JavaとPHPの間で送信されたメッセージを確認しようとしていますか、それとも暗号化していますか?または両方? –

答えて

3

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

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

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

+0

ありがとうございました!署名は様々なHTTPヘッダとその値に基づいているので、これをサーバ側でまとめて、署名が有効かどうかを確認することができます: 'openssl_verify(" Hello、World "、file_get_contents( 'sig')、$ pubkey) '。そして、それは動作します;-) – DavidS

+0

私は同じ質問....を持っていると思うが、openssl_verify()は私のために働いていない.... [質問のリンク](http://stackoverflow.com/questions/16370046/use -php-openssl-verify-function-to-verify-signature-and-data-by-androi)事前に感謝してください – shanwu

-1

。ダブルチェック?

+0

それは署名検証です。 – Henrik

+0

署名検証ですか、はい、サーバーは秘密鍵を知るべきではありません。 – DavidS