String encodedString = myString XOR myKey
Это не правильно. Строка в Java может иметь любую кодировку. Кодировка строки - это представления, использующие определенную кодировку символов в байтах , то есть байтовый массив.
Так вы бы сделали:
byte[] encodedString = myString.getBytes(StandardCharsets.UTF_8);
для извлечения байтов.
Затем вы можете перебирать байты encodedString
, используя индекс. Вы получите байт в том же месте в двоичном ключе и XOR два байта вместе. Результат может быть помещен в новый массив того же размера, что и encodedString
. Обратите внимание, что Java немного странная в том смысле, что для этого может потребоваться приведение к байтовому значению, т.е. result[i] = (byte) xorResult
Как правило, вам придется снова обнулять индекс в ключе, если у вас кончились байты в ключе. Если это произойдет, ваша схема шифрования станет уязвимой для атаки, так как одноразовая клавиатура (OTP) безопасна, но шифр XOR, безусловно, нет.
После расшифровки, которая является той же самой операцией, что и шифрование, вы можете вернуть свою строку, используя:
String myString = new String(encodedString, StandardCharsets.UTF_8);
Очевидно, вам придется сделать то же самое для ключа, если это строка. Однако обратите внимание, что даже если ключ хорошо распределен по печатным символам, битовые значения скорее всего не хорошо распределены. Другими словами, строка в виде ключа XOR делает вас уязвимым для криптоанализа, в частности, анализа частоты битов и байтов.
XOR приведет к рандомизированным байтам, поэтому вам может потребоваться кодирование 64 (после шифрования) / декодирование (до расшифровки), чтобы получить строку зашифрованного текста, а не байтовый массив.
Я специально пропустил код для этого, так как это практическое задание, получайте удовольствие от его реализации!