Потоковый шифр с использованием Java
Я пытаюсь создать потоковый шифр с использованием Java, в котором я беру простой текст из файла, зашифровываю его (Simple XOR со случайным ключом с начальным значением) и сохраняю его в другом файле, а затем расшифрую, снова беру зашифрованный текст из файла и расшифруйте его (та же операция XOR с ключом, что и шифрование) и сохраните в файле.
Но я сталкиваюсь с проблемой, когда пытаюсь зашифровать большую строку. Половина строки корректно дешифруется, но другая половина остается в нечитаемом формате.
FileReader fileReader = new FileReader(file);
// Always wrap FileReader in BufferedReader.
BufferedReader bufferedReader =
new BufferedReader(fileReader);
FileWriter fileWriter =
new FileWriter(file2);
// Always wrap FileWriter in BufferedWriter.
BufferedWriter bufferedWriter =
new BufferedWriter(fileWriter);
while((line = bufferedReader.readLine()) != null) {
sb = new StringBuffer (line);
int lenStr = line.length();
int lenKey = String.valueOf(random).length();
// For each character in our string, encrypt it...
for ( int i = 0, j = 0; i < lenStr; i++, j++ )
{
if ( j >= lenKey ) j = 0; // Wrap 'round to beginning of key string.
//
// XOR the chars together. Must cast back to char to avoid compile error.
//
String key = random + "";
bufferedWriter.write((char)(line.charAt(i) ^ key.charAt(j)));
}
}
// Always close files.
bufferedReader.close();
bufferedWriter.close();
1 ответ
Вы смешиваете двоичные файлы, символы и строки без достаточного ухода. XOR'ing символов может привести к тому, что символ не будет представлять строку. Если два одинаковых символа объединены в XOR, то результатом будет нулевой символ, обычно интерпретируемый как END of FILE.
Вместо этого лучше хранить все в двоичном виде, когда XOR'ing. XOR - это двоичная операция, а не операция над символами. Так что вместо этого вы используете байтовые массивы.