在 Java 中使用 AES-256-ECB 解密

vkt*_*vkt 0 php java encryption aes

我已经使用AES-256-ECB加密了 PHP 中的字符串。

$sString   = "test"
$sEncryptionMethod = "AES-256-ECB";
$sEncryptionKey = "mysecretkey";

openssl_encrypt($sString, $sEncryptionMethod, $sEncryptionKey)
Run Code Online (Sandbox Code Playgroud)

我想使用 Java/Scala 解密相同的文件吗?

 String secret = "mysecretkey";
 SecretKeySpec skeySpec = new SecretKeySpec(encKey.getBytes("UTF-8"), "AES");
 byte[] decodedValue = Base64.getDecoder.decode(token);

 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
 int decryptMode = Cipher.DECRYPT_MODE;
 cipher.init(decryptMode, skeySpec);
 new String(cipher.doFinal(decodedValue));
Run Code Online (Sandbox Code Playgroud)

我看到以下错误?我们如何使用Java解密相同的内容?注意:(PHP 中的解密按预期工作)但我想在 Java 中执行此操作

Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
Run Code Online (Sandbox Code Playgroud)

rzw*_*oot 6

密钥必须正好是 256 位长。很明显,PHP 端正在做一些未指定的魔法巫毒"mysecretkey"来获取 256 位密钥。Java 通常不会像 PHP 那样从事“用户似乎不知道他们在做什么,呃,我会在黑暗中疯狂刺杀”,这就是问题所在。

弄清楚“mysecretkey”是如何变成 256 位密钥的,并在 java 中复制它。

注意:欧洲央行非常不安全。听起来您对加密的了解还不够,以至于无法产生实际上很难被轻易破解的应用程序。

NB2:请注意,PHP 文档本身强烈建议“密钥”应该是某种加密衍生的 256 位安全源。openssl_encrypt当您提供损坏的钥匙时,实际上会给您一个答案的事实有点令人皱眉。见在各种评论上openssl_encrypt PHP手册,明确突出了一些古怪的事情存在,但没有非常清楚真正说明什么PHP在这里做。