2016-04-22 13 views
0

.txtファイルを暗号化して復号化しようとしました。暗号化は正常に機能しましたが、復号化すると.txtファイルは空です。ここに私のコードです:Java Decryption Textがありません

package crypto; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.security.InvalidAlgorithmParameterException; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 

import javax.crypto.*; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 


public class MyCrypto 
{ 
    SecretKeySpec key; 
    Cipher cipher; 
    byte[] iv = {0,0,0,0,0,0,0,0}; 
    IvParameterSpec ivspec = new IvParameterSpec(iv); 

    MyCrypto() throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException 
    { 
     key =new SecretKeySpec("22042016".getBytes(), "DES"); 
     cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
    } 

    public void encrypt(File file) throws InvalidKeyException, IOException 
    { 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     FileInputStream fis = new FileInputStream(file); 
     FileOutputStream fos = new FileOutputStream(file); 
     CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

     byte[] block = new byte[8]; 
     int i; 
     while ((i = fis.read(block)) != -1) { 
     cos.write(block, 0, i); 
     } 
    cos.close(); 
    fis.close(); 
    } 

    public void decrypt(File file) throws IOException, InvalidKeyException, InvalidAlgorithmParameterException 
    { 
     cipher.init(Cipher.DECRYPT_MODE, key, ivspec); 
     FileInputStream fis = new FileInputStream(file); 
     CipherInputStream cis = new CipherInputStream(fis, cipher); 
     FileOutputStream fos = new FileOutputStream(file); 

     byte[] block = new byte[8]; 
     int i; 
     while ((i = cis.read(block)) != -1) { 
     fos.write(block, 0, i); 
     } 
     cis.close(); 
     fos.close(); 


    } 

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, InvalidAlgorithmParameterException 
    { 
     MyCrypto crypto = new MyCrypto(); 
     File cryptoFile = new File(".../crypto.txt"); 
     crypto.encrypt(cryptoFile); 
     crypto.decrypt(cryptoFile); 
    } 
} 

私は、DESはあまり安全ではないことを知っています。しかし、それは私が暗号化解除と暗号化を混乱させようとしているからです。

+0

IVは予測不可能でなければならない(読み:ランダム)。静的IVを使用しないでください。これは、暗号を決定論的にし、したがって意味的に安全ではないためです。暗号文を観察する攻撃者は、同じメッセージプレフィックスがいつ送信されたかを判断できます。 IVは秘密ではないので、暗号文とともに送ることができます。通常は、単純に暗号文の前に付加され、解読の前にスライスされます。 –

+0

ありがとうございます。しかし、ゲームのためにセーブファイルを暗号化して、誰もそれを使いこなして進捗を変えることはできません。しかし、2つの別々のファイルが必要な理由を説明してください。 –

答えて

0

は、これであなたの復号化方法でコードを交換してみてください:

 // write decrypted bytes 
     fos.write(cipher.doFinal(Files.readAllBytes(file.toPath()))); 
     // close the output file 
     fos.flush(); 
     fos.close(); 
+2

* 2つの*ファイル参照を1つではなく使用する方がよいでしょう。 –

+0

いいえ、動作しませんでした。エラーは同じです。 –

+0

Artjomのコメントを参照してください。暗号化/復号化されたファイルに対して別々のファイル参照を使用してみてください。 – Ben

関連する問題