2016-02-26 43 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