Ваша проблема в том, что вы не можете построить строку UTF-16 (или любую другую кодировку) из произвольного байтового массива (см. UTF-16 в Википедии ).Однако от вас зависит, чтобы сериализовать и десериализовать зашифрованный байтовый массив без каких-либо потерь, чтобы, скажем, сохранить его и использовать позже.Вот модифицированный клиентский код, который должен дать вам некоторое представление о том, что на самом деле происходит с байтовыми массивами:
public static void main(String[] args) throws Exception {
String toEncrypt = "FOOBAR";
NewEncrypter encrypter = new NewEncrypter();
byte[] encryptedByteArray = encrypter.encrypt(toEncrypt);
System.out.println("encryptedByteArray:" + Arrays.toString(encryptedByteArray));
String decoded = new String(encryptedByteArray, "UTF-16");
System.out.println("decoded:" + decoded);
byte[] encoded = decoded.getBytes("UTF-16");
System.out.println("encoded:" + Arrays.toString(encoded));
String decryptedText = encrypter.decrypt(encryptedByteArray); // NOT the "encoded" value!
System.out.println("decryptedText:" + decryptedText);
}
Это вывод:
encryptedByteArray:[90, -40, -39, -56, -90, 51, 96, 95, -65, -54, -61, 51, 6, 15, -114, 88]
decoded:<some garbage>
encoded:[-2, -1, 90, -40, -1, -3, 96, 95, -65, -54, -61, 51, 6, 15, -114, 88]
decryptedText:FOOBAR
decryptedText
правильно,при восстановлении с оригинала encryptedByteArray
.Обратите внимание, что значение encoded
отличается от значения encryptedByteArray
из-за потери данных во время преобразования byte[] -> String("UTF-16")->byte[]
.