2013-02-18 15 views
6

Ho ottenuto questo codice da http://www.ravenblast.com/index.php/blog/android-password-text-encryption/ e, sebbene funzioni, ho un crescente sospetto che non sia abbastanza sicuro. Non c'è alcun vettore di inizializzazione che sembra essere necessario secondo altre fonti.Questa crittografia AES è abbastanza sicura?

public static String encrypt(String toEncrypt, byte[ ] key) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[ ] encryptedBytes = cipher.doFinal(toEncrypt.getBytes()); 
    String encrypted = Base64.encodeBytes(encryptedBytes); 
    return encrypted; 
} 

public static String decrypt(String encryptedText, byte[ ] key) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
    byte[] toDecrypt = Base64.decode(encryptedText); 
    byte[] encrypted = cipher.doFinal(toDecrypt); 
    return new String(encrypted); 
} 
+2

È necessario un IV ed un MAC. Avere un MAC in uno schema encrypt-then-mac, o usare una crittografia autenticata specializzata è molto importante quando si affronta un attaccante attivo. Altrimenti è probabile che l'aggressore possa indurti a decifrare un messaggio per lui. Gli oracoli imbottiti sono un attacco pratico. Se si tratta di ECB (non ho familiarità con l'API per vederlo), è necessario passare a una modalità migliore. – CodesInChaos

+2

L'uso di 'getBytes()' è una cattiva idea, poiché utilizza una codifica basata su piattaforma/cultura. Usa invece UTF-8. – CodesInChaos

risposta

9

Sì, non è molto sicuro. Non c'è IV perché non c'è il blocco che concatena.

L'algoritmo AES può crittografare solo blocchi di 128 byte, indipendentemente dalla dimensione della chiave (non è correlata). Come quei blocchi sono incatenati insieme è un altro problema. L'approccio più semplice è quello di crittografare ogni blocco separatamente dagli altri (ECB mode), come se fossero messaggi separati. L'articolo di Wikipedia che ho linkato ti dice quando e perché questo non è sicuro, e altri metodi (ovvero, CBC mode) sono preferiti.

Quando si esegue Cipher cipher = Cipher.getInstance("AES"); viene fornito un codice AES in ECB mode. Non v'è alcun pericolo immediato, ma se i vostri messaggi hanno modelli ricorrenti questo può portare a situazioni come le seguenti:

originale: enter image description here criptato: encrypted

Problemi correlati