Il mio team deve sviluppare una soluzione per crittografare i dati binari (memorizzati come byte[]
) nel contesto di un'applicazione Android scritta in Java. I dati crittografati verranno trasmessi e archiviati in vari modi, durante i quali non è possibile escludere la corruzione dei dati. Alla fine un'altra applicazione Android (di nuovo scritta in Java) dovrà decifrare i dati.Crittografia dei dati su Android, AES-GCM o semplice AES?
È già stato deciso che l'algoritmo di crittografia deve essere AES, con una chiave di 256 bit. Tuttavia, vorrei prendere una decisione informata su quale implementazione AES e/o "modalità" dovremmo utilizzare. Ho letto qualcosa che si chiama modalità GCM, e ne abbiamo fatto alcuni test (usando BouncyCastle/SpongyCastle), ma non mi è del tutto chiaro su cosa sia esattamente AES-GCM e cosa ci "compra" rispetto al semplice AES - e se ci sono dei trade-off da prendere in considerazione.
Ecco un elenco di preoccupazioni/esigenze/domande abbiamo:
Imbottitura: i dati necessari per cifrare non sarà sempre un multiplo di 128 bit, quindi l'attuazione/modalità AES dovrebbe aggiungere padding, ma solo quando necessario. Avevo l'impressione che una semplice implementazione AES, come fornita da
javax.crypto.Cipher
, non lo avrebbe fatto, ma i test iniziali indicavano che lo faceva. Quindi immagino che il requisito di imbottitura di per sé non sia un motivo per ricorrere a qualcosa come GCM invece di "semplice" AES. È corretto?Autenticazione: Abbiamo bisogno di un metodo infallibile per rilevare se il danneggiamento dei dati si è verificato. Tuttavia, idealmente vogliamo anche rilevare quando la decrittografia viene tentata con una chiave errata. Quindi, vogliamo essere in grado di distinguere tra entrambi questi casi. La ragione per cui alla fine ho considerato GCM era dovuta a questo Stackoverflow question, in cui uno dei rispondenti sembra implicare che questa distinzione è possibile usando AES-GCM, sebbene non fornisca una spiegazione dettagliata (per non parlare del codice).
Ridurre al minimo il sovraccarico: È necessario limitare i costi generali di archiviazione e trasmissione dei dati crittografati. Pertanto desideriamo sapere se, e fino a che punto, la scelta di una specifica implementazione/modalità AES influenzi l'ammontare dei costi generali.
crittografia prestazioni/decrittazione: Anche se non è una preoccupazione primaria ci si chiede fino a che punto la scelta di una specifica implementazione AES/codifica delle modalità influenze e la decrittografia delle prestazioni, sia in termini di tempo di CPU e della memoria footprint.
Grazie in anticipo per eventuali consigli, chiarimenti e/o esempi di codice.
MODIFICA: delnan indicato utile non esiste una cosa come "AES semplice". Quindi per chiarire, quello che intendevo è usare il supporto AES integrato di Java.
Mi piace così: Cipher localCipher = Cipher.getInstance("AES");
Cos'è "semplice" AES? A meno che non si gestiscano solo 256 bit di dati. Se si dispone di più dati, si utilizza necessariamente * una * modalità. Forse la tua libreria sceglie una modalità per impostazione predefinita (da quello che ho sentito, molte librerie rappresentano una scelta piuttosto insicura qui). Quindi dovresti controllare quale modalità viene effettivamente utilizzata quando utilizzi la "semplice" AES. – delnan
Grazie per il tuo commento @delnan, ho fatto una modifica per chiarire cosa intendevo. – Matthias