Blame view

src/com/ectrip/cyt/utils/DesUtil.java 6.13 KB
3c2353cd   杜方   1、畅游通核销app源码提交;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
  package com.ectrip.cyt.utils;
  
  import java.security.Key;
  import java.security.SecureRandom;
  import java.security.Security;
  
  import javax.crypto.Cipher;
  import javax.crypto.SecretKey;
  import javax.crypto.SecretKeyFactory;
  import javax.crypto.spec.DESKeySpec;
  import javax.crypto.spec.IvParameterSpec;
  import javax.crypto.spec.SecretKeySpec;
  
  /**
   * DES加密和解密工具,可以对字符串进行加密和解密操作 
   *
   * @author hezhihong
   */
  public class DesUtil {
      /**
       * 加密工具
       */
      private static Cipher encryptCipher = null;
  
      /**
       * 解密工具
       */
      private static Cipher decryptCipher = null;
  
      private static final String ENCRYPT_KEY = "12345678";//8位密钥
      private static final String DES = "DES";
  
      /**
       * byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813 public static byte[]
       * hexStr2ByteArr(String strIn) 互为可逆的转换过程
       *
       * @param arrB 需要转换的byte数组
       * @return 转换后的字符串
       * @throws Exception 本方法不处理任何异常,所有异常全部抛出
       */
      public static String byteArr2HexStr(byte[] arrB) throws Exception {
          int iLen = arrB.length;
          // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
          StringBuffer sb = new StringBuffer(iLen * 2);
          for (int i = 0; i < iLen; i++) {
              int intTmp = arrB[i];
              // 把负数转换为正数
              while (intTmp < 0) {
                  intTmp = intTmp + 256;
              }
              // 小于0F的数需要在前面补0
              if (intTmp < 16) {
                  sb.append("0");
              }
              sb.append(Integer.toString(intTmp, 16));
          }
          return sb.toString();
      }
  
      /**
       * 将表示16进制值的字符串转换为byte数组, public static String byteArr2HexStr(byte[] arrB)
       * 互为可逆的转换过程
       *
       * @param strIn 需要转换的字符串
       * @return 转换后的byte数组
       * @throws Exception 本方法不处理任何异常,所有异常全部抛出
       */
      public static byte[] hexStr2ByteArr(String strIn) throws Exception {
          byte[] arrB = strIn.getBytes();
          int iLen = arrB.length;
  
          // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
          byte[] arrOut = new byte[iLen / 2];
          for (int i = 0; i < iLen; i = i + 2) {
              String strTmp = new String(arrB, i, 2);
              arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
          }
          return arrOut;
      }
  
  
      /**
       * 解密字节数组
       *
       * @param arrB 需解密的字节数组
       * @throws Exception
       */
      public static byte[] decrypt(byte[] arrB, String setkey) throws Exception {
          Security.addProvider(new com.sun.crypto.provider.SunJCE());
          Key key = getKey(setkey.getBytes());
          decryptCipher = Cipher.getInstance("DES");
  //        decryptCipher = Cipher.getInstance("DES/ECB/ZeroBytePadding");
          decryptCipher.init(Cipher.DECRYPT_MODE, key);
          return decryptCipher.doFinal(arrB);
      }
  
      /**
       * 解密字符串
       *
       * @param strIn 需解密的字符串
       * @return 解密后的字符串
       * @throws Exception
       */
      public static String decrypt(String strIn, String setkey) throws Exception {
          return new String(decrypt(hexStr2ByteArr(strIn), setkey));
      }
  
      /**
       * 从指定字符串生成密钥,密钥所需的字节数组长度为8 不足8位时后面补0,超出8位只取前8
       *
       * @param arrBTmp 构成该字符串的字节数组
       * @return 生成的密钥
       * @throws java.lang.Exception
       */
      private static Key getKey(byte[] arrBTmp) throws Exception {
          // 创建一个空的8位字节数组(默认值为0)
          byte[] arrB = new byte[8];
  
          // 将原始字节数组转换为8位
          for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
              arrB[i] = arrBTmp[i];
          }
          // 生成密钥
          Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
  
          return key;
      }
  
      /**
       *   * <对字符串进行Des加密,将字符串转化为字节数组解密>
       * <p>
       */
  
      public static byte[] desCrypto(byte[] datasource, String password) {
          try {
              SecureRandom random = new SecureRandom();
              DESKeySpec desKey = new DESKeySpec(password.getBytes());
              //创建一个密匙工厂,然后用它把DESKeySpec转换成
              SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
              SecretKey securekey = keyFactory.generateSecret(desKey);
              //Cipher对象实际完成加密操作
              Cipher cipher = Cipher.getInstance("DES");
  //            Cipher cipher = Cipher.getInstance("DES/ECB/ZeroBytePadding");
              //用密匙初始化Cipher对象
              cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
              //现在,获取数据并加密
              //正式执行加密操作
              return cipher.doFinal(datasource);
          } catch (Throwable e) {
              e.printStackTrace();
          }
          return null;
      }
  
      /**
       *   * <将加密的密文字节数组转化为明文字节数组>
       * <p>
       */
  
      public static byte[] decrypt1(byte[] src, String password) throws Exception {
  
          // DES算法要求有一个可信任的随机数源
          SecureRandom random = new SecureRandom();
          // 创建一个DESKeySpec对象
          DESKeySpec desKey = new DESKeySpec(password.getBytes());
          // 创建一个密匙工厂
          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
          // 将DESKeySpec对象转换成SecretKey对象
          SecretKey securekey = keyFactory.generateSecret(desKey);
          // Cipher对象实际完成解密操作
          Cipher cipher = Cipher.getInstance("DES");
  //        Cipher cipher = Cipher.getInstance("DES/ECB/ZeroBytePadding");
          // 用密匙初始化Cipher对象
          cipher.init(Cipher.DECRYPT_MODE, securekey, random);
          // 真正开始解密操作
          return cipher.doFinal(src);
      }
  
  }