DES 加密 解密

释放双眼,带上耳机,听听看~!

 


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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
1import java.security.NoSuchAlgorithmException;
2import java.security.SecureRandom;
3import javax.crypto.Cipher;
4import javax.crypto.KeyGenerator;
5import javax.crypto.SecretKey;
6import javax.crypto.SecretKeyFactory;
7import javax.crypto.spec.DESKeySpec;
8import javax.crypto.spec.IvParameterSpec;
9
10
11public class DESUtil
12{
13  private final static String algorithm = "DES";
14
15  /**
16   * @return DES算法密钥
17   */
18  public static byte[] generateKey()
19  {
20      try
21      {
22          // DES算法要求有一个可信任的随机数源
23          SecureRandom sr = new SecureRandom();
24          // 生成一个DES算法的KeyGenerator对象
25          KeyGenerator kg = KeyGenerator.getInstance(algorithm);
26          kg.init(sr);
27          // 生成密钥
28          SecretKey secretKey = kg.generateKey();
29          // 获取密钥数据
30          byte[] key = secretKey.getEncoded();
31          return key;
32      }
33      catch (NoSuchAlgorithmException e)
34      {
35          System.err.println("DESAlgorithmGenerateKeyError");
36          e.printStackTrace();
37      }
38      return null;
39  }
40
41  /**
42   * 加密函数
43   *
44   * @param data
45   *            加密数据
46   * @param key
47   *            密钥
48   * @return 返回加密后的数据
49   */
50  public static byte[] encrypt(byte[] data, byte[] key)
51  {
52      try
53      {
54          // DES算法要求有一个可信任的随机数源
55          SecureRandom sr = new SecureRandom();
56          // 从原始密钥数据创建DESKeySpec对象
57          DESKeySpec dks = new DESKeySpec(key);
58          // 创建一个密匙工厂,然后用它把DESKeySpec转换成
59          // 一个SecretKey对象
60          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
61          SecretKey secretKey = keyFactory.generateSecret(dks);
62          // using DES in ECB mode
63          Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
64          // 用密匙初始化Cipher对象
65          cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
66          // 执行加密操作
67          byte encryptedData[] = cipher.doFinal(data);
68          return encryptedData;
69      }
70      catch (Exception e)
71      {
72          System.err.println("DESAlgorithmEncryptError");
73          e.printStackTrace();
74      }
75      return null;
76  }
77
78  /**
79   * 解密函数
80   *
81   * @param data
82   *            解密数据
83   * @param key
84   *            密钥
85   * @return 返回解密后的数据
86   */
87  public static byte[] decrypt(byte[] data, byte[] key) throws Exception
88  {
89      try
90      {
91          // DES算法要求有一个可信任的随机数源
92          SecureRandom sr = new SecureRandom();
93          // byte rawKeyData[] = /* 用某种方法获取原始密匙数据 */;
94          // 从原始密匙数据创建一个DESKeySpec对象
95          DESKeySpec dks = new DESKeySpec(key);
96          // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
97          // 一个SecretKey对象
98          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
99          SecretKey secretKey = keyFactory.generateSecret(dks);
100         // using DES in ECB mode
101         Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
102         // 用密匙初始化Cipher对象
103         cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);
104         // 正式执行解密操作
105         byte decryptedData[] = cipher.doFinal(data);
106         return decryptedData;
107     }
108     catch (Exception e)
109     {
110         // System.err.println("DESAlgorithmDecryptError");
111         // e.printStackTrace();
112         throw e;
113     }
114 }
115
116 /**
117  * 加密函数--CBC模式
118  *
119  * @param data
120  *            加密数据
121  * @param key
122  *            密钥
123  * @return 返回加密后的数据
124  */
125 public static byte[] CBCEncrypt(byte[] data, byte[] key, byte[] iv)
126 {
127     try
128     {
129         // 从原始密钥数据创建DESKeySpec对象
130         DESKeySpec dks = new DESKeySpec(key);
131         // 创建一个密匙工厂,然后用它把DESKeySpec转换成
132         // 一个SecretKey对象
133         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
134         SecretKey secretKey = keyFactory.generateSecret(dks);
135         // Cipher对象实际完成加密操作
136         Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
137         // 若采用NoPadding模式,data长度必须是8的倍数
138         // Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");
139         // 用密匙初始化Cipher对象
140         // IvParameterSpec param = new IvParameterSpec(iv);
141         cipher.init(Cipher.ENCRYPT_MODE, secretKey);
142         // 执行加密操作
143         byte encryptedData[] = cipher.doFinal(data);
144         return encryptedData;
145     }
146     catch (Exception e)
147     {
148         System.err.println("DESCBCAlgorithmEncryptError");
149         e.printStackTrace();
150     }
151     return null;
152 }
153
154 /**
155  * 解密函数--CBC模式
156  *
157  * @param data
158  *            解密数据
159  * @param key
160  *            密钥
161  * @return 返回解密后的数据
162  */
163 public static byte[] CBCDecrypt(byte[] data, byte[] key, byte[] iv)
164 {
165     try
166     {
167         // 从原始密匙数据创建一个DESKeySpec对象
168         DESKeySpec dks = new DESKeySpec(key);
169         // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
170         // 一个SecretKey对象
171         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
172         SecretKey secretKey = keyFactory.generateSecret(dks);
173         // using DES in CBC mode
174         Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
175         // 若采用NoPadding模式,data长度必须是8的倍数
176         // Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");
177
178         // 用密匙初始化Cipher对象
179         IvParameterSpec param = new IvParameterSpec(iv);
180         cipher.init(Cipher.DECRYPT_MODE, secretKey, param);
181         // cipher.init(Cipher.DECRYPT_MODE, secretKey);
182         // 正式执行解密操作
183         byte decryptedData[] = cipher.doFinal(data);
184         return decryptedData;
185     }
186     catch (Exception e)
187     {
188         System.err.println("DESCBCAlgorithmDecryptError");
189         e.printStackTrace();
190     }
191     return null;
192 }
193
194 public static void main(String[] args) throws Exception
195 {
196     // try {
197     // byte[] key = "11111111".getBytes();
198     // byte[] iv = "22222222".getBytes();
199     // byte[] data = DESUtil.encrypt("ebc mode test 中文".getBytes(), key);
200     // System.out.print("EBC mode:");
201     // System.out.println(new String(DESUtil.decrypt(data, key)));
202     //          
203     // System.out.print("CBC mode:");
204     // data = DESUtil.CBCEncrypt("cbc mode test".getBytes(), key, iv);
205     // System.out.println(new String(DESUtil.CBCDecrypt(data, key, iv)));
206     //            
207     // } catch (Exception e) {
208     // e.printStackTrace();
209     // }
210     // for(int i=0;i<100;i++){
211     // System.out.println(ByteUtil.bytesToHexstr(DESUtil.generateKey()));
212     // }
213     String s = "";
214     String encryptString = "68d2455f8cf9d10055a532642b2650bfb1204e0e9a6dff146855a95256a8ce63e44380c06288413aa62e43089b1c94db257ea4125cafa9486038df9fbe2e2e02820f15bc155aab97357583a11003ec02b39f39c40c2bc6d04fc23def85e0ae3ea0efb2511add385d2b21aa52795fed816c6a420d4f560d0c";
215     encryptString = "68d2455f8cf9d10055a532642b2650bfb1204e0e9a6dff146855a95256a8ce63e44380c06288413aa62e43089b1c94db257ea4125cafa9486038df9fbe2e2e02820f15bc155aab97357583a11003ec02b39f39c40c2bc6d04fc23def85e0ae3ea0efb2511add385d2b21aa52795fed816c6a420d4f560d0c";
216     String key = "ac1e7a28";
217     byte[] encryptByte = ByteUtil.hexstrTobytes(encryptString);
218     System.out.println();
219     System.out.println(new String(encryptByte));
220     byte[] res = null;
221     long start = System.currentTimeMillis();
222
223     res = DESUtil.decrypt(encryptByte, key.getBytes());
224     long end = System.currentTimeMillis();
225     System.out.println(end - start);
226     System.out.println(new String(res));
227 }
228}
229

 

 

 

 

 

给TA打赏
共{{data.count}}人
人已打赏
安全技术安全运维

Windows服务器如何发现被黑

2018-5-20 12:24:31

安全技术

详解Node.js API系列 Crypto加密模块

2021-12-21 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索