使用java流密码

时间:2016-02-26 17:23:42

标签: java encryption stream-cipher

我正在尝试使用Java创建一个Stream密码,在其中我从文件中获取纯文本加密它(带有种子值的随机密钥的简单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 个答案:

答案 0 :(得分:0)

您正在混合使用二进制,字符和字符串。字符的异或可能导致字符不表示字符串。如果两个相同的字符被异或,那么结果将是一个空字符,通常被解释为END of FILE。

相反,最好在XOR时保持一切二进制。 XOR是二进制操作,而不是对字符的操作。所以你改用字节数组。