Давайте посмотрим на ваш код 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("...")
, хотя это не относится к вашей проблеме.)
Важно помнить: Никогда не преобразовывайте произвольный байт[], полученный не в результате кодирования строки, в строку. Вывод алгоритма шифрования (и большинства других криптографических алгоритмов, кроме дешифрования) безусловно относится к категории данных, которые не следует преобразовывать в строку.
И никогда не используйте системную кодировку по умолчанию, если вам нужны переносимые программы.
person
Paŭlo Ebermann
schedule
20.08.2011