Ваша ошибка лежит здесь:
encryptedStr = new String(encrBytes);
strToBeEncoded.getBytes();
В этих методах используется набор символов по умолчанию для платформы, и при преобразовании из byte[]
в String
и обратно в byte[]
в общем случае с потерями . Единственный способ избежать потерь - это использовать набор символов по умолчанию для платформы "ISO_8859_1"
.
Я изменил все 11 таких вызовов на:
encryptedStr = new String(encrBytes, StandardCharsets.ISO_8859_1);
strToBeEncoded.getBytes(StandardCharsets.ISO_8859_1);
(я не изменился CHARSET
). Вывод, который я получаю сейчас:
длина initVector -> 16
длина ввода -> 48
AkhilRanjanBiharabcdefghijklmnopMovedtoChennai18
Предупреждение о бонусе 1: в шифровании используется жестко закодированный "AES/CBC/NoPadding"
, но дешифрование является динамическим (оно, конечно, также должно использовать "AES/CBC/NoPadding"
).
Предупреждение о бонусе 2: Вероятность невелика, но вполне возможно, что "::"
появится внутри encrBytes
, что испортит ваш str.split("::");
. Одним из решений является поиск последнего вхождения "::"
и разбитого только на этом.