2014-06-23 18 views
5

Sono abbastanza nuovo per BouncyCastle e pgp. Ho visto molti articoli e campioni su internet. Quasi ogni campione di crittografia contiene il codice qui sotto snippedQuando e perché decorare OutputStream con ArmoredOutputStream quando si utilizza BouncyCastle

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

Sembra che il mio test locale superato sia con l'armatura e nessuno-armatura. Ho cercato su google, ma ho trovato alcuni utili e la javadoc di ArmoredOutputStream mostra solo Questo è il flusso di output di base.

Quindi qual è la differenza e quando usarlo?

completo esempio di codice:

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

} 
} 

risposta

7

ArmoredOutputStream utilizza una codifica simile a Base64, in modo che i byte non stampabili binari sono convertiti in qualcosa di testo amichevole. Lo faresti se volessi inviare i dati via email, o pubblicare su un sito o qualche altro supporto di testo.

Non fa differenza in termini di sicurezza. C'è a slight expansion of the message size però. La scelta dipende solo da cosa vuoi fare con l'output.

3

armatura ASCII è un termine generico che indica una rappresentazione di dati binari come un testo solo ASCII. Tecnicamente, ci sono molti modi per dati binari ascii-armor, ma nel campo relativo alla crittografia the PEM format è prevalente (controlla anche this and related questions al server predefinito).

Il PEM è sostanzialmente un dato binario codifica Base64 avvolti in -----BEGIN SOMETHING----- e -----END SOMETHING----- delimitatori e una serie di intestazioni aggiuntive che possono contenere alcune meta informazioni sul contenuto binario.