Я шифрую файл как часть большего приложения, делающего другие вещи. Файл шифруется с помощью шифрования 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();
}