3

(bcpg-jdk16-145.jar、bcprov-jdk16-145.jar)jarファイルを使用して、12 GBのテキストファイルに署名して暗号化しています。ファイルは、Windows Vista、jdk 1.6 で約 18 分間暗号化および署名されます。しかし、LINUX/UNIX システムで暗号化しようとすると、プロセスが非常に遅くなり、1 ~ 1:30 時間かかります。よろしくお願いします。

ファイルに署名するためのコードは次のとおりです。

private static void signFile(String fileName, InputStream keyIn,
        OutputStream out, char[] pass, boolean armor, int bufferSize)
        throws IOException, NoSuchAlgorithmException,
        NoSuchProviderException, PGPException, SignatureException {
    if (armor) {
        out = new ArmoredOutputStream(out);
    }
    PGPSecretKey pgpSec = readSecretKey(keyIn);
    PGPPrivateKey pgpPrivKey = pgpSec.extractPrivateKey(pass, "BC");
    PGPSignatureGenerator sGen = new PGPSignatureGenerator(pgpSec
            .getPublicKey().getAlgorithm(), PGPUtil.SHA1, "BC");
    sGen.initSign(PGPSignature.BINARY_DOCUMENT, pgpPrivKey);
    Iterator it = pgpSec.getPublicKey().getUserIDs();
    if (it.hasNext()) {
        PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator();
        spGen.setSignerUserID(false, (String) it.next());
        sGen.setHashedSubpackets(spGen.generate());
    }
    PGPCompressedDataGenerator cGen = new PGPCompressedDataGenerator(
            PGPCompressedData.ZLIB);
    BCPGOutputStream bOut = new BCPGOutputStream(cGen.open(out));
    sGen.generateOnePassVersion(false).encode(bOut);
    File file = new File(fileName);
    PGPLiteralDataGenerator lGen = new PGPLiteralDataGenerator();
    OutputStream lOut = lGen.open(bOut, PGPLiteralData.BINARY, file);
    FileInputStream fIn = new FileInputStream(file);
    byte[] byteArray = new byte[bufferSize];
    while (fIn.read(byteArray) >= 0) {
        lOut.write(byteArray);
        sGen.update(byteArray);
    }
    lGen.close();

    sGen.generate().encode(bOut);

    cGen.close();

    out.close();
}
4

1 に答える 1

7

これは経験に基づいた推測ですが、/dev/random に問題があるのではないでしょうか?

PGP は安全なハッシュを使用しますが、Java ではおそらく SecureRandom に依存するでしょう。Linux (Windows ではない) の SecureRandom のデフォルトのソースは /dev/random です。

問題は、要求されたビット数を現在満たすことができない場合、/dev/random がより多くのエントロピーを収集するのを待って SecureRandom がブロックすることです。

「haveged」(apt-get install など) というユーティリティをインストールしてみてください。Linux システムのより多くのエントロピーを収集し、この動作を防ぎます。

于 2014-05-17T00:05:14.500 に答える