美文网首页
3DES企业级加密与解密

3DES企业级加密与解密

作者: 不二不二熊 | 来源:发表于2019-09-28 22:16 被阅读0次
一、加密方案
  1. HTTP请求参数以json密文传输
  2. 使用3DES方式加密,3DES(data,KEY,IV),其中data代表明文,KEY代表密钥,IV代表偏移量
  3. 编码采用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);
    }

相关文章

网友评论

      本文标题:3DES企业级加密与解密

      本文链接:https://www.haomeiwen.com/subject/virwyctx.html