Обратите внимание:
Java char
соответствует единице кода UTF-16, а в некоторых случаях два последовательных char
с (так называемые суррогатная пара ) необходима для одного действительного символа Unicode (кодовая точка).
XOR для двух допустимых последовательностей UTF-16 (т. е. строки Java char
на char
, или байтов за байтом после кодирования в UTF-16) не обязательно дает вам другую допустимую строку UTF-16 - в результате у вас могут быть непарные суррогаты.(Это все равно будет идеально используемая строка Java, только методы, связанные с кодовыми точками, могут быть перепутаны и те, которые преобразуются в другие кодировки для вывода и тому подобное.)
То же самое верно, если вы сначала преобразуете вашиСтроки в UTF-8, а затем XOR эти байты - здесь вы вполне вероятно, получат последовательность байтов, которая не является допустимой UTF-8, если ваши строки не были уже обеими чистыми строками ASCII.
Даже если вы попытаетесь сделать это правильно и перебрать две строки по кодам и попытаться XOR кодов, вы можете получить кодовые точки вне допустимого диапазона (например, U+FFFFF
(плоскость 15) XOR U+10000
(плоскость 16) = U+1FFFFF
(который будет последним символом плоскости 31), намного выше диапазона существующих кодовых точек, и вы также можете получить таким образом кодовые точки, зарезервированные для суррогатов (= недействительных).
Если в ваших строках есть только символы <128, 256, 512, 1024, 2048, 4096, 8192, 16384 или 32768, то строки XORed (за исключением символов) будут находиться втот же диапазон, и, следовательно, конечно, не содержат никаких суррогатов.В первых двух случаях вы также можете кодировать свою строку как ASCII или Latin-1, соответственно, и иметь один и тот же XOR-результат для байтов.(Вы все еще можете получить контрольные символы, что может быть проблемой для вас.) </p>
То, что я, наконец, говорю здесь : не ожидайте результата шифрованияСтроки снова должны быть корректными - вместо этого просто сохраните и передайте их как byte[]
(или поток байтов).(И да, преобразовать в UTF-8 перед шифрованием и из UTF-8 после расшифровки).