PHP openssl_encrypt, разрешающий 64-байтовый секретный ключ для AES-256-CB C, но не в JAVA - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть секретный ключ и 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 байта.

Может ли кто-нибудь помочь мне выяснить, в чем я ошибаюсь?

...