Ответ 1
Посмотрим на код Java:
String c = new String(Test.encrypt((new String("thevalue")).getBytes(),
(new String("mykey")).getBytes()));
...
System.out.println("Base64 encoded String:" +
new sun.misc.BASE64Encoder().encode(c.getBytes()));
Что вы здесь делаете:
- Преобразование строки открытого текста в байты с использованием системного кодирования по умолчанию
- преобразовать ключ в байты, используя стандартную кодировку системы
- зашифровать байты
- преобразовать зашифрованные байты в строку, используя стандартную кодировку системы
- преобразовать зашифрованную строку обратно в байты, используя системное кодирование по умолчанию
- закодируйте эти зашифрованные байты с помощью Base64.
Проблема заключается в шаге 4. Предполагается, что произвольный массив байтов представляет собой строку в вашей системе по умолчанию, а кодировка этой строки возвращает тот же байт []. Это справедливо для некоторых кодировок (например, серия ISO-8859
), но не для других. В Java, когда некоторый байт (или байтовая последовательность) не представляется в данной кодировке, он будет заменен другим символом, который позже для преобразования будет отображаться в байт 63 (ASCII ?
). На самом деле в документации даже говорится:
Поведение этого конструктора, когда данные байты недопустимы в кодировке по умолчанию, не указывается.
В вашем случае нет оснований делать это вообще - просто используйте байты, которые ваш метод encrypt
выводит напрямую, чтобы преобразовать их в Base64.
byte[] encrypted = Test.encrypt("thevalue".getBytes(),
"mykey".getBytes());
System.out.println("Base64 encoded String:"+ new sun.misc.BASE64Encoder().encode(encrypted));
(Также обратите внимание, что я удалил лишние вызовы конструктора new String("...")
здесь, хотя это не относится к вашей проблеме.)
Следует помнить: Никогда не преобразовывать произвольный байт [], который не был получен из кодировки строки, в строку. Вывод алгоритма шифрования (и большинства других криптографических алгоритмов, кроме дешифрование), безусловно, относится к категории данных, которые не должны быть преобразованы в строку.
И никогда не используйте кодировку System default, если вы хотите переносить программы.