Я шифрую текст с помощью Java и пытаюсь расшифровать его с помощью Openssl в Linux. Я использую AES-128 с CBC.
Я получаю сообщение об ошибке «плохое дешифрование» от Openssl, когда использую Openssl для дешифрования 64-символьной зашифрованной строки, созданной Java. Но если строка состоит из 16 символов, Openssl может правильно ее расшифровать.
Я запускаю это в Linux:
echo ${encryptedText} | ./openssl aes-128-cbc -d -a -K $( echo -n ${KEY} | hexdump -v -e '/1 "%02X"') -iv $(echo -n ${IV} | hexdump -v -e '/1 "%02X"')
Примечание: $ encryptedText, $ KEY, $ IV передаются как строки, а не как шестнадцатеричные. Эта команда превращает его в гекс:
$ (echo -n $ {KEY} | hexdump -v -e '/ 1 "% 02X"')
и получаю эту ошибку:
358048944:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:460:
Мой код шифрования с Java, в основном:
import javax.crypto.*;
Cipher cipher;
SecretKey key;
String IV;
IvParameterSpec params;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
String randomString = GENERATE_RANDOM_TYPEABLE_ASCII(16_LENGTH);
key = new SecretKeySpec(randomString.getBytes("UTF-8"), "AES");
IV = GENERATE_RANDOM_TYPEABLE_ASCII(16_LENGTH);
params = new IvParameterSpec(IV.getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, key, params);
byte[] encryptedTextBytes = cipher.doFinal((decryptedString).getBytes("UTF-8")); // decryptedString is passed as a parameter
String encryptedText = new Base64().encodeAsString(encryptedTextBytes);
return encryptedText;
Чего я не понимаю, так это того, почему крипто работает для 16-символьных строк, но не работает для 64-символьных.
Еще одна важная вещь, на которую следует обратить внимание, - это то, что если я расшифрую текст с помощью онлайн-инструментов, таких как http://aes.online -domain-tools.com / , строка расшифровывается отлично. Поэтому я думаю, что мое шифрование работает нормально, но по какой-то причине OpenSSL создает проблемы.