Ho una chiave hardcoded con cui voglio crittografare una stringa prima di memorizzarla in SharedPreferences
. Questo è il codice che ho finora:IllegalBlockSizeException quando si tenta di crittografare e decodificare una stringa con AES
public class TokenEncryptor {
private final static String TOKEN_KEY = "91a29fa7w46d8x41";
public static String encrypt(String plain) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AlgorithmParameterSpec ivSpec = new IvParameterSpec(new byte[16]);
SecretKeySpec newKey = new SecretKeySpec(TOKEN_KEY.getBytes(), "AES");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
return new String(cipher.doFinal(plain.getBytes()));
} catch (Exception e) {
Ln.e(e);
return null;
}
}
public static String decrypt(String encoded) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AlgorithmParameterSpec ivSpec = new IvParameterSpec(new byte[16]);
SecretKeySpec newKey = new SecretKeySpec(TOKEN_KEY.getBytes(), "AES");
cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
return new String(cipher.doFinal(encoded.getBytes()));
} catch (Exception e) {
Ln.e(e);
return null;
}
}
}
Sembra essere la cattura un'eccezione alla fine del decrypt
metodo:
javax.crypto.IllegalBlockSizeException: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
Qualcuno mi può punto nella giusta direzione? Ho la sensazione che sto facendo qualcosa di sbagliato nella creazione di istanze IvParameterSpec
.
La chiave è lunga solo 16 byte, quindi stai parlando di AES-128 e non AES-256. –
@ArtjomB. dovrei semplicemente cambiarlo in 32 byte per renderlo AES-256? Le mie scuse per non essere informato su questo, è la prima volta che devo affrontare la crittografia – Oleksiy
Sì, se aumenti la dimensione della chiave a 24 o 32 byte, AES-192 o AES-256 verranno utilizzati automaticamente. –