首页 > 解决方案 > 使用硬编码密钥在 Java 中模拟 php openssl_decrypt 函数

问题描述

我需要在 java 中复制功能,而不是改进PHP 代码。

php 7 代码:

openssl_encrypt("123::secret", "aes-256-cbc", "1234567899999999", 0, "0123456789999999");
// VZq5nLyJaAzajWQqMMLgmQ==

openssl_decrypt("VZq5nLyJaAzajWQqMMLgmQ==", "aes-256-cbc", "1234567899999999", 0, "0123456789999999");
// 123::secret

在Java中,我想做同样的事情,这样PHP就可以解密它

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec("1234567899999999".getBytes(), "AES"), new IvParameterSpec("0123456789999999".getBytes()));
byte[] res = cipher.doFinal("123::secret".getBytes());
java.util.Base64.getEncoder().encodeToString(res);

// xIwXN6R+X/FMMqfmsYhEQQ==

但是,这个密钥是不同的,PHP 在解密尝试时返回 false。我找到了很多解决方案,但它们围绕生成随机 256 个密钥长度,但在我的情况下 PHP 代码使用的是硬编码的秘密

标签: javaphpencryption

解决方案


Topaca 的回答是正确的(php 代码不能更改)。要使用提供的参数完全模拟所描述的 PHP 函数,需要使用“\0”更新密码以满足长度要求


推荐阅读