![](/img/trans.png)
[英]IllegalBlockSizeException when using aes/ecb/pkcs5padding to decrypt a byte array
[英]Cannot decrypt when encrypted using AES/ECB/PKCS5Padding - input length must be multiple of 16
我有沒有問題的加密代碼。 我可以解密用另一種語言加密的文本,但是現在需要在Java中解密。
private static final String AES = "AES";
private static final String CBC_BLOCK = "CBC";
private static final String ECB_BLOCK = "ECB";
private static final String PADDING = "PKCS5Padding";
private static final String AES_CBC_PCKS5_CIPHER_CONFIG = AES + "/" + CBC_BLOCK + "/" + PADDING;
private static final String AES_ECB_PCKS5_CIPHER_CONFIG = AES + "/" + ECB_BLOCK + "/" + PADDING;
public static String encryptInAesEcbPkcs5Padding(String salt, String message) {
String encryptedMessage = "";
SecretKeySpec key = null;
try {
if (message != null && !message.equals("")) {
key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), AES);
Cipher cipher = Cipher.getInstance(AES_ECB_PCKS5_CIPHER_CONFIG);
cipher.init(Cipher.ENCRYPT_MODE, key);
encryptedMessage = convertMessageToBase64(cipher.doFinal(message.getBytes(StandardCharsets.UTF_8)));
}
} catch (NoSuchAlgorithmException e) {
LOGGER.error(LogPreFix.ERROR + "No such algorithm [" + AES + "]", e);
} catch (NoSuchPaddingException e) {
LOGGER.error(LogPreFix.ERROR + "No such padding for algorithm [" + AES + "]", e);
} catch (IllegalBlockSizeException e) {
LOGGER.error(LogPreFix.ERROR + "Invalid block size for [" + AES + "/" + ECB_BLOCK + "]", e);
} catch (BadPaddingException e) {
LOGGER.error(LogPreFix.ERROR + "Invalid padding [" + PADDING + "]", e);
} catch (InvalidKeyException e) {
LOGGER.error("Invalid key [" + key + "]", e);
}
return encryptedMessage;
}
嘗試使用此代碼解密。 我使用與加密完全相同的鹽,並將加密器創建的字符串作為“消息”傳遞
public static String decrypt(String message, String salt) throws InvalidAlgorithmParameterException {
SecretKeySpec key = null;
String string = null;
try {
if (message != null && !message.equals("")) {
key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), AES);
Cipher cipher = Cipher.getInstance(AES_ECB_PCKS5_CIPHER_CONFIG);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
string = new String(decrypted);
}
} catch (NoSuchAlgorithmException e) {
LOGGER.error(LogPreFix.ERROR + "No such algorithm [" + AES + "]", e);
} catch (NoSuchPaddingException e) {
LOGGER.error(LogPreFix.ERROR + "No such padding for algorithm [" + AES + "]", e);
} catch (IllegalBlockSizeException e) {
LOGGER.error(LogPreFix.ERROR + "Invalid block size for [" + AES + "/" + ECB_BLOCK + "]", e);
} catch (BadPaddingException e) {
LOGGER.error(LogPreFix.ERROR + "Invalid padding [" + PADDING + "]", e);
} catch (InvalidKeyException e) {
LOGGER.error("Invalid key [" + key + "]", e);
}
return string;
}
但是我收到此錯誤,我在做什么錯? 好像它應該工作。 我嘗試用“ =”填充加密的文本,直到被16整除,但這會返回錯誤的填充錯誤。
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
首先進行Base64解碼,以反轉在原始加密過程中執行的Base64編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.