2012-11-06 55 views
8

Sto tentando di crittografare/decodificare una stringa in Java. Nessun problema riguardante la crittografia quindi memorizzato in una tabella sqlite. Ma ottengo sempre lo stesso errore nel tentativo di decifrare:Errore di decodifica in java

"java.security.InvalidKeyException: no IV set, quando si aspettava"

Ecco il mio frammento di codice:

public String encrypt(String password){ 
    try 
    { 
     String key = "mysecretpassword"; 
     SecretKeySpec keySpec = null; 
     keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, keySpec); 
     return new String(cipher.doFinal(password.getBytes())); 
    } 
    catch (Exception e) 
    { 
     return null; 
    } 
} 

public String decrypt(String password){ 
    try 
    { 
     String key = "mysecretpassword"; 
     SecretKeySpec keySpec = null; 
     keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
     cipher.init(Cipher.DECRYPT_MODE,keySpec); 
     return new String(cipher.doFinal(password.getBytes())); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e); 
     return null; 
    } 
} 

Che cosa sono io fare male?

+0

Avendo lo stesso problema, non capisco, perché funziona su encrypt e fallisce in decrittografia? a meno che, non impostando una IV in crittografia, ne venga generato uno casuale? – scottyab

+0

Solo per seguire il mio commento precedente. Sì, è necessario impostare una IV simile a come @Udo ha mostrato di seguito. – scottyab

+0

Possibile duplicato di [Decrittografia errore: "nessun iv impostato quando previsto"] (http://stackoverflow.com/questions/11503157/decrypting-error-no-iv-set-when-one-expected) – rds

risposta

9

Sarà necessario specificare un vettore di inizializzazione nel cipher.init() Metodo:

IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
cipher.init(Cipher.DECRYPT_MODE,keySpec, ivSpec); 

See: http://docs.oracle.com/javase/1.5.0/docs/api/javax/crypto/spec/IvParameterSpec.html

Il vettore di inizializzazione deve essere un array di byte casuale, per una discussione vedere:

http://en.wikipedia.org/wiki/Initialization_vector

+0

Grazie! La documentazione e il tuo frammento sono stati molto utili! – MademoiselleLenore

+0

Cosa dovrebbero essere ivBytes? – sajattack

+0

Ho aggiunto alcune informazioni per il IV alla risposta. –

1

È necessario una chiave AES appropriata, provare con:

String key = "mysecretpassword"; 
KeySpec spec = new PBEKeySpec(key.toCharArray(), Salt, 12345678,256); 
SecretKey encriptionKey = factory.generateSecret(spec); 
Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES"); 
+0

encryptionKey è specificato due volte. Non sembra giusto ... – PearsonArtPhoto