2017-07-12 8 views
0

私のJavaプログラムでは、.txtファイルを読み込み後にエンコードしたいと思っています。私はFile inの読み方を知っていて、配列をエンコードする方法を学びました。私が持っている問題は、それをどのように組み合わせるか分からず、試したやり方ではうまくいかないということです。FileReaderでファイルを暗号化する

ここで私は私のテキストファイルを読み込むことができます一部です。この部分では、私は暗号化してバイトを復号化することができます

public class ReadFile { 

    public static void main(String[] args) throws IOException 
     { 
     FileReader fr = new FileReader("test.txt"); 
     BufferedReader br = new BufferedReader(fr); 

     String zeile = ""; 

     do 
     { 
      zeile = br.readLine(); 
      System.out.println(zeile); 
     } 
     while (zeile != null); 

     br.close(); 
    } 
} 

public class Crypt { 

    public static void main(String[] args) { 

     try{ 
      KeyGenerator keygenerator = KeyGenerator.getInstance("DES"); 
      SecretKey myDesKey = keygenerator.generateKey(); 

      Cipher desalgCipher; 
      desalgCipher = Cipher.getInstance("DES"); 


      byte[] text = "test".getBytes("UTF8"); 


      desalgCipher.init(Cipher.ENCRYPT_MODE, myDesKey); 
      byte[] textEncrypted = desalgCipher.doFinal(text); 

      String s = new String(textEncrypted); 
      System.out.println(s); 

      desalgCipher.init(Cipher.DECRYPT_MODE, myDesKey); 
      byte[] textDecrypted = desalgCipher.doFinal(textEncrypted); 

      s = new String(textDecrypted); 
      System.out.println(s); 
     } 

      catch(Exception e) 
      { 
       System.out.println("Error"); 
      } 
    } 

} 

私は、テキストファイルを読み込んで配置する考えそれをエンコードする文字列にしていますが、複雑すぎると思います。それらを接続する別の方法がありますか、またはエンコードのための別の方法が必要ですか?

+0

をあなたは –

+0

( 'FileInputStream'、' CipherOutputStream'はあなたのために最も有用であるかもしれない)のストリームのビットを見て必要があります。したがって、次はそう

new String(textEncrypted); // Uses the default platform encoding new String(textEncrypted, "UTF-8"); // Probably the bytes are not valid UTF-8 

を行うことはできません

文字列を読み込み、文字列をバイト配列に変更し、バイトを暗号化します。 – Antoniossss

+0

@JeremyGrand FileReaderとの違いは何ですか? FileInputStreamもそれを読み込んでいませんか? –

答えて

2

私は強くはなく、直接FileReaderを使用するよりもStream S(https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html & https://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.htmlを参照)を使用することをアドバイス。

暗号化は、実行しようとしているよりも低いレベル(バイト単位)で行われます。 Java暗号は、すぐにバイトストリームを暗号化する便利なCipherInputStream(およびCipherOutputStream)を提供します。ファイル全体を1つのbyte[]にダンプしようとするよりもはるかに安価でスケーラブルです(ファイルの内容をデコードして再エンコードするので、moreso)。

あなたが使用例をしたい場合は、次のスニペットをご覧ください:

public static void encrypt(Path inputFile, OutputStream output) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException { 
    // init cipher 
    KeyGenerator keygenerator = KeyGenerator.getInstance("DES"); 
    SecretKey myDesKey = keygenerator.generateKey(); 
    Cipher desalgCipher; 
    desalgCipher = Cipher.getInstance("DES"); 
    desalgCipher.init(Cipher.ENCRYPT_MODE, myDesKey); 


    try(InputStream is = Files.newInputStream(inputFile);  // get an IS on your file 
    CipherInputStream cipherIS = new CipherInputStream(is, desalgCipher)){ // wraps input Stream with cipher 
     copyStreams(cipherIS, output); // copyStream is let to the implementer's choice. 
    } 
} 

そして、私はあなたが解読する方法を見つけ出すもらおう。

EDIT:

エンコーディングの問題を心配することなく、暗号化バイトを通信するための共通の方法は、ベース64

と生のバイトを符号化することであるあなたがFileReader/FileWriterであるBase64.getEncoder().wrap(os)

+0

解読部分のヒントを教えてください。 WriterとしてOutputStreamを使用するか、エンコードされた部分を読み込んでいますか? –

+0

@MalteS暗号化されたデータをファイルに書き込んだとすると、解読モードで暗号を初期化する必要がある点を除いて、解読コードはまったく同じです。 –

+0

だから私はそれを新しいファイルとして保存するだろうと思いますか?または、それを上書きする方が良いですか? –

2

とOutputStreamをラップすることができ現在のプラットフォームのエンコーディングを使用し、あるコンピュータ(ギリシャ語のWindows)で暗号化されたファイルは別のコンピュータ(Linuxサーバー)で解読できません。

java内のテキストStringは、Unicodeです。任意のバイトをStringにスローすることはできません。

Path path = Paths.get("text.txt"); 
byte[] content = Files.readAllBytes(path); 
content = encrypt(content); 
Files.write(path, content); 
関連する問題