Я пытаюсь создать zip-файл, который содержит зашифрованный файл и зашифрованный ключ для этого файла. Вот мой код:
молния
ZipOutputStream zout = new ZipOutputStream(new FileOutputStream("zip.zip"));
подключенных потоков
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
получение секретного ключа
KeyGenerator keygen=KeyGenerator.getInstance(storageSettings.getFileEncryptAlgorithm());
SecretKey key = keygen.generateKey();
получение шифра
Сipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);
теперь я делаю вывод шифра в pipedOutputStream
CipherOutputStream cos = new CipherOutputStream(pos,cipher);
byte[] m = new byte[1024];
int position;
while ((position = someInputData.read(m, 0, 1024)) >= 0)
{
cos.write(m, 0, position);
}
добавление в zip и его там, но следующий файл будет пустым
addFileToZip(zout, pis, backup.getFilename());
cos.flush();
Теперь я хочу зашифровать ключ SecretKey через rsa, и у меня есть пара ключей из файла
String publicKeyContent = new String(Files.readAllBytes(Paths.get(ClassLoader.getSystemResource(storageSettings.getPublicKeyFile()).toURI())));
publicKeyContent = publicKeyContent.replaceAll("\\n", "").replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
KeyFactory keyfactory = KeyFactory.getInstance(storageSettings.getKeyEnryptAlgorithm());
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyContent));
RSAPublicKey publicKey = (RSAPublicKey) keyfactory.generatePublic(keySpecX509);
cipher = Cipher.getInstance(storageSettings.getKeyEnryptAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
Теперь я хочу создать второй файл с зашифрованным ключом, но у меня есть пустой файл в zip, и все файлы будут пустыми, кроме первого
CipherOutputStream cos1 = new CipherOutputStream(pos,cipher);
byte[] tmp = key.getEncoded();
cos1.write(tmp);
addFileToZip(zout, pis,"key.txt");
Вот addFileToZip ()
public void addFileToZip(ZipOutputStream zout,InputStream data,String filename) throws IOException
{
zout.putNextEntry(new ZipEntry(filename));
byte[] m = new byte[data.available()];
data.read(m);
zout.write(m);
zout.closeEntry();
}