Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Crittografare una stringa con AES
Forum - Java - Crittografare una stringa con AES

Avatar
drinoda (Normal User)
Newbie


Messaggi: 8
Iscritto: 08/04/2013

Segnala al moderatore
Postato alle 12:02
Lunedì, 08/04/2013
Salve a tutti. :D
Il mio intento è quello di prendere una stringa e crittografarla tramite AES. Il codice che sto utilizzando è il seguente:
Codice sorgente - presumibilmente Java

  1. String password = "mammmamia.!12ieri8.10g1orn1f4";
  2. SecretKey sk = KeyGenerator.getInstance("AES").generateKey();
  3. System.out.println(sk);
  4. Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
  5. c.init(Cipher.ENCRYPT_MODE, sk);
  6. String password_crittata = new String(c.doFinal(password.getBytes()));
  7.        
  8. System.out.println("CRP : "+password_crittata);
  9. c.init(Cipher.DECRYPT_MODE, sk);
  10. String original = new String(c.doFinal(password_crittata.getBytes()));
  11. System.out.println("DCP : "+original);
  12. }



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 il 08/04/2013 alle 13:17
PM Quote
Avatar
Dario DF (Member)
Newbie


Messaggi: 19
Iscritto: 19/06/2013

Segnala al moderatore
Postato alle 20:17
Giovedì, 20/06/2013
Il problema è del padding, prova a memorizzare il testo criptato e decriptato in un byte[]

Dalla guida (http://docs.oracle.com/javase/7/docs/api/javax/crypto/Ciph ...
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:

PM Quote