Mam ustalony klucz, z którym chcę zaszyfrować ciąg przed zapisaniem go w SharedPreferences
. Jest to kod mam tak daleko:IllegalBlockSizeException podczas próby do szyfrowania i deszyfrowania ciąg z 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;
}
}
}
Wydaje się, że łowienie wyjątek na koniec decrypt
metody:
javax.crypto.IllegalBlockSizeException: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
Czy ktoś może wskazać mi w dobrym kierunku? Mam przeczucie, że robię coś niewłaściwie tworzącego IvParameterSpec
.
Twój klucz ma tylko 16 bajtów, więc mówisz o AES-128 nie AES-256. –
@ArtjomB. czy powinienem zmienić go na 32 bajty, aby był to AES-256? Przepraszam za to, że niedoinformowani o tym, że to pierwszy raz mam do czynienia z szyfrowaniem – Oleksiy
Tak, jeśli zwiększy rozmiar klucza 24 lub 32 bajtów, AES-192 lub AES-256 będą wykorzystywane automatycznie. . –