一、加密方案
- HTTP请求参数以json密文传输
- 使用3DES方式加密,3DES(data,KEY,IV),其中data代表明文,KEY代表密钥,IV代表偏移量
- 编码采用Encoding.GB2312.GetBytes;填充方式采用 PKCS5
二、加密示例
- 明文
{"plateNo":"12"}
- 加密后的数据
1RSTFTQ6eD1yq25qu3NRU3B45lXMw9Tt
三、加密
/**
* <一句话功能描述>:加密
* <功能详细描述>: 将明文加密
*
* @Param: key 密钥
* @Param keyiv 自定义偏移量(8字节)
* @Param data 明文
* @Return: byte[]
*/
public static byte[] 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);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
- 解密
/**
* <一句话功能描述>:解密
* <功能详细描述>: 将密文转成明文
*
* @Param: key 密钥
* @Param keyiv 偏移量
* @Param data 明文
* @Return: byte[]
*/
public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception {
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 cipher.doFinal(data);
}
四、测试
实体类
@Data
public class CarEntity {
private String plateNo;
private String parkCode;
}
加密与解密
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String iv = simpleDateFormat.format(new Date());
//当前日期作为偏移量
String replace = iv.replace("-", "");
//密钥自定义
String key = "693207DB8148FBC9D8410179";
//自定义实体类,稍后转为json
CarEntity carEntity = new CarEntity();
carEntity.setPlateNo("12");
String jsonString = JSONObject.toJSONString(carEntity);
//按照需求使用GB2312编码
byte[] bytes = EncodeUtil.des3EncodeCBC(key.getBytes(), replace.getBytes(), jsonString.getBytes("GB2312"));
String string = Base64.encodeBase64String(bytes);
System.out.println("加密后的数据为" + string);
//解密
byte[] base64 = Base64.decodeBase64(string);
byte[] cbc = EncodeUtil.des3DecodeCBC(key.getBytes(), replace.getBytes(), base64);
//gb2312编码
String gb2312 = new String(cbc, "gb2312");
System.out.println("还原后的明文为"+gb2312);
}
网友评论