2017-02-22 9 views
1

安全に生成された16バイトのIVを暗号化された後、書き込まれる前に各ファイルに追加しようとしています。これは、IVをファイルから引っ張って後で解読できるようにするためです。これまでのコードです:暗号化されたファイルにIVを後で復号化するために追加する

public static void encrypt(byte[] file, String password, String fileName, String dir) 
     throws Exception { 
    SecureRandom r = new SecureRandom(); 
    //128 bit IV generated for each file 
    byte[] iv = new byte[IV_LENGTH]; 
    r.nextBytes(iv); 

    SecretKeySpec keySpec = new SecretKeySpec(password.getBytes(), "AES"); 

    IvParameterSpec ivspec = new IvParameterSpec(iv); 
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivspec); 

    FileOutputStream fos = new FileOutputStream(dir + fileName); 
    CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

    // Have to append IV -------- 


    cos.write(file); 

    fos.flush(); 
    cos.flush(); 
    cos.close(); 
    fos.close(); 

これはどのように行うべきですか?

答えて

0
FileOutputStream fos = new FileOutputStream(dir + fileName); 
fos.write(iv); 

CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

はすべきことです。 Cipherを設定する前にIVをファイルに書き込むことができます。

+0

私はこれに多くの経験はありませんが、このようにすればIVがファイルで暗号化されませんか?もしそうなら、私はどのように暗号化されたIVを使ってファイルを解読するのですか? – champskee

+0

CipherOutputStreamはFileOutputStreamの上で動作し、どちらもシーケンシャルです。 FileOutputStreamに何かを書き込んでからCipherOutputStreamをアタッチすると、何が書き込まれたのか分かりません。逆も同様です。したがって、FileInputStreamをインスタンス化し、そこから16バイトを読み取り、キーとIVからCipherオブジェクトを作成し、CipherInputStreamをFileInputStreamにアタッチします。 –

+0

ありがとうございます。大変感謝しています! – champskee

関連する問題