2014-09-18 3 views
0

Я шифрую файл как часть большего приложения, делающего другие вещи. Файл шифруется с помощью шифрования AES (случайный ключ) и заверяется в шифрование с открытым ключом RSA. Причина этого заключается в том, что зашифрованный файл будет отправлен/доступ к соответствующему лицу только с соответствующим личным ключом.Проверка работоспособности метода шифрования файлов

Основная функция шифрования файла приведена ниже. Я пишу keyBlock перед зашифрованным файлом, а затем зашифрованные данные.

У меня есть несколько вопросов:

1) С архитектурной и безопасностью точки зрения, этот метод шифрования файла безопасным способом действительно зашифровать файл? - Или это немного глупо? Если глупо, какие другие альтернативы могут быть разумными; и

2) прикрепляет keyBlock к передней части зашифрованного файла OK с точки зрения безопасности?

Приветствия и благодарности за любые мысли или комментарии. Функция

Java:

// File in = plain input file 
// File out = encrypted output file 
// Key pubKey = public Key (that wraps a random AES key) 
public static void encryptFile(File in, File out, Key pubKey) throws Exception { 
    FileInputStream fin; 
    FileOutputStream fout; 
    int nread = 0; 
    byte[] inbuf = new byte[1024]; 
    fout = new FileOutputStream(out); 
    fin = new FileInputStream(in); 

    SecureRandom random = new SecureRandom(); 
    // symmetric wrapping 
    Key sKey = createKeyForAES(Config.SYM_CRYPTO_STR, random); 
    IvParameterSpec sIvSpec = createCtrIvForAES(0, random); 

    // encrypt symmetric key with RSA/pub key 
    Cipher xCipher = Cipher.getInstance(Config.RSA_INSTANCE); 
    xCipher.init(Cipher.ENCRYPT_MODE, pubKey, random); 
    byte[] keyBlock = xCipher.doFinal(packKeyAndIv(sKey, sIvSpec)); 

    fout.write(keyBlock); 
    System.out.println("keyblock size = " + keyBlock.length); 

    // encrypt data with symmetric key 
    Cipher sCipher = Cipher.getInstance(Config.AES_INSTANCE); 
    sCipher.init(Cipher.ENCRYPT_MODE, sKey, sIvSpec); 


    // Now read our file and encrypt it. 
    while((nread = fin.read(inbuf)) >0) { 
     byte[] trimbuf = new byte[nread]; 
     for(int i=0;i<nread;i++) 
      trimbuf[i] = inbuf[i]; 

     byte[] newtmp = sCipher.update(trimbuf); 
     if(newtmp != null) 
      fout.write(newtmp); 
    } 

    byte[] finalbuf = sCipher.doFinal(); 
    if(finalbuf !=null) 
     fout.write(finalbuf); 

    fout.flush(); 
    fin.close(); 
    fout.close(); 
}                 

ответ

0
// Now read our file and encrypt it. 
while((nread = fin.read(inbuf)) >0) { 
    byte[] trimbuf = new byte[nread]; 
    for(int i=0;i<nread;i++) 
     trimbuf[i] = inbuf[i]; 

    byte[] newtmp = sCipher.update(trimbuf); 
    if(newtmp != null) 
     fout.write(newtmp); 
} 

byte[] finalbuf = sCipher.doFinal(); 
if(finalbuf !=null) 
    fout.write(finalbuf); 

Вы делаете гору из кротовой норы:

// Now read our file and encrypt it. 
while((nread = fin.read(inbuf)) > 0) { 
    fout.write(sCipher.update(inbuf, 0, nread)); // cannot be null, by construction 
} 
// NB doFinal() cannot return null, but can return a zero-length array, which is benign below. 
fout.write(sCipher.doFinal()); 

С архитектурной точки зрения и безопасности, этот метод шифрования файл безопасный способ действительно шифровать файл?

Я считаю, что это довольно распространено.

2) прикрепляет keyBlock к передней части зашифрованного файла ОК с точки зрения безопасности?

Это безопасно, как и ваш личный ключ.

Смежные вопросы