2016-07-20 88 views
0

我已經研究了這個問題了很多,終於明白了這一點,即加密和解密使用XOR只是不加密建議的方式,但因爲它是一個學術問題,我必須這樣做。如何使用密鑰對字符串進行異或並將其存儲在文件中以稍後解密並使用它?

在我的場景中,我必須將文件(.txt文件)中的java對象(用我們選擇的鍵進行xor加密的空格分隔字符串)一行一行地逐行保存,並在需要時再檢索它們。所以在一個文件中保存一個xor字符串不是一個問題,但是當decrpytion被截斷時。以下是我爲我的項目實施的類似代碼示例。

public class TestingXor { 
    private static String XorString(String input){ 
     String key = "computing"; 
     Charset charSet = Charset.forName("UTF-8"); 
     byte[] inputBytes = input.getBytes(charSet); 
     byte[] keyBytes = key.getBytes(charSet); 
     for(int i=0;i<inputBytes.length;i++){ 
      inputBytes[i] = (byte)(inputBytes[i]^keyBytes[i%keyBytes.length]); 
     } 
     return (new String(inputBytes,charSet)); 
    } 


    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     try { 
      File testFile = new  File("addressBook.txt"); 
      Scanner scanObj = new Scanner(testFile); 
      String testString = "asd asdasd 07/08/2015 asdasdasd 198546125"; 
      BufferedWriter writer = new BufferedWriter(new FileWriter(testFile)); 
      writer.write(XorString(testString)); 
      writer.close(); 
      System.out.println(XorString(scanObj.nextLine()));   
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

}

上面的代碼返回「ASD爲:」因爲我需要。如果我不拯救我能夠加密和解密正確的文件,但如果我節省了整個字符串字符串到文件並從文件中檢索字符串並解密它不起作用。我認爲它與保存字符串(\ 0保存在行中)有關,但是圍繞這個做了什麼工作。當我從文件讀取時,我不知道字符串的長度。如果這個問題已經得到解答,您可以將我重定向到該問題。

+0

您需要讀取整個文件,而不是一條線,甚至多行,因爲異或你沒有在文後全部;有很多模糊,但一些是文字,所以我建議http://stackoverflow.com/a/326440/2868801。此外,您對字節進行操作,對於UTF-8中需要多個字節的字符不起作用,因此實際上您的代碼只能在ASCII上工作,但您的示例數據是ASCII。 –

回答

0

的問題是,你XorString方法可以返回字符串包含換行符或其他其他行分隔符(基本上\r\n\u2028\u2029\u0085和文件的末尾。你運氣不好,你的測試生成了多個「\ r」這使得Scanner停止尋找的字符串的其餘部分。

一個辦法讓離這個是使用某種逃逸機制。例如,Properties提供這樣的機制,但隨時實現自己的。

小例子:

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.nio.charset.Charset; 
import java.util.Properties; 

public class TestingXor { 
    private static String xorString(String input) { 
     String key = "computing"; 
     Charset charSet = Charset.forName("UTF-8"); 
     byte[] inputBytes = input.getBytes(charSet); 
     byte[] keyBytes = key.getBytes(charSet); 
     for (int i = 0; i < inputBytes.length; i++) { 
      inputBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keyBytes.length]); 
     } 
     return new String(inputBytes, charSet); 
    } 

    public static void main(String[] args) throws IOException { 
     File testFile = new File("addressBook.txt"); 
     store(testFile); 
     load(testFile); 
    } 

    private static void load(File file) throws IOException, FileNotFoundException { 
     Properties props = new Properties(); 
     try (InputStream in = new BufferedInputStream(new FileInputStream(file));) { 
      props.load(in); 
     } 
     for (int i = 1; i < props.size() + 1; i++) { 
      System.out.println(xorString(props.getProperty("entry-" + i))); 
     } 
    } 

    private static void store(File file) throws IOException, FileNotFoundException { 
     Properties props = new Properties(); 
     String testString = "asd asdasd 07/08/2015 asdasdasd 198546125"; 
     props.put("entry-1", xorString(testString)); 
     try (OutputStream out = new BufferedOutputStream(new FileOutputStream(file));) { 
      props.store(out, "Some comment"); 
     } 
    } 

} 
+0

那麼有沒有其他的方式來從掃描儀除外的文本文件逐行檢索字符串還是有任何其他格式,我需要更改我的字符串以保存在文件中? – user3324848

+0

@ user3324848是的,您需要使用某種逃避機制,例如避免使用新行。在我的答案中查找使用內部執行類似操作的Properties類。 –

相關問題