2016-07-20 3 views
0

私はこの問題について多くのことを研究し、最終的にこれを理解しました.XORだけを使用した暗号化と復号化は暗号化の推奨方法ではありませんが、学問的な質問であるため、キーで文字列をXORし、ファイルに保存して後で復号化して使用するにはどうすればよいですか?

私のシナリオでは、ファイル(.txtファイル)の行ごとにjavaオブジェクト(xor暗号化をxor暗号化したスペース区切り文字列)を行ごとに保存し、必要に応じて後でそれらを取得する必要があります。だから、xor文字列をファイルに保存することは問題ではありませんが、解読中は切り捨てられます。以下は私のプロジェクトに実装したサンプルコードです。

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を」返すところ私は暗号化と適切に復号化することができる午前ファイルを保存していないですが、私は保存していた場合.IF文字列全体を必要とするよう文字列をファイルに追加し、ファイルから文字列を取得し、それを解読することはできません。私はそれが文字列(行の途中で保存されている\ 0)の保存に関連していると思うが、これを回避するのは何ですか。私はファイルから読み込んでいるときに文字列の長さを知らない。この質問に既に回答している場合は、その質問に私をリダイレクトすることができます。

+0

XOR後にテキストがまったくないので、ファイル全体を読む必要があります。多数のダストがありますが、一部はテキスト用ですので、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クラスの使用を見つける。 –

関連する問題