DES解密问题:通过密钥、偏移量加密正常,解密出错:Given final block not properly padded.那位大神遇到过这种问题。在线等。
问题
package com.whiteink.pms.util;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.Key;
import java.util.Base64;
public class DESUtil {
static String key = "693207DB8148FBC9D8410179";
static String iv = "20190225";
static String encoding = "gb2312";
static String data = "{\"parkCode\":\"1\",\"plateNo\":\"京A11113\"}";
/**
* <一句话功能描述>:加密
* <功能详细描述>: 将明文加密
*
* @Param: key 密钥
* @Param keyiv 自定义偏移量(8字节)
* @Param data 明文
* @Return: byte[]
*/
public static String des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception {
Key deskey = null;
DESedeKeySpec spec = new DESedeKeySpec(key);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(keyiv);
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
return Base64.getEncoder().encodeToString(cipher.doFinal(data));
}
/**
* <一句话功能描述>:解密
* <功能详细描述>: 将密文转成明文
*
* @Param: key 密钥
* @Param keyiv 偏移量
* @Param data 明文
* @Return: byte[]
*/
public static String des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception {
System.out.println(new String(data));
DESedeKeySpec dks = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("desede");
SecretKey securekey = keyFactory.generateSecret(dks);
// 解密
Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
IvParameterSpec ivp = new IvParameterSpec(keyiv);
cipher.init(Cipher.DECRYPT_MODE, securekey, ivp);
return Base64.getEncoder().encodeToString(cipher.doFinal(data));
}
public static void main(String[] args) throws Exception{
String data = "{\"parkCode\":\"1\",\"plateNo\":\"京A11113\"}";
String mw = des3EncodeCBC(key.getBytes(), iv.getBytes(), data.getBytes("GB2312"));
System.out.println(des3DecodeCBC(key.getBytes(), iv.getBytes(), mw.getBytes()));
}
}
解决方案
===============解决方案===============
package com.whiteink.pms.util;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class DESUtil {
private static String encoding = "gb2312";
private static String data = "{\"parkCode\":\"1\",\"plateNo\":\"京A11113\"}";
public static String encrypt(String key, String iv, String data) throws Exception {
SecretKey secretKey = new SecretKeySpec(key.getBytes(), "desede");
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ips);
byte[] encryptData = cipher.doFinal(data.getBytes(encoding));
return Base64.getEncoder().encodeToString(encryptData);
}
public static void main(String[] args) throws Exception {
String key = "693207DB8148FBC9D8410179";
String iv = "20190225";
String encryption = encrypt(key, iv, data);
System.out.println(encryption);
String decryption = decrypt(key, iv, encryption);
System.out.println(decryption);
}
public static String decrypt(String key, String iv, String data) throws Exception {
SecretKey secretKey = new SecretKeySpec(key.getBytes(), "desede");
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretKey, ips);
byte[] decryptData = cipher.doFinal(Base64.getDecoder().decode(data.getBytes(encoding)));
return new String(decryptData, "GB2312");
}
}