В моем приложении я шифрую и расшифровываю данные с помощью secretKey. Для этого я использую алгоритм AES. Но я получаю исключение при расшифровке, одно значение из трех уже зашифрованных значений с использованием секретного ключа.
Исключение:
Illegal Block Size Exception Input length must be multiple of 16 when decrypting with padded cipher.
Ниже мой код:
Функция для шифрования значения
public static String symmetricEncrypt(String text, String secretKey) {
BASE64Decoder decoder = new BASE64Decoder();
byte[] raw;
String encryptedString;
SecretKeySpec skeySpec;
BASE64Encoder bASE64Encoder = new BASE64Encoder();
byte[] encryptText = text.getBytes();
Cipher cipher;
try {
raw = decoder.decodeBuffer(secretKey);
skeySpec = new SecretKeySpec(raw, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
encryptedString = bASE64Encoder.encode(cipher.doFinal(encryptText));
}
catch (Exception e) {
e.printStackTrace();
return "Error";
}
return encryptedString;
}
Функция для расшифровки значения
public static String symmetricDecrypt(String text, String secretKey) {
BASE64Decoder decoder = new BASE64Decoder();
BASE64Decoder base64Decoder = new BASE64Decoder();
Cipher cipher;
String encryptedString;
byte[] encryptText = null;
byte[] raw;
SecretKeySpec skeySpec;
try {
raw = decoder.decodeBuffer(secretKey);
skeySpec = new SecretKeySpec(raw, "AES");
encryptText = base64Decoder.decodeBuffer(text);
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
encryptedString = new String(cipher.doFinal(encryptText));
} catch (Exception e) {
e.printStackTrace();
return "Error";
}
return encryptedString;
}
Ниже приведены значения, которые я шифрую и расшифровываю.
String secretKey = "XMzDdG4D03CKm2IxIWQw7g==";
String value1= "ABCD";
String enctypedValue1= "3uweh4pzoVyH1uODQmVNJA==";
String enctypedValue2= "37PTC20w4DMZYjG3f+GWepSvAbEJUccMXwS/lXilLav1qM/PrCTdontw5/82OdC1zzyhDEsFVRGo rV6gXAQcm+Zai15hliiUQ8l8KRMtUl4=";
String value4= "20000";
/** Ecnryption and decryption of value1 **/
String encryptedValue1= symmetricEncrypt(value1, secretKey);
String decryptedValue1 = symmetricDecrypt(encryptedValue1, secretKey);
/** Decryption of enctypedValue1 **/
String decryptedValue2 = symmetricDecrypt(enctypedValue1, secretKey);
System.out.println(decryptedValue2);
/** Decryption of enctypedValue2 (Not decrypted)**/
String decryptedValue3 = symmetricDecrypt(enctypedValue2, secretKey);
System.out.println(decryptedValue3);
/** Ecnryption and decryption of value4 **/
String encryptedValue4= symmetricEncrypt(value4, secretKey);
String decryptedValue4 = symmetricDecrypt(encryptedValue4, secretKey);
В тестовой функции я написал следующие три тестовых примера.
- Новое значение (value1) шифруется и расшифровывается с помощью секретного ключа.
- Два примера зашифрованных значений (enctypedValue1, enctypedValue2), которые расшифровываются с использованием одного и того же секретного ключа. зашифрованное значение2, у которого возникла проблема при расшифровке с использованием того же секретного ключа.
- Новое значение (value4) шифруется и расшифровывается с помощью секретного ключа.
При расшифровке зашифрованного значения2 я получаю следующее исключение:
Illegal Block Size Exception Input length must be multiple of 16 when decrypting with padded cipher
Ниже приводится то, что я получил до сих пор.
Проблемное значение, кажется, имеет проблему при его декодировании, оно возвращает массив длины 81, который не может быть расшифрован?
Если бы эта проблема возникла, она должна была случиться со всеми значениями.
Является ли это проблемой, связанной со значением, или это что-то, связанное с заполнением, или оно может иметь различное поведение в разных браузерах, разных ОС?
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
Однако в вашем методе шифрования вы использовалиcipher = Cipher.getInstance("AES");
. Они должны быть одинаковыми. Добавьте дополнение к шифру в методе шифрования. - person Multithreader   schedule 10.07.2013