मैं एईएस 256 सीबीसी उपयोग कर रहा हूँ पता चलता है। मेरे पास 32 बाइट्स IV है। लेकिन जब मैं इसे चलाता हूं तो यह एक अपवाद दिखाता है:32 बाइट्स के साथ एईएस 256 सीबीसी उपयोग करना चाहते हैं, लेकिन यह java.security.InvalidAlgorithmParameterException
Exception in thread "main" java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
at com.abc.aes265cbc.AESUtil.decrypt(AESUtil.java:50)
at com.abc.aes265cbc.Security.main(Security.java:48)
Caused by: java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
at com.sun.crypto.provider.CipherCore.init(CipherCore.java:430)
at com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:217)
at javax.crypto.Cipher.implInit(Cipher.java:790)
at javax.crypto.Cipher.chooseProvider(Cipher.java:848)
at javax.crypto.Cipher.init(Cipher.java:1347)
at javax.crypto.Cipher.init(Cipher.java:1281)
at com.abc.aes265cbc.AESUtil.decrypt(AESUtil.java:47)
... 1 more
मुझे नहीं पता कि इसे कैसे हल किया जाए। मैंने खोज की लेकिन मुझे यह हल नहीं हो रहा है। मैं पहली बार सुरक्षा अवधारणाओं की कोशिश कर रहा हूं। एईएस 256 सीबीसी के लिए मेरे कोड है:
public static void setENCRYPTION_IV(String ENCRYPTION_IV) {
AESUtil.ENCRYPTION_IV = ENCRYPTION_IV;
}
public static void setENCRYPTION_KEY(String ENCRYPTION_KEY) {
AESUtil.ENCRYPTION_KEY = ENCRYPTION_KEY;
}
public static String encrypt(String src) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, makeKey(), makeIv());
return Base64.encodeBytes(cipher.doFinal(src.getBytes()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static String decrypt(String src) {
String decrypted = "";
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, makeKey(), makeIv());
decrypted = new String(cipher.doFinal(Base64.decode(src)));
} catch (Exception e) {
throw new RuntimeException(e);
}
return decrypted;
}
static AlgorithmParameterSpec makeIv() {
try {
return new IvParameterSpec(ENCRYPTION_IV.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
static Key makeKey() {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] key = md.digest(ENCRYPTION_KEY.getBytes("UTF-8"));
return new SecretKeySpec(key, "AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
तुम मुझे कि बदलते क्या इस कोड में मैं चतुर्थ के 32 बाइट्स का उपयोग करने में सक्षम हो जाएगा द्वारा मदद कर सकते हैं। अग्रिम धन्यवाद
संपादित करें: मेरा मुख्य समारोह को यह कार्यों कॉल जो:
AESUtil.setENCRYPTION_KEY("96161d7958c29a943a6537901ff0e913efaad15bd5e7c566f047412179504ffb");
AESUtil.setENCRYPTION_IV("d41361ed2399251f535e65f84a8f1c57");
String decrypted = AESUtil.decrypt(new String(sw0SrUIKe0DmS7sRd9+XMgtYg+BUiAfiOsdMw/Lo2RA=)); // AES Decrypt
आप प्रदान कर सकते हैं एक [SSCCE] (http://sscce.org/) जो compilable और runnable बॉक्स से बाहर है और इस मुद्दे को पता चलता है? (एक मुख्य विधि जिसमें यह दर्शाता है कि आप किस क्रम में कॉल करते हैं) –
32bytes (256bits) का उपयोग करने का कारण क्या है? मेरा अद्यतन उत्तर देखें - 'एईएस/सीबीसी/पीकेसीएस 5 पैडिंग', ब्लॉक लम्बाई = कुंजी लंबाई = IV लंबाई = 128 बिट (16 बाइट्स) के लिए। –
मैंने अपनी चाबियाँ मान जोड़ दी हैं ... यह आपको अपवाद दिखाएगा जो मुझे मिला। – Vaibs