3

zip ファイルを作成して書き込む場合は、次のように、ZipOutputStream を OutputStream (またはサブクラス) でラップします。

fos = 新しい FileOutputStream(ファイル名)
zOut = 新しい ZipOutputStream(fos);

また、zip ファイルの作成方法と、新しいエントリを追加するタイミングとエントリを閉じるタイミングを指定する必要があることも知っています。私がやりたいのは、アーカイブ内のファイルを暗号化することですが、アーカイブを暗号化しないままにして、エントリが簡単に見つかるようにします。(これの理由の 1 つは、異なるエントリが異なる時間に読み取られるためです。また、zip ファイル全体を暗号化すると、必要な zip エントリがファイル全体が暗号化されている場合、エントリへのランダム アクセスはできません。)

私は通常、暗号化 (または復号化) することを知っています。次のように、一方のストリームをもう一方のストリームにラップします。

fos = new FileOutputStream("暗号文");
CipherOutputStream cos = new CipherOutputStream(fos, key);

ZipOutputStream に書き込みを行っていて、エントリを暗号化して ZipOutputStream を作成したい場合は、上記の最初の例で行ったことを行うことができ、zip エントリのデータを書き込むときは、次のようにします。次のように、ZipOutputStream を CipherOutputStream 内にラップします。

fos = 新しい FileOutputStream(ファイル名)
zOut = 新しい ZipOutputStream(fos);
...
CipherOutputStream cos = new CipherOutputStream(zOut, key);

しかし、それにはいくつかの疑問が生じます:

  1. このような場合、一般的に、ストリームの順序は重要ですか? CipherOutputStream を ZipOutputStream 内にラップするか、またはその逆にすることができますか? 言い換えれば、ファイル全体が暗号化されている場合、どのストリームがどのストリームにラップされているかは重要でしょうか?
  2. 上記のようにして、各エントリのデータに CipherOutputScream を使用した場合、そのエントリを閉じて次のエントリに移動する必要がある場合はどうすればよいでしょうか? ラップされているストリームに影響を与えずに CipherOutputStream を破棄できますか?
  3. zip ファイル内のカタログやその他のデータではなく、zip エントリのみを暗号化するより良い方法はありますか?
4

2 に答える 2

3

ストリームと混同しないでください。ディスク上のアーカイブ ファイルを作成/更新するストリームがあります ( ZipOutputStream)。このストリームはエンコードされていないため、このコードはそのままにしておく必要があります。

必要なのは、個々のエントリのデータを暗号化することです。したがって、アーカイブに新しいエントリを追加するときは、putNextEntry()通常どおりに新しいエントリを追加します。

データをロードして暗号化し、CipherOutputStreamに書き込む を作成しますByteArrayOutputStreamByteArrayOutputStreamこの方法ですべてのデータをエンコードし、からのバイトをアーカイブに追加します。

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

CipherOutputStream cos = new CipherOutputStream(buffer, key);
... encode data ...

byte[] data = buffer.toByteArray();
zOut.write( data, 0, data.length );

ラップできるエントリごとZipFileに個別に提供されるため、おそらくを使用してアーカイブを読みたいことに注意してください。InputStream

于 2013-01-03T09:06:39.063 に答える