Oppure

Loading
08/04/13 10:02
drinoda
Salve a tutti. :D
Il mio intento è quello di prendere una stringa e crittografarla tramite AES. Il codice che sto utilizzando è il seguente:
String password = "mammmamia.!12ieri8.10g1orn1f4";
SecretKey sk = KeyGenerator.getInstance("AES").generateKey();
System.out.println(sk);
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, sk);
String password_crittata = new String(c.doFinal(password.getBytes()));
	
System.out.println("CRP : "+password_crittata);
c.init(Cipher.DECRYPT_MODE, sk);
String original = new String(c.doFinal(password_crittata.getBytes()));
System.out.println("DCP : "+original);
}


Non so perché ma questo codice funziona 4/5, in quanto alla quinta/sssta esecuzione in genere lancia la seguente eccezione:"Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded" .
In particolare la riga incriminata è String original = new String(c.doFinal(password_crittata.getBytes()));

Non riesco a capire il perché, se ha capito dove sto sbagliando e può cortesemente indicarmelo gliene sarei lieto. :D

grazie ;)

----
edit:

prove di fix che ho effettuato:
1) Ho impostato come valore della grandezza massima del "generatore di chiavi" a 128;


altri problemi che ci sono e non ho notato prima:
1) In alcuni casi, non vi è nessuna eccezione, ma non "decripta" in modo corretto.

Molto probabilmente sto sbagliando con la chiave, ma non riesco a capire come mai. :d
----
edit2:
Spulciando su google ho trovato uno che aveva un problema simile e gli è stato suggerito di utilizzare Base64.encode(...) e Base64.decode(...).

Con le opportune modifiche le ho inserite nel mio codice su:
- String password_crittata = new String(Base64.encode(c.doFinal(password.getBytes())));
- String original = new String(c.doFinal(Base64.decode(password_crittata)));

Ora sembra funzionare tutto correttamente e senza errori.
Ora il problema è che non ho capisco il perché ora tutto funzioni, e ovviamente questa cosa non mi 'garba'.
Ultima modifica effettuata da drinoda 08/04/13 11:17
aaa
20/06/13 18:17
Dario DF
Il problema è del padding, prova a memorizzare il testo criptato e decriptato in un byte[]

Dalla guida (docs.oracle.com/javase/7/docs/api/javax/crypto/…(byte[]))
BadPaddingException - if this cipher is in decryption mode, and (un)padding has been requested, but the decrypted data is not bounded by the appropriate padding bytes

quindi probabilmente nella conversione byte[] -> String -> byte[] viene perso il padding

Spero di averti aiutato :k:
aaa