如何将 openssl_decrypt 用作 JAVA?

问题描述

我想知道如何在 JAVA 中使用 openssl_decrypt?

这是PHP代码

<?PHP
    $textToDecrypt = hex2bin("db3700cd861aee8215b3db514adde6c9"); // input is hexadecimal format
    $key = "MbQeThWmZq4t7w1z";
    $decrypted = openssl_decrypt($textToDecrypt,'AES-128-CBC',$aesKey,OPENSSL_NO_PADDING);
    echo "decrypt data is ". $decrypted
?>

这是我的 JAVA 代码

byte[] textToDecrypt = inp.getBytes();

SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),"AES");

Cipher cipher = Cipher.getInstance("AES/CBC/nopadding");

cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);


byte[] original = cipher.doFinal(textToDecrypt);

result = new String((original));

PHP 代码可以正确解密,但在 JAVA 中出现错误参数丢失

我该如何解决这个问题。

谢谢。

解决方法

PHP 代码隐式使用零 IV,必须在 Java 代码中显式设置。另外,在 Java Code 中,密文必须经过十六进制解码,例如:

byte[] textToDecrypt = hexStringToByteArray("db3700cd861aee8215b3db514adde6c9");

SecretKeySpec secretKeySpec = new SecretKeySpec("MbQeThWmZq4t7w1z".getBytes(StandardCharsets.UTF_8),"AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE,secretKeySpec,new IvParameterSpec(new byte[16]));

byte[] original = cipher.doFinal(textToDecrypt);
String result = new String(original,StandardCharsets.UTF_8);
System.out.println(result); // hellotest

hexStringToByteArray() 来自 here

请注意静态 IV 是不安全的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...