2017-12-28 17 views
-1

一部のデータを暗号化して、PBEWITHSHAAND3-KEYTRIPLEDES-CBCでサードパーティのサービスに送信する必要があります。phpseclibを使用したPBEWITHSHAAND3-KEYTRIPLEDES-CBCによる暗号化

私は第三者によって提供されるこの実施例のJavaコードを、持っている:

String algorithm = "PBEWITHSHAAND3-KEYTRIPLEDES-CBC"; 
String password = "eKhfdPKO54OddrfgghuBGHsA5BGTYHon"; 
byte[] salt = {-87, -101, -56, 50, 86, 52, -29, 3}; 
int iterations = 19; 

String text = "foobar"; 

Provider bouncy = new org.bouncycastle.jce.provider.BouncyCastleProvider(); 
Security.addProvider(bouncy); 

KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterations); 
SecretKey key = SecretKeyFactory.getInstance(algorithm, bouncy).generateSecret(keySpec); 

Cipher cipher = Cipher.getInstance(algorithm, bouncy); 
cipher.init(1, key, new PBEParameterSpec(salt, iterations)); 

System.out.println(new String(Base64.getEncoder().encode(cipher.doFinal(text.getBytes("UTF8"))))); 
// Output: kaxAiR1Qb9s= 

これはphpseclibを使用して、私の(動作しない)PHPコードです:

$hash = 'sha1'; 
$kdf = 'pkcs12'; 
$password = 'eKhfdPKO54OddrfgghuBGHsA5BGTYHon'; 
$salt = chr(-87) . chr(-101) . chr(-56) . chr(50) . chr(86) . chr(52) . chr(-29) . chr(3); 
$iterations = 19; 

$text = "foobar"; 

$cipher = new \phpseclib\Crypt\TripleDES('cbc'); 
$cipher->setPassword($password, $kdf, $hash, $salt, $iterations); 

echo base64_encode($cipher->encrypt($text)); 
// Output: daAlVF+JjNg= 

質問: PHPコードをJavaと同じ出力にするにはどうすればよいですか?

+1

なぜJavaをPHPに変換できるのでしょうか? – Zorkind

+0

あなたのコードには多くの誤りがあります: - \ – Zorkind

+0

私はPHPをjavaに翻訳しようとしていません。私はPHPのものを暗号化しようとしています。 Javaコードは第三者によって提供されました。どちらのコードも機能しており、輸入品を紛失してしまいます。 – txigreman

答えて

0

最後に解決策を見つけました。私が抽出されてきた

は、キーとIV生成されたJavaのバージョンからバイト:彼らができるので、あなたも、BASE64にキーとIVをエンコードすることができます

$key = chr(208) . chr(193) . chr(208) . chr(49) . chr(81) . chr(84) . chr(244) . chr(181) . chr(234) . chr(244) . chr(94) . chr(164) . chr(44) . chr(55) . chr(244) . chr(64) . chr(233) . chr(97) . chr(4) . chr(64) . chr(179) . chr(155) . chr(161) . chr(155); 
$iv = chr(187) . chr(159) . chr(143) . chr(131) . chr(24) . chr(115) . chr(157) . chr(64); 

$text = "foobar"; 

echo openssl_encrypt($text, 'DES-EDE3-CBC', $key, 0, $iv); 
// Output: kaxAiR1Qb9s= 

byte[] keyBytes = key.getEncoded(); 
byte[] iv = cipher.getIV(); 

そしてPHPでそれを直接使用設定ファイルに簡単に書き込むことができます:

$key = base64_decode('0MHQMVFU9LXq9F6kLDf0QOlhBECzm6Gb'); 
$iv = base64_decode('u5+PgxhznUA='); 

ありがとうございます!

関連する問題