AES: last block incomplete in decryption

Résolu/Fermé
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 - 1 avril 2016 à 23:08
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 - 13 avril 2016 à 23:13
Bonjour,
J'aimerais tester le cryptage/décryptage AES sur un appareil android.
J'ai fait des recherches et j'ai trouvé une solution pour crypter.
Le décryptage, me renvoie une exception: last block incomplete in decryption.

Les fonctions:


//crypter
public byte[] encrypt(byte[] raw, byte[] clear) throws Exception
{
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}


//décypter
public byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception
{
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}


//utiliser le cryptage dans l'application.
public String AES(String text, boolean crypter) //si true, on crypte sinon on décrypte
{
String finalCrypt = null;
byte[] encryptedData = null;
byte[] decryptedData = null;

try
{
byte[] b = text.getBytes();

byte[] keyStart = (editTextPassword.getText().toString()).getBytes();
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(keyStart);
kgen.init(256, sr);
SecretKey skey = kgen.generateKey();
byte[] key = skey.getEncoded();

if(crypter == true)
{
encryptedData = aes.encrypt(key, b);
finalCrypt = Base64.encodeToString(encryptedData,Base64.NO_WRAP);
}
else
{
decryptedData = aes.decrypt(key, b);
finalCrypt = new String(decryptedData);
}
}
catch(Exception e)
{
messageBoxPerso("exception\n\n" + e.getMessage());
//la fameuse exception!
}

return finalCrypt;
}


dernière information: Si j'utilise le cryptage et le décryptage dans la même fonction, sans aucune action entre les deux, je n'ai aucun problème (mais niveau utilité c'est 0!!!)
Je m'explique:

 try
{
AESCrypt aes = new AESCrypt();
String test = "My text.";
byte[] b = test.getBytes();

byte[] keyStart = "Une clef au hasard".getBytes();
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(keyStart);
kgen.init(256, sr);
SecretKey skey = kgen.generateKey();
byte[] key = skey.getEncoded();

// encrypt
byte[] encryptedData = aes.encrypt(key, b);
// decrypt
byte[] decryptedData = aes.decrypt(key, encryptedData);

//le cryptage et le décryptage sont fait à la suite
messageBoxPerso("Crypt: " + Base64.encodeToString(encryptedData,Base64.NO_WRAP) + "\nDecrypt: " + new String(decryptedData));
}
catch(Exception e)
{
messageBoxPerso("exception: " + e.getMessage());
}


Merci à ceux qui auront une idée!
A bientôt.



--

7 réponses

BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
13 avril 2016 à 10:51
1