Tôi có khóa mã cứng mà tôi muốn mã hóa chuỗi trước khi lưu trữ trong SharedPreferences
. Đây là mã tôi có cho đến nay:IllegalBlockSizeException khi cố gắng mã hóa và giải mã chuỗi bằng 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;
}
}
}
Nó dường như được bắt một ngoại lệ ở phần cuối của decrypt
phương pháp:
javax.crypto.IllegalBlockSizeException: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
Ai đó có thể chỉ cho tôi đi đúng hướng? Tôi có cảm giác tôi đang làm một điều gì đó sai trái ngay lập tức IvParameterSpec
.
Khóa của bạn chỉ dài 16 byte, vì vậy bạn đang nói về AES-128 chứ không phải AES-256. –
@ArtjomB. nên tôi chỉ cần thay đổi nó thành 32 byte để làm cho nó AES-256? Xin lỗi vì đã không được thông báo về điều này, đây là lần đầu tiên tôi phải xử lý mã hóa – Oleksiy
Có, nếu bạn tăng kích thước khóa thành 24 hoặc 32 byte, AES-192 hoặc AES-256 sẽ được sử dụng tự động. –