Quale tipo di algoritmi di crittografia supporta Android e quale sarebbe meglio?

6

Ho letto questa documentazione, e ho scritto un algo per crittografare e decodificare una stringa. Ma non so quanti tipi di algoritmi supportano Android.

Per quanto riguarda DES e AES (come documentazione wiki) ci sono molti tipi di entrambi, quindi quale sarà migliore?

    
posta Pankaj Kumar 18.07.2011 - 15:51
fonte

3 risposte

8

Su DES e AES: usa AES.

DES e AES sono cifrari a blocchi: crittografano i dati per "blocchi", in cui un blocco è una quantità di 64 bit (per DES) o 128 bit (per AES). Per crittografare un "messaggio" che non è un singolo blocco, è necessario utilizzare una "modalità concatenata" e possibilmente un "padding": la modalità concatenamento definisce come i dati vengono divisi in blocchi e assemblati di nuovo, e il padding consiste in byte extra aggiunto alla fine del messaggio in modo tale che la lunghezza totale sia appropriata per qualsiasi dividere la modalità di concatenazione. L'imbottitura deve essere tale che, una volta decodificata, possa essere rimossa senza ambiguità.

La modalità di concatenazione "standard" e il riempimento sono chiamati, rispettivamente, CBC e PKCS # 5 . Il padding PKCS # 5 aggiunge tra 1 e n byte, dove n è la lunghezza del blocco (da cui 8 per DES, 16 per AES), in modo che la lunghezza totale imbottita sia un multiplo di n . I collegamenti CBC si bloccano insieme e richiede un Vettore di inizializzazione (IV) che dovrebbe essere una sequenza di n byte casuali; è molto importante che i IV byte siano generati con un generatore di numeri casuali crittograficamente strong (cioè java.security.SecureRandom ) e che si generi una nuova IV per ogni messaggio. L'IV deve anche essere inviato insieme (non crittografato) al messaggio crittografato, poiché il destinatario ne avrà bisogno per decrittografare i dati.

Per lo stesso codice a blocchi: DES è disponibile in due versioni, DES "originale" e "Triple-DES", chiamato anche "3DES" o talvolta semplicemente "DES". Il DES originale utilizza una chiave a 64 bit, di cui 8 bit vengono ignorati, quindi la lunghezza effettiva della chiave è di 56 bit, e questo è troppo breve per la sicurezza. 3DES utilizza una chiave a 192 bit (24 bit vengono ignorati, quindi la lunghezza della chiave effettiva di 168 bit) e si ritiene che sia robusta; è anche tre volte più lento di DES, che non è già così veloce.

AES è stato progettato per sostituire DES e generalmente si ritiene che sia migliore sotto tutti gli aspetti. AES ha tre versioni, denominate AES-128, AES-192 e AES-256, che differiscono per la lunghezza della chiave (rispettivamente di 128, 192 e 256 bit). 128 bit sono più che sufficienti per la sicurezza e chiavi più lunghe implicano un leggero sovraccarico computazionale, quindi è preferibile una chiave a 128 bit.

Per ottenere un elenco di algoritmi supportati da una macchina virtuale Java, prova questo:

import java.security.Provider; 
import java.security.Security;
import java.util.Map;
import java.util.TreeSet;

public class ListAlgo {

    public static void main(String[] args)
    {   
        TreeSet<String> algos = new TreeSet<String>();
        for (Provider p : Security.getProviders()) {
            for (Map.Entry<Object, Object> e : p.entrySet()) {
                String s = e.getKey().toString()
                    + " -> " + e.getValue().toString();
                if (s.startsWith("Alg.Alias.")) {
                    s = s.substring(10);
                }               
                algos.add(s);   
            }           
        }       
        for (String a : algos) {
            System.out.println(a);
        }       
    }   
}

(Questo è per Java "normale", per Android probabilmente dovrai modificare un po 'le cose rispetto all'output finale.)

Gli algoritmi di crittografia saranno quelli in cui la stringa inizia con " Cipher. ". Ad ogni modo, se vuoi la combinazione di algoritmi più ampiamente supportata, sarà " AES/CBC/PKCS5Padding " con una chiave a 128 bit: se un dato basato su Android supporta un singolo codice, lo supporterà.

Se ti trovi in una situazione in cui è richiesta la crittografia, è probabile che avrai anche bisogno di un controllo di integrità; vedere javax.crypto.Mac . Per un MAC, in caso di dubbio, utilizzare HMAC con SHA-256 (se SHA-256 non è supportato, eseguire il fallback su HMAC con SHA-1).

    
risposta data 19.07.2011 - 14:45
fonte
3

Ho scoperto che queste impostazioni funzionano su Android 1.5:

SYMMETRIC_ALGORITHM = "AES/CBC/PKCS5Padding";
SECRET_KEY_ALGORITHM = "AES";
SECRET_KEY_SIZE_BYTES = 16; // 128 bit
MAC_ALGORITHM = "HmacSHA1";
MAC_OUTPUT_SIZE_BYTES = 20; // 160 bit SHA-1
PRIVATE_PUBLIC_ALGORITHM = "RSA/NONE/PKCS1Padding";

Ho contato su BouncyCastle in Android e ho inserito BouncyCastle nel mio progetto lato server - solo un jar (bcprov-jdk16-145.jar). Nessun plug-in di eclipse, quindi è stato necessario inserirlo nella directory lib / ext del JRE che stava usando il progetto eclipse.

Tuttavia, post come questo mi fanno sospettare che io potrebbe ancora incappare in dispositivi che non hanno gli algoritmi di cui ho bisogno.

    
risposta data 18.07.2011 - 19:45
fonte
-1

Android può supportare qualsiasi tramite le librerie java bouncy castle. Sto cercando una porta openssl per Android usando NDK per renderlo più veloce, ma vedremo.

    
risposta data 19.07.2011 - 15:41
fonte

Leggi altre domande sui tag