Input length must be multiple of 8 when decrypting with padded cipher\n\tat com.sun.crypto.provider.CipherCore.prepareInputBuffer
时间: 2023-10-25 19:04:04 浏览: 208
JCEPolicyJDK8.zip
这个错误通常发生在使用DES算法进行解密时,解密的数据长度不是8的倍数,并且使用了填充模式(如PKCS5Padding)。DES算法要求解密的数据长度必须是8的倍数,否则会抛出该异常。
解决方法是确保解密的数据长度与加密时的数据长度一致,并且是8的倍数。如果加密时使用了填充模式,解密时也需要使用相同的填充模式。
另外,还要确保使用相同的密钥和初始化向量进行解密操作。
以下是一个示例代码,展示了如何使用DES算法进行加密和解密:
```java
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.xml.bind.DatatypeConverter;
public class DESExample {
private static final String KEY = "0123456789abcdef"; // 16字节的密钥
public static void main(String[] args) throws Exception {
String plainText = "Hello, World!";
System.out.println("明文:" + plainText);
String encrypted = encrypt(plainText);
System.out.println("加密后的数据:" + encrypted);
String decrypted = decrypt(encrypted);
System.out.println("解密后的数据:" + decrypted);
}
public static String encrypt(String plainText) throws Exception {
DESKeySpec keySpec = new DESKeySpec(KEY.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return DatatypeConverter.printHexBinary(encryptedBytes); }
public static String decrypt(String encrypted) throws Exception {
DESKeySpec keySpec = new DESKeySpec(KEY.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(DatatypeConverter.parseHexBinary(encrypted));
return new String(decryptedBytes);
}
}
```
请确保解密时的密文与加密时的密文格式相同(例如,使用十六进制表示的字符串),并且长度是8的倍数。
阅读全文