Я пишу программу для шифрования и дешифрования данных.для шифрования я создал симметричный ключ, используя keyGenerator
.Я передал ключ на шифр и создал строковую версию ключа:
String keyString = Base64.getEncoder().encodeToString(symmetricKey.getEncoded());
, чтобы сохранить его в файле конфигурации (чтобы я мог получить ключ в функции расшифровки).
Теперь в функции расшифровки мне нужно вернуть эту строку обратно в формат ключа, чтобы я мог отправить ее в качестве параметра на шифр в режиме dercypt.Я конвертирую его обратно в ключ следующим образом:
byte[] keyBytes = key.getBytes(Charset.forName("UTF-8"));
Key newkey = new SecretKeySpec(keyBytes,0,keyBytes.length, "AES");
И передаю его в шифр и записываю вывод (расшифрованные данные), используя CipherInputStream
:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, newkey, newiv, SecureRandom.getInstance("SHA1PRNG"));
CipherInputStream cipherInputStream = new CipherInputStream(
new ByteArrayInputStream(encryptedBytes), cipher);
ArrayList<Byte> decryptedVal = new ArrayList<>();
int nextByte;
while ((nextByte = cipherInputStream.read()) != -1) {
decryptedVal.add((byte) nextByte);
}
byte[] bytes = new byte[decryptedVal.size()];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = decryptedVal.get(i);
}
String decryptedData = new String(bytes);
cipherInputStream.close();
System.out.println("decryptedData: " + decryptedData);
Я получаюэта ошибка:
Исключение в потоке "main" java.io.IOException: javax.crypto.BadPaddingException: данный последний блок заполнен неправильно.Такие проблемы могут возникнуть, если во время расшифровки используется плохой ключ.
Поэтому я подозреваю, что может возникнуть проблема с обработкой ключа.
Есть предложения?была бы признательна за помощь!