CipherOutputStream и ZipOutputStream - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь создать 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();
}
...