2014-06-23 38 views
5

Jestem całkiem nowy dla BouncyCastle i pgp. Widziałem wiele artykułów i próbek w Internecie. Niemal każda próbka zawiera kod szyfrowania snipped poniżejKiedy i dlaczego dekorować OutputStream z ArmoredOutputStream podczas korzystania z BouncyCastle

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

Wydaje się, że mój lokalny test zaliczony zarówno zbroi i żaden zbroi. Przeszukałem go, ale okazało się, że jest mało użytecznych, a javadoc pokazuje tylko ArmoredOutputStream Jest to podstawowy strumień wyjściowy.

Jaka jest różnica i kiedy należy z niej korzystać?

Kompletny przykładowy kod:

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(); 

} 
} 

Odpowiedz

7

ArmoredOutputStream wykorzystuje kodowanie podobną do Base64, tak że binarne niedrukowalne bajty są konwertowane na coś tekstu obsłudze. Możesz to zrobić, jeśli chcesz wysłać dane przez e-mail lub opublikować w witrynie lub innym medium tekstowym.

To nie ma znaczenia pod względem bezpieczeństwa. Jest jednak a slight expansion of the message size. Wybór tak naprawdę zależy od tego, co chcesz zrobić z wyjściem.

3

Zbroja ASCII to termin ogólny, który oznacza binarną reprezentację danych jako tekst tylko ASCII. Z technicznego punktu widzenia istnieje wiele sposobów na dane binarne, ale w polu dotyczącym kryptografii the PEM format jest powszechne (sprawdź także this and related questions w serverfault).

PEM to w zasadzie dane binarne zakodowane w Base64, zawijane w ogranicznikach -----BEGIN SOMETHING----- i -----END SOMETHING----- oraz zestaw dodatkowych nagłówków, które mogą zawierać pewne informacje meta dotyczące zawartości binarnej.