PHPで暗号化したデータをJavaで復号化できない
現在PHPで暗号化したデータをJavaで復号化しようと試みています。
暗号化の処理(PHP)
https://paiza.io/projects/vGzC24BQEQC105lXB_Ya_Q
<?php
$output = array();
$output["data"] = "Hello world!";
$output["password"] = "Password";
$output["enc"] = openssl_encrypt($output["data"], "BF-ECB", $output["password"]);
var_dump($output);
復号化の処理(Java)
https://paiza.io/projects/glDa6DCtgOUAtFMnRVXiTQ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
import java.util.Base64;
import javax.xml.bind.DatatypeConverter;
public class Main {
public static void main(String[] args) throws Exception {
// Here your code !
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
String key = "Password";
String key_hex = DatatypeConverter.printHexBinary(key.getBytes());
System.out.println(key_hex);
String enc = "S1oraGJsPc3RupyhpvSYqw==";
byte[] enc_decode = Base64.getDecoder().decode(enc.getBytes());
Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
Key skey = new SecretKeySpec(key_hex.getBytes(), "Blowfish");
cipher.init(Cipher.DECRYPT_MODE, skey);
System.out.println(cipher.doFinal(enc_decode));
}
}
出ているエラー
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:989)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
at com.sun.crypto.provider.BlowfishCipher.engineDoFinal(BlowfishCipher.java:319)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at Main.main(Main.java:25)
実行環境については
Paizaの環境ベースで
java 1.8.0
php 7.0.15
です。
ちなみにコマンドラインで復号化もできたのですが、
複合(コマンドライン)
echo "S1oraGJsPc3RupyhpvSYqw==" |openssl enc -d -bf-ecb -base64 -K $(echo -n "Password"|xxd -p) -nosalt
鍵を16進数のデータに置き換える必要がありました。よってJavaも同様に置き換えを実施しています。