2012-08-12 13 views
6

Sto sviluppando un'applicazione che dovrebbe crittografare alcuni file piccoli (meno di 1 MB) e di grandi dimensioni (circa 500 MB).
Come posso crittografare i file e salvare la versione crittografata da qualche parte sul disco in modo efficace (ad es.
Posso far avanzare la crittografia se è necessario del tempo?Efficace crittografia dei file utilizzando AES in java

+0

Quanta sicurezza desideri? Generalmente più debole è la crittografia, più veloce sarà e vice versa. –

+1

È possibile utilizzare l'API 'BouncyCastel'. –

+0

@NoxHarmonium: come dovrei misurarlo? ;-) Ho bisogno che i file siano il più sicuri possibile. Non mi interessa che la crittografia sia lenta, voglio solo che funzioni alla massima velocità possibile. (Intendo qualcosa come copia di file usando 'java.io' e' java.nio') – RYN

risposta

6

Supponendo di avere un tasto AES e un flusso di output, ecco come aggiungere un decoratore di crittografia allo stream.

Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
enc.init(Cipher.ENCRYPT_MODE, key); 
AlgorithmParameters params = enc.getParameters(); 
IvParameterSpec iv = params.getParameterSpec(IvParameterSpec.class); 
out.write(iv.getIV()); 
out = new CipherOutputStream(enc, out); 

Questo aggiunge l'IV all'inizio del testo cifrato; quando decifri, dovresti analizzarlo per inizializzare il codice.

Una soluzione migliore, a lungo termine, sarebbe quella di utilizzare la libreria che implementa la Sintassi dei messaggi crittografici, la base per S/MIME. Questo registra i metadati relativi agli algoritmi e alle chiavi che possono essere utilizzati per la decrittografia.

Vorrei anche raccomandare una modalità AEAD come GCM o CCM se il fornitore lo implementa. (Il SunJCE no.) Verranno verificati che il file è stato decrittografato correttamente e non è stato danneggiato.

+0

@owlstead So che l'API è lì per GCM e mi aspettavo che SunJCE lo fornisse, ma quando sono andato a controllare, non sono riuscito a trovarlo [nella documentazione.] (Http://docs.oracle. it/javase/7/docs/technotes/guides/security/SunProviders.html) Sei a conoscenza di qualsiasi impegno da parte di Oracle di fornirlo tramite un fornitore JCE incluso? – erickson

+1

Oops my scuse, probabilmente ho usato un percorso di build non standard. Dalla sorgente: "* Java SE ha già definito le interfacce AEAD/GCM in JDK 7. In JDK 8 i fornitori JCA/JCE implementeranno queste interfacce AEAD/GCM. È probabile che aggiungiamo alcuni meccanismi aggiuntivi per PKCS11, se l'attuale standard PKCS11 lo supporta. * " –

+0

Ovviamente l'API di Bouncy Castle contiene un'implementazione per eseguire la modalità GCM. Cercherò di costruirlo nel provider dopo aver terminato la mia cripto-università in standford. –

2

Come Bhavik menzionato sopra, BouncyCastle sarebbe un buon modo per andare, è leggero e maturo. Puoi sicuramente vedere i progressi della crittografia in quanto puoi controllare quanto leggere e scrivere contemporaneamente. È possibile leggere i byte da un file, crittografarli e riscrivere su un altro file in una pipeline.

Un esempio di questo è menzionato in questa domanda: How to encrypt a string/stream with bouncycastle pgp without starting with a file

Problemi correlati