У меня есть секретный ключ и IV, с помощью которого я сгенерировал соответствующие хэши SHA-256.
Ха sh секретный ключ: secret_key_hash = 76cb135fbba7e3db44c8bfe7428d7d512e6a9291a39cb7a8fe16e246ad82e99d
Ха sh из IV: iv_hash = bc8805b0e87e3dec
Когда я запускаю php функцию:
<?php
$secret_key_hash = "76cb135fbba7e3db44c8bfe7428d7d512e6a9291a39cb7a8fe16e246ad82e99d";
$iv_hash = "bc8805b0e87e3dec";
echo openssl_encrypt("a", "AES-256-CBC", $secret_key_hash, 0, $iv_hash);
, она возвращает зашифрованную строку как 1Ti9PQqt0xMzjhJLv7KO6A==
PHP код демонстрации
Проблема заключается в том, что когда я запускаю такое же шифрование в моей реализации java или в любом онлайн-шифраторе AES, он говорит, что размер secret_key составляет 64 байта, но он должен быть 32 байта для 256-битного шифрования.
I перепробовал все возможные случаи, такие как преобразование хешей в base64, усечение ha sh до 32 байт, но не удалось получить правильную зашифрованную строку, как в php.
Вот моя попытка реализовать ту же функцию в java
private static String openssl_encrypt(String data, String secretKey, String iv) throws Exception {
Cipher ciper = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretSpec = new SecretKeySpec(secretKey.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(), 0, 16);
ciper.init(Cipher.ENCRYPT_MODE, secretSpec, ivSpec);
byte[] encryptedCiperBytes = ciper.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedCiperBytes);
}
public static void main(String[] args) throws Exception {
openssl_encrypt("a", "76cb135fbba7e3db44c8bfe7428d7d512e6a9291a39cb7a8fe16e246ad82e99d", "bc8805b0e87e3dec");
}
Но это не работает, так как указано неверная длина ключа AES 64 байта.
Может ли кто-нибудь помочь мне выяснить, в чем я ошибаюсь?