9

私はBouncyCastleとpgpにかなり慣れていません。インターネットで多くの記事やサンプルを見てきました。ほとんどすべての暗号化サンプルには、以下に抜粋されたコードが含まれています

if (armor) 
        out = new ArmoredOutputStream(out);

私のローカルテストは、アーマーとノーアーマーの両方で合格したようです。私はグーグルで検索しましたが、有用なものはほとんどなく、ArmoredOutputStream の javadoc には、This is basic output stream のみが表示されます。

では、どのような違いがあり、いつ使用するのでしょうか?

完全なコード サンプル:

public static void encryptFile(String decryptedFilePath,
        String encryptedFilePath,
        String encKeyPath,
        boolean armor,
        boolean withIntegrityCheck)            
        throws Exception{

    OutputStream out = new FileOutputStream(encryptedFilePath);
    FileInputStream pubKey = new FileInputStream(encKeyPath);
    PGPPublicKey encKey = readPublicKeyFromCollection2(pubKey);
    Security.addProvider(new BouncyCastleProvider());

    if (armor) 
        out = new ArmoredOutputStream(out);

    // Init encrypted data generator
    PGPEncryptedDataGenerator encryptedDataGenerator =
            new PGPEncryptedDataGenerator(PGPEncryptedData.CAST5, withIntegrityCheck, new SecureRandom(),"BC");

    encryptedDataGenerator.addMethod(encKey);


    OutputStream encryptedOut = encryptedDataGenerator.open(out, new byte[BUFFER_SIZE]);

    // Init compression  
    PGPCompressedDataGenerator compressedDataGenerator = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);
    OutputStream compressedOut = compressedDataGenerator.open(encryptedOut);  

    PGPLiteralDataGenerator literalDataGenerator = new PGPLiteralDataGenerator();
    OutputStream literalOut = literalDataGenerator.open(compressedOut, PGPLiteralData.BINARY, decryptedFilePath, new Date(), new byte[BUFFER_SIZE]);
    FileInputStream inputFileStream = new FileInputStream(decryptedFilePath);
    byte[] buf = new byte[BUFFER_SIZE];  
    int len;
    while((len = inputFileStream.read(buf))>0){
        literalOut.write(buf,0,len);
    }

    literalOut.close();
    literalDataGenerator.close();

    compressedOut.close();
    compressedDataGenerator.close();
    encryptedOut.close();
    encryptedDataGenerator.close();
    inputFileStream.close();
    out.close();

}
}
4

2 に答える 2

13

ArmoredOutputStreamBase64に 似たエンコーディングを使用するため、バイナリの印刷不可能なバイトはテキストに適したものに変換されます。データを電子メールで送信したり、サイトやその他のテキスト メディアに投稿したりする場合は、これを行います。

セキュリティの観点からは違いはありません。ただし、メッセージ サイズはわずかに拡大されます。選択は、出力で何をしたいかによって異なります。

于 2014-06-23T05:44:58.697 に答える
7

ASCII Armor は、ASCII のみのテキストとしてのバイナリ データ表現を意味する一般的な用語です。技術的には、バイナリ データをascii-armorする方法はたくさんありますが、暗号化関連の分野では PEM 形式が一般的です (serverfault でこれと関連する質問も確認してください)。

-----BEGIN SOMETHING-----PEM は基本的に、-----END SOMETHING-----区切り記号とバイナリ コンテンツに関するメタ情報を含めることができる一連の追加ヘッダーでラップされた Base64 でエンコードされたバイナリ データです。

于 2014-06-23T06:07:37.527 に答える