के साथ एक स्ट्रिंग को एन्क्रिप्ट करने और डिक्रिप्ट करने का प्रयास करते समय IllegalBlockSizeException मेरे पास एक हार्डकोडेड कुंजी है जिसके साथ मैं SharedPreferences
में संग्रहीत करने से पहले एक स्ट्रिंग को एन्क्रिप्ट करना चाहता हूं।एलेस
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;
}
}
}
यह decrypt
विधि के अंत में एक अपवाद को पकड़ने जा रहा है:
javax.crypto.IllegalBlockSizeException: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
कोई सही दिशा में मुझे बात कर सकते हैं इस कोड को मैं अब तक किया है? मुझे एहसास है कि मैं कुछ गलत कर रहा हूं IvParameterSpec
।
आपकी कुंजी केवल 16 बाइट लंबी है, इसलिए आप एईएस-128 के बारे में बात नहीं कर रहे हैं एईएस -256। –
@ArtjomB। क्या इसे एईएस -256 बनाने के लिए इसे 32 बाइट्स में बदलना चाहिए? इसके बारे में अपरिचित होने के लिए मेरी माफ़ी, यह पहली बार है कि मुझे एन्क्रिप्शन – Oleksiy
से निपटना है हां, यदि आप 24 या 32 बाइट्स के लिए मुख्य आकार बढ़ाते हैं, तो एईएस -192 या एईएस -256 स्वचालित रूप से उपयोग किया जाएगा। –