2017-02-22 48 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); 

должен сделать трюк. IV можно записать в файл до того, как Cipher будет настроен.

+0

У меня нет большого опыта в этом, но не будет ли зашифрован IV с файлом, если это будет сделано так? Если да, то как я могу использовать Encrypted IV для дешифрования файла? – champskee

+0

CipherOutputStream работает поверх FileOutputStream и оба являются последовательными. Если вы пишете что-то в FileOutputStream и затем присоединяете CipherOutputStream, он не знает, что было написано. Обратное работает так же. Таким образом, вы создаете экземпляр FileInputStream, читаете 16 байтов и затем создаете объект Cipher из ключа и IV, а затем присоединяете CipherInputStream к FileInputStream. –

+0

Благодарим за помощь. Очень ценим! – champskee