Skip to content

Commit 9f25af5

Browse files
committed
AES搞定
1 parent 90066e2 commit 9f25af5

3 files changed

Lines changed: 247 additions & 1 deletion

File tree

README.md

Lines changed: 125 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,128 @@ public static void main(String[] args) {
209209
- aes -> 16字节
210210
- 加解密使用的初始化向量相同
211211

212-
## DES
212+
- DES加密示例代码如下:
213+
- DES加密,key的大小必须是8个字节
214+
- 如果没有指定分组密码模式和填充模式,ECB/PKCS5Padding就是默认值
215+
- 如果指定分组密码模式为CBC,必须指定初始向量,初始向量中密钥的长度必须是8个字节
216+
- 如果没有指定填充模式为NoPadding模式,原文的长度必须是8个字节的整倍数
217+
```$xslt
218+
public class DESDemo {
219+
// DES加密算法,key的大小必须是8个字节
220+
public static void main(String[] args) throws Exception {
221+
String input = "frank";
222+
String key = "12345678";
223+
// 指定获取Cipher的算法,如果没有指定分组密码模式和填充模式,ECB/PKCS5Padding就是默认值
224+
// CBC模式,必须指定初始向量,初始向量中密钥的长度必须是8个字节
225+
// NoPadding模式,原文的长度必须是8个字节的整倍数
226+
// String transformation = "DES";
227+
String transformation = "DES/CBC/PKCS5Padding";
228+
// 指定获取密钥的算法
229+
String algorithm = "DES";
230+
String encryptDES = DESEncrypt(input, key, transformation, algorithm);
231+
System.out.println("加密:" + encryptDES);
232+
String s = DESDecrypt(encryptDES, key, transformation, algorithm);
233+
System.out.println("解密:" + s);
234+
}
235+
236+
/**
237+
*
238+
* @param input 明文
239+
* @param key 密钥(DES,密钥的长度必须是8个字节)
240+
* @param transformation 获取Cipher对象的算法
241+
* @param algorithm 获取密钥的算法
242+
* @return 返回密文
243+
* @throws Exception
244+
*/
245+
private static String DESEncrypt(String input, String key, String transformation, String algorithm) throws Exception {
246+
// 1,获取Cipher对象
247+
Cipher cipher = Cipher.getInstance(transformation);
248+
// 指定密钥规则
249+
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
250+
// 2.初始化向量的秘钥长度需要根据算法而定,des 8个字节长度 aes 16个字节长度
251+
//这里为了方便,统一使用传来的秘钥
252+
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
253+
cipher.init(Cipher.ENCRYPT_MODE, sks, iv);
254+
// cipher.init(Cipher.ENCRYPT_MODE, sks);
255+
// 3. 加密
256+
byte[] bytes = cipher.doFinal(input.getBytes());
257+
// 对数据进行Base64编码
258+
String encode = Base64.encode(bytes);
259+
return encode;
260+
}
261+
262+
263+
private static String DESDecrypt(String input, String key, String transformation, String algorithm) throws Exception {
264+
Cipher cipher = Cipher.getInstance(transformation);
265+
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
266+
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
267+
cipher.init(Cipher.DECRYPT_MODE, sks, iv);
268+
// cipher.init(Cipher.DECRYPT_MODE, sks);
269+
byte[] bytes = cipher.doFinal(Base64.decode(input));
270+
return new String(bytes);
271+
}
272+
}
273+
```
274+
- AES加密示例代码如下(AES和DES加密高度类似)
275+
- AES加密,key的大小必须是16个字节
276+
- 如果没有指定分组密码模式和填充模式,ECB/PKCS5Padding就是默认值
277+
- 如果没有指定分组密码模式为CBC,必须指定初始向量,初始向量中密钥的长度必须是16个字节
278+
- 如果没有指定填充模式为NoPadding模式,原文的长度必须是16个字节的整倍数
279+
```$xslt
280+
public class AESDemo {
281+
// AES加密算法,key的大小必须是16个字节
282+
public static void main(String[] args) throws Exception {
283+
String input = "frank";
284+
String key = "1234567887654321";
285+
// 指定获取Cipher的算法,如果没有指定分组密码模式和填充模式,ECB/PKCS5Padding就是默认值
286+
// CBC模式,必须指定初始向量,初始向量中密钥的长度必须是16个字节
287+
// NoPadding模式,原文的长度必须是16个字节的整倍数
288+
// String transformation = "AES";
289+
String transformation = "AES/CBC/PKCS5Padding";
290+
// 指定获取密钥的算法
291+
String algorithm = "AES";
292+
String encryptAES = AESEncrypt(input, key, transformation, algorithm);
293+
System.out.println("加密:" + encryptAES);
294+
String s = AESDecrypt(encryptAES, key, transformation, algorithm);
295+
System.out.println("解密:" + s);
296+
}
297+
298+
/**
299+
*
300+
* @param input 明文
301+
* @param key 密钥(AES,密钥的长度必须是16个字节)
302+
* @param transformation 获取Cipher对象的算法
303+
* @param algorithm 获取密钥的算法
304+
* @return 返回密文
305+
* @throws Exception
306+
*/
307+
private static String AESEncrypt(String input, String key, String transformation, String algorithm) throws Exception {
308+
// 1,获取Cipher对象
309+
Cipher cipher = Cipher.getInstance(transformation);
310+
// 指定密钥规则
311+
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
312+
// 2.初始化向量的秘钥长度需要根据算法而定,des 8个字节长度 aes 16个字节长度
313+
//这里为了方便,统一使用传来的秘钥
314+
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
315+
cipher.init(Cipher.ENCRYPT_MODE, sks, iv);
316+
// cipher.init(Cipher.ENCRYPT_MODE, sks);
317+
// 3. 加密
318+
byte[] bytes = cipher.doFinal(input.getBytes());
319+
// 对数据进行Base64编码
320+
String encode = Base64.encode(bytes);
321+
return encode;
322+
}
323+
324+
325+
private static String AESDecrypt(String input, String key, String transformation, String algorithm) throws Exception {
326+
Cipher cipher = Cipher.getInstance(transformation);
327+
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
328+
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
329+
cipher.init(Cipher.DECRYPT_MODE, sks, iv);
330+
// cipher.init(Cipher.DECRYPT_MODE, sks);
331+
byte[] bytes = cipher.doFinal(Base64.decode(input));
332+
return new String(bytes);
333+
}
334+
}
335+
336+
```

src/main/java/AESDemo.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
2+
3+
import javax.crypto.Cipher;
4+
import javax.crypto.spec.IvParameterSpec;
5+
import javax.crypto.spec.SecretKeySpec;
6+
7+
public class AESDemo {
8+
// AES加密算法,key的大小必须是16个字节
9+
public static void main(String[] args) throws Exception {
10+
String input = "frank";
11+
String key = "1234567887654321";
12+
// 指定获取Cipher的算法,如果没有指定分组密码模式和填充模式,ECB/PKCS5Padding就是默认值
13+
// CBC模式,必须指定初始向量,初始向量中密钥的长度必须是16个字节
14+
// NoPadding模式,原文的长度必须是16个字节的整倍数
15+
// String transformation = "AES";
16+
String transformation = "AES/CBC/PKCS5Padding";
17+
// 指定获取密钥的算法
18+
String algorithm = "AES";
19+
String encryptAES = AESEncrypt(input, key, transformation, algorithm);
20+
System.out.println("加密:" + encryptAES);
21+
String s = AESDecrypt(encryptAES, key, transformation, algorithm);
22+
System.out.println("解密:" + s);
23+
}
24+
25+
/**
26+
*
27+
* @param input 明文
28+
* @param key 密钥(AES,密钥的长度必须是16个字节)
29+
* @param transformation 获取Cipher对象的算法
30+
* @param algorithm 获取密钥的算法
31+
* @return 返回密文
32+
* @throws Exception
33+
*/
34+
private static String AESEncrypt(String input, String key, String transformation, String algorithm) throws Exception {
35+
// 1,获取Cipher对象
36+
Cipher cipher = Cipher.getInstance(transformation);
37+
// 指定密钥规则
38+
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
39+
// 2.初始化向量的秘钥长度需要根据算法而定,des 8个字节长度 aes 16个字节长度
40+
//这里为了方便,统一使用传来的秘钥
41+
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
42+
cipher.init(Cipher.ENCRYPT_MODE, sks, iv);
43+
// cipher.init(Cipher.ENCRYPT_MODE, sks);
44+
// 3. 加密
45+
byte[] bytes = cipher.doFinal(input.getBytes());
46+
// 对数据进行Base64编码
47+
String encode = Base64.encode(bytes);
48+
return encode;
49+
}
50+
51+
52+
private static String AESDecrypt(String input, String key, String transformation, String algorithm) throws Exception {
53+
Cipher cipher = Cipher.getInstance(transformation);
54+
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
55+
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
56+
cipher.init(Cipher.DECRYPT_MODE, sks, iv);
57+
// cipher.init(Cipher.DECRYPT_MODE, sks);
58+
byte[] bytes = cipher.doFinal(Base64.decode(input));
59+
return new String(bytes);
60+
}
61+
}

src/main/java/DESDemo.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
2+
3+
import javax.crypto.Cipher;
4+
import javax.crypto.spec.IvParameterSpec;
5+
import javax.crypto.spec.SecretKeySpec;
6+
7+
public class DESDemo {
8+
// DES加密算法,key的大小必须是8个字节
9+
public static void main(String[] args) throws Exception {
10+
String input = "frank";
11+
String key = "12345678";
12+
// 指定获取Cipher的算法,如果没有指定分组密码模式和填充模式,ECB/PKCS5Padding就是默认值
13+
// CBC模式,必须指定初始向量,初始向量中密钥的长度必须是8个字节
14+
// NoPadding模式,原文的长度必须是8个字节的整倍数
15+
// String transformation = "DES";
16+
String transformation = "DES/CBC/PKCS5Padding";
17+
// 指定获取密钥的算法
18+
String algorithm = "DES";
19+
String encryptDES = DESEncrypt(input, key, transformation, algorithm);
20+
System.out.println("加密:" + encryptDES);
21+
String s = DESDecrypt(encryptDES, key, transformation, algorithm);
22+
System.out.println("解密:" + s);
23+
}
24+
25+
/**
26+
*
27+
* @param input 明文
28+
* @param key 密钥(DES,密钥的长度必须是8个字节)
29+
* @param transformation 获取Cipher对象的算法
30+
* @param algorithm 获取密钥的算法
31+
* @return 返回密文
32+
* @throws Exception
33+
*/
34+
private static String DESEncrypt(String input, String key, String transformation, String algorithm) throws Exception {
35+
// 1,获取Cipher对象
36+
Cipher cipher = Cipher.getInstance(transformation);
37+
// 指定密钥规则
38+
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
39+
// 2.初始化向量的秘钥长度需要根据算法而定,des 8个字节长度 aes 16个字节长度
40+
//这里为了方便,统一使用传来的秘钥
41+
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
42+
cipher.init(Cipher.ENCRYPT_MODE, sks, iv);
43+
// cipher.init(Cipher.ENCRYPT_MODE, sks);
44+
// 3. 加密
45+
byte[] bytes = cipher.doFinal(input.getBytes());
46+
// 对数据进行Base64编码
47+
String encode = Base64.encode(bytes);
48+
return encode;
49+
}
50+
51+
52+
private static String DESDecrypt(String input, String key, String transformation, String algorithm) throws Exception {
53+
Cipher cipher = Cipher.getInstance(transformation);
54+
SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
55+
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
56+
cipher.init(Cipher.DECRYPT_MODE, sks, iv);
57+
// cipher.init(Cipher.DECRYPT_MODE, sks);
58+
byte[] bytes = cipher.doFinal(Base64.decode(input));
59+
return new String(bytes);
60+
}
61+
}

0 commit comments

Comments
 (0)