2016-02-26 113 views
0

我想创建一个使用Java的流密码,在该密码中,我从文件中将纯文本加密(使用种子值的简单XOR与随机密钥)并将其存储在不同的文件中,然后进行解密,再次从文件中取出密文并对其进行解密(与密钥相同的XOR操作与加密相同)并存储在文件中。使用java的流密码

但是我在试图加密大字符串时遇到问题。一半的字符串正在被正确解密,但另一半仍然是不可读的格式。

   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(); 
+0

哪一半?你的琴弦有多久了? –

回答

0

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

反之,最好在异或时保持一切二进制。 XOR是一种二进制操作,不是对字符的操作。所以你使用字节数组。

+0

那么在我的程序中,我该如何实现这一目标? –

+0

PlainText:这只是为了检查程序是否正常工作。 密文:yYXF^JZBCYEZTQVS \ ZYTA_RKD_UACZPEX ^^ CF^G \^WTGBBATG [N \ B^BE 解密后的纯文本:这只是为了检查lrkerog#ntkovii'm#wurlevny.eq'irh。 任何人都请帮我解决这个问题。 我也尝试将其转换为二进制,然后XOR,然后再次转换为字符并将其存储在文件中,但输出保持与上述程序相同。 –

+0

我相信你已经解决了它(现在添加一个答案这个问题会很好)。你有没有看过java的CipherOutputStream? – Rolf