2009-10-19 7 views
8

У меня есть клиентское и серверное Java-приложение, которое должно иметь зашифрованный текст, проходящий через друг друга. Я использую шифрование XOR для шифрования текста, который я хочу.Java string to bytearray обратно в строку

Проблема заключается в том, что readline() не принимает строку, которая была XORed, и будет приниматься только в том случае, если она находится в байтах.

Итак, я преобразовал свой простой текст (строку) в массив байтов на стороне клиента и попытался преобразовать обратно в строку на стороне сервера.

К сожалению, результат, который я ищу, по-прежнему является таинственным, а не открытым текстом, который я искал.

Кто-нибудь знает, как заставить bytearrays изменить исходную строку? Или есть лучший способ отправить через XOR зашифрованный текст через функцию readline()?

ответ

19

После того, как вы применили нечто вроде XOR, вы получаете произвольные двоичные данные - не закодированную строку.

Обычный безопасный способ преобразования произвольного двоичного кода в текст заключается в использовании base64 - не попробуйте просто создать из него новую строку. Таким образом, ваш процесс будет примерно таким:

  • Начать с простого текста в виде строки.
  • Кодирование простого текста с использованием UTF-8, UTF-16 или чего-то подобного. Не используйте кодировку платформы по умолчанию, или что-нибудь ограничивающее, как ASCII. Теперь у вас есть байтовый массив.
  • Применение вашего шифрования. (XOR довольно слаб, но давайте оставим это с одной стороны.) У вас все еще есть массив байтов.
  • Применить base64 кодировку, чтобы получить строку.

Затем, когда вам нужно расшифровать ...

  • Применить base64 декодирование, чтобы преобразовать строку в массив байтов.
  • Применить процесс двоичного дешифрования (например, XOR снова). У вас все еще есть массив байтов.
  • Теперь декодирует, что байтовый массив в строку, например. с new String(data, utf8Charset), чтобы вернуть исходную строку.

Доступны различные библиотеки Java base64, такие как this class в Apache Commons Codec. (Вам нужны методы encodeToString(byte[]) и decode(String).)

+0

+1. @ NewJavaProgrammer. Base64 также не зашифрован, однако он закодирован. – RichardOD

+1

@RichardOD - на самом деле base64, созданный методом @ Jon, кодируется и зашифрован. –

+0

Да, я почему-то не видел бит «применить шифрование». Слишком рано утром! – RichardOD

1

Прежде всего, не называйте шифрование XORing. Серьезно, CipherOutputStream и CipherInputStream доступны для вас, если вам нужно защитить свои данные.

Спасибо за потоковое соединение, вы можете иметь DataOutputStream -> CipherOutputStream -> ByteArrayOutputStream. Это даст вам правильно зашифрованные байты. Используйте обратные API на другом конце, и вы вернете свою строку.