gpt4 book ai didi

php (AES-256-CBC) 中的 java AES/CBC/PKCS5PADDING 导致不同的结果

转载 作者:太空宇宙 更新时间:2023-11-04 10:05:08 28 4
gpt4 key购买 nike

Java AES/CBC/PKCS5PADDING 函数

public static String encrypt_key_data(String password, String message) {
//password = 4lt0iD3biT@2O17l8
//message = "{"key_id":"101","merchant_code":"65010A"}";

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING", "SunJCE");
MessageDigest sha = MessageDigest.getInstance("SHA-1");
byte[] hashedpassword = sha.digest(password.getBytes("UTF-8"));

hashedpassword = Arrays.copyOf(hashedpassword, 16);

SecretKeySpec key = new SecretKeySpec(hashedpassword, "AES");

cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV.getBytes("UTF-8")));
byte[] encrypted;
encrypted = cipher.doFinal(message.getBytes());

return asHex(encrypted);
}

java函数结果值= 'bc26d620be9fa0d810e31e62b00a518f79524f6142b90550b9148d50a1ab94ba55671e68f6cf3ebc44dd6af12f566ee8'

PHP AES-256-CBC 函数

function encrypt($password, $iv, $data) { 
$password = '4lt0iD3biT@2O17l8';
$iv = 'AAAAAAAAAAAAAAAA';
$data = '{"key_id":"101","merchant_code":"65010A"}';
$encodedEncryptedData = (openssl_encrypt(($data), 'AES-256-CBC', fixKey(sha1($password)), OPENSSL_RAW_DATA, $iv));

print_r(bin2hex($encodedEncryptedData));
}

function fixKey($key) {
if (strlen($key) < 32) {
//0 pad to len 32
return str_pad("$key", 32, "0");
}

if (strlen($key) > 32) {
//truncate to 32 bytes
return substr($key, 0, 32);
}
return $key;
}

php 函数结果值 = 'cf20379c95a41429d4097f0ef7982c72a0d25c014cc09d93ba4a111bb9c11c38bc75d6c9f16cd9cb6545dc8c31560985'

我使用相同的密码和相同的 IV,并且我已读到 AES/CBC/PKCS5PADDING 与 AES-256-CBC 等效。但为什么我的结果不同呢?请告诉我我的错在哪里

==================================================

解决了。我需要 hex2bin($key) 然后使用 key 使用 aes 进行加密

最佳答案

要执行AES-256,您需要一个 256 位 key ,但您只提供 128 位 - 两者都在 java 中:

hashedpassword = Arrays.copyOf(hashedpassword, 16);

.. 在 PHP 中:

if (strlen($key) > 32) {
//truncate to 32 bytes
return substr($key, 0, 32);
}

as $key 是一个十六进制字符串,每个数字只有 4 位 (4 * 32 = 128)。

由于 Java 会根据提供的 key 确定 key 长度,因此最终会在 Java 中得到 128 位加密。由于您提供了相互矛盾的信息,PHP/Openssl 最终会做什么有点未知。您请求AES-256-CBC,但只提供了 128 位 key 。

此外,您不应使用简单的 SHA1 从密码中派生 key 。而是使用像 pbkdf2 这样的 key 派生函数,或者只使用实际的二进制 key 。

关于php (AES-256-CBC) 中的 java AES/CBC/PKCS5PADDING 导致不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53038866/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com