2017-03-18 8 views
1

私はPHPにjava decrypterコードを移植しています。 - それはAES/CBC/NoPadding(128) アルゴでデータを暗号化していますJava javax.cryptoとPHP openssl_decryptが同一ではありません

  • encrypted.data: は、私は3つのファイルを持っています。
  • aes.key - 秘密鍵です。
  • initialization.vector - それは初期化ベクトル

は、私が解読されたデータのためのJava持つjavax.cryptoパッケージの使用AES/CBC/NoPadding(128)アルゴリズムで使用link

でこちらを見ています。

  • のOpenSSLライブラリのバージョン2.4.4 LibreSSL
  • OpenSSLのヘッダーバージョン2.4.4 LibreSSL
:PHPで私はopensslの拡張

PHPバージョン7.1.0 PHP情報(OpenSSLを)使用します

私のコード例:

マイ・ジャワ・コード:

0必要に応じて

マイポータブルPHPコード

<?php 
$AesKeyData = file_get_contents('./Cipher2PHP/aes.key'); 
$InitializationVectorData = file_get_contents('./Cipher2PHP/initialization.vector'); 
$EncryptedData = file_get_contents('./Cipher2PHP/encrypted.data'); 
$decrypted = openssl_decrypt(
    $EncryptedData, 
    'AES-128-CBC', 
    $AesKeyData, 
    OPENSSL_NO_PADDING, 
    $InitializationVectorData 
); 
printf("Your data: %s\n", $decrypted); 

Javaコードは動作します。 PHPコードは、不一致で動作します。

Javaコード出力:

Your data: My very secure data. Very secure 
Process finished with exit code 0 

PHPコード出力:

Your data: �j��2��䈤�n�h�/sEH�,/-��-�^[ 
Process finished with exit code 0 

Base64でエンコードされたDATAS:

PHP:

Base64 AES Key:     "Kl/LF5HSL7YCRbPYNp7QssJzcVY/vx88nt9rEYJaXQo=" 
Base64 InitializationVector: "QXF/8HO4te38LhhuFP9+hA==" 
Base64 EncryptedData:   "eA1w+ysqsHIdaXsQRSgt9nLPDj7ILcqyZdCW3wDBcy0=" 
Decrypted Result:    "xmqJ0TKgx+SIpP1u/hNoyS9zRUjEAAEsLy251S2hXls=" 

ジャワ:

コンソールで
Base64 AES Key:     "Kl/LF5HSL7YCRbPYNp7QssJzcVY/vx88nt9rEYJaXQo=" 
Base64 InitializationVector: "QXF/8HO4te38LhhuFP9+hA==" 
Base64 EncryptedData:   "eA1w+ysqsHIdaXsQRSgt9nLPDj7ILcqyZdCW3wDBcy0=" 
Decrypted Result:    "TXkgdmVyeSBzZWN1cmUgZGF0YS4gVmVyeSBzZWN1cmU=" 

ファイル:

./Cipher2PHP mac$ file -I * 
aes.key:    application/octet-stream; charset=binary 
initialization.vector: application/octet-stream; charset=binary 
encrypted.data:  application/octet-stream; charset=binary 
./Cipher2PHP mac$ xxd aes.key 
0000000: 2a5f cb17 91d2 2fb6 0245 b3d8 369e d0b2 *_..../..E..6... 
0000010: c273 7156 3fbf 1f3c 9edf 6b11 825a 5d0a .sqV?..<..k..Z]. 
./Cipher2PHP mac$ xxd initialization.vector 
0000000: 4171 7ff0 73b8 b5ed fc2e 186e 14ff 7e84 Aq..s......n..~. 
./Cipher2PHP mac$ xxd encrypted.data 
0000000: 780d 70fb 2b2a b072 1d69 7b10 4528 2df6 x.p.+*.r.i{.E(-. 
0000010: 72cf 0e3e c82d cab2 65d0 96df 00c1 732d r..>.-..e.....s- 
./Cipher2PHP mac$ xxd -b aes.key 
0000000: 00101010 01011111 11001011 00010111 10010001 11010010 *_.... 
0000006: 00101111 10110110 00000010 01000101 10110011 11011000 /..E.. 
000000c: 00110110 10011110 11010000 10110010 11000010 01110011 6....s 
0000012: 01110001 01010110 00111111 10111111 00011111 00111100 qV?..< 
0000018: 10011110 11011111 01101011 00010001 10000010 01011010 ..k..Z 
000001e: 01011101 00001010          ]. 
./Cipher2PHP mac$ xxd -b initialization.vector 
0000000: 01000001 01110001 01111111 11110000 01110011 10111000 Aq..s. 
0000006: 10110101 11101101 11111100 00101110 00011000 01101110 .....n 
000000c: 00010100 11111111 01111110 10000100     ..~. 
./Cipher2PHP mac$ xxd -b encrypted.data 
0000000: 01111000 00001101 01110000 11111011 00101011 00101010 x.p.+* 
0000006: 10110000 01110010 00011101 01101001 01111011 00010000 .r.i{. 
000000c: 01000101 00101000 00101101 11110110 01110010 11001111 E(-.r. 
0000012: 00001110 00111110 11001000 00101101 11001010 10110010 .>.-.. 
0000018: 01100101 11010000 10010110 11011111 00000000 11000001 e..... 
000001e: 01110011 00101101 
+2

両方の出力を提供できますか?あなたのIV/Keyはどのフォーマットですか?結果をJavaの文字列に変換するのではなく、両方でbase64として出力してみてください。バイナリデータと文字列は、幸せな暗号化を行いません。 –

+2

ええ、どれが期待する出力を提供していますか?入力(キー、iv、暗号文/暗号文)も同様に役立ちます。それ以外の場合は、適切なコードを特定できないため、これをトピックとしてクローズする必要があります。 –

+0

私はbase64データを追加しました。 –

答えて

2

Javaでは、AESのバージョンは(128、192または256ビット)を使用するためには、正確に一つでなければならないあなたが提供するキーの長さによって決定されますそれらの長さの。

PHPでは、メソッド引数に使用するAESのバージョンをopenssl_decryptまたはopenssl_encryptに明示的に指定します。 "aes-128-cbc" PHPはあなたが提供するキーをゼロバイトで切り捨てるか、または必要な長さになるように拡張します。

JavaコードがAES-256を使用するように、32バイト(256ビット)のキーを使用しています。しかし、あなたのPHPコードでは 'AES-128-CBC'が指定されているので、異なるバージョンを使用しています。

PHPバージョンをJavaバージョンのように動作させるには、呼び出しのメソッド文字列をopenssl_decryptから'aes-256-cbc'に変更します。

JavaバージョンをPHPバージョンのように動作させるには(私はこれをやりたいとは思わないが、完全性のためにインクルードする)、キーの最初の16バイトをコピーして、 SecretKeySpecオブジェクトです。

+1

Thanx!はい、私の鍵は256バイトです!そしてJavaは、AES 256 CBC algoを使用して、私は愚かです... –

+0

ありがとう、あなたの助けをありがとう、私は本当にそれを感謝します! –

関連する問題