黄昏的阳光的gravatar头像
黄昏的阳光 2018-01-08 13:46:00
记一次JAVA与.net交互DES(CBC模式)加密/解密
一:DES加密概念
  DES是一种对称加密(Data Encryption Standard)算法。
  DES算法一般有两个关键点,第一个是加密算法,第二个是数据补位。
   
  二:DES算法模式
  ECB模式
  CBC模式
  这里我就不去介绍两种模式了,想要了解的童鞋请自行google
  由于.net默认采用的是CBC模式 所以以下示例代码都是针对CBC模式的。。(主要是公司都是.net开发 java人少说不上话 别个.net要怎么 就怎么 诶)
  java示例代码:
   
  ```
  import sun.misc.BASE64Decoder;
   
  import javax.crypto.Cipher;
  import javax.crypto.SecretKey;
  import javax.crypto.SecretKeyFactory;
  import javax.crypto.spec.DESKeySpec;
  import javax.crypto.spec.IvParameterSpec;
  import java.security.SecureRandom;
  import java.util.Base64;
   
  /**
  * <p>Description: DescUtil 与.net配合使用DES 加密/解密工具类 </p>
  * <p>Copyright: Copyright (c) 2016 </p>
  * <p>Company: @Melody</p>
  *
  * @author @Melody
  * @version 1.0
  * @date 2018/1/5
  */
  public class DescUtil {
   
  private static String KEY = "melody88";
  private final static byte[] IV = new byte[] {0x12, 0x34, 0x56, 0x78, 0x63, 0x86, 0x99, 0x29};
  private static String ENCODE = "utf-8";
  private static String DES = "DES";
   
  public static void main(String[] args)throws Exception{
  String str = encrypt2("Aa123456");
  System.err.println("加密结果是:" + str);
  System.err.println("解密结果是:" + decrypt(str));
  }
   
  /**
  * 加密字符串
  * @param src
  * @return
  * @throws Exception
  */
  public static String encrypt2(String src) throws Exception {
  src = src.replaceAll("@", "=");
  SecureRandom sr = new SecureRandom();
  DESKeySpec ks = new DESKeySpec(KEY.getBytes("UTF-8"));
  SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
  SecretKey sk = skf.generateSecret(ks);
  Cipher cip = Cipher.getInstance("DES/CBC/PKCS5Padding");//Cipher.getInstance("DES");
  IvParameterSpec iv2 = new IvParameterSpec(IV);
  cip.init(Cipher.ENCRYPT_MODE, sk, iv2);//IV的方式
  //cip.init(Cipher.ENCRYPT_MODE, sk, sr);//没有传递IV
  String dest = Base64.getEncoder().encodeToString(cip.doFinal(src.getBytes("UTF-8")));
  return dest.replaceAll("=", "@");
  }
   
   
  /**
  * 解密字符串
  * @param str
  * @return
  */
  public static String decrypt(String str) {
  try {
  str = str.replaceAll("@", "=");
  BASE64Decoder decoder = new BASE64Decoder();
  byte[] data = decoder.decodeBuffer(str);
   
  // 从原始密匙数据创建一个DESKeySpec对象
  DESKeySpec dks = new DESKeySpec(KEY.getBytes("UTF-8"));
  // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
  // 一个SecretKey对象
  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  SecretKey secretKey = keyFactory.generateSecret(dks);
  // .net DES 默认是CBC模式。。。。坑
  Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  IvParameterSpec iv2 = new IvParameterSpec(IV);
  // 用密匙初始化Cipher对象
  cipher.init(Cipher.DECRYPT_MODE, secretKey, iv2);
  // 正式执行解密操作
  byte decryptedData[] = cipher.doFinal(data);
  return new String(decryptedData);
  } catch (Exception e) {
  e.printStackTrace();
  }
  return null;
  }
   
  }
  ```
   

打赏

已有1人打赏

2048凯莱的gravatar头像
最近浏览
xujingyuan  LV1 2019年5月27日
BBooMM 2019年5月5日
暂无贡献等级
2048凯莱  LV9 2018年11月30日
黄昏的阳光  LV12 2018年1月8日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友