AES對稱加密和解密代碼詳細介紹,供大家參考,具體內容如下
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
|
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Base64; import java.util.Scanner; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /* * AES對稱加密和解密 */ public class SymmetricEncoder { /* * 加密 * 1.構造密鑰生成器 * 2.根據ecnodeRules規則初始化密鑰生成器 * 3.產生密鑰 * 4.創建和初始化密碼器 * 5.內容加密 * 6.返回字符串 */ public static String AESEncode(String encodeRules,String content){ try { //1.構造密鑰生成器,指定為AES算法,不區分大小寫 KeyGenerator keygen=KeyGenerator.getInstance("AES"); //2.根據ecnodeRules規則初始化密鑰生成器 //生成一個128位的隨機源,根據傳入的字節數組 keygen.init(128, new SecureRandom(encodeRules.getBytes())); //3.產生原始對稱密鑰 SecretKey original_key=keygen.generateKey(); //4.獲得原始對稱密鑰的字節數組 byte [] raw=original_key.getEncoded(); //5.根據字節數組生成AES密鑰 SecretKey key=new SecretKeySpec(raw, "AES"); //6.根據指定算法AES自成密碼器 Cipher cipher=Cipher.getInstance("AES"); //7.初始化密碼器,第一個參數為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個參數為使用的KEY cipher.init(Cipher.ENCRYPT_MODE, key); //8.獲取加密內容的字節數組(這里要設置為utf-8)不然內容中如果有中文和英文混合中文就會解密為亂碼 byte [] byte_encode=content.getBytes("utf-8"); //9.根據密碼器的初始化方式--加密:將數據加密 byte [] byte_AES=cipher.doFinal(byte_encode); //10.將加密后的數據轉換為字符串 //這里用Base64Encoder中會找不到包 //解決辦法: //在項目的Build path中先移除JRE System Library,再添加庫JRE System Library,重新編譯后就一切正常了。 String AES_encode=new String(new BASE64Encoder().encode(byte_AES)); //11.將字符串返回 return AES_encode; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //如果有錯就返加nulll return null; } /* * 解密 * 解密過程: * 1.同加密1-4步 * 2.將加密后的字符串反紡成byte[]數組 * 3.將加密內容解密 */ public static String AESDncode(String encodeRules,String content){ try { //1.構造密鑰生成器,指定為AES算法,不區分大小寫 KeyGenerator keygen=KeyGenerator.getInstance("AES"); //2.根據ecnodeRules規則初始化密鑰生成器 //生成一個128位的隨機源,根據傳入的字節數組 keygen.init(128, new SecureRandom(encodeRules.getBytes())); //3.產生原始對稱密鑰 SecretKey original_key=keygen.generateKey(); //4.獲得原始對稱密鑰的字節數組 byte [] raw=original_key.getEncoded(); //5.根據字節數組生成AES密鑰 SecretKey key=new SecretKeySpec(raw, "AES"); //6.根據指定算法AES自成密碼器 Cipher cipher=Cipher.getInstance("AES"); //7.初始化密碼器,第一個參數為加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二個參數為使用的KEY cipher.init(Cipher.DECRYPT_MODE, key); //8.將加密并編碼后的內容解碼成字節數組 byte [] byte_content= new BASE64Decoder().decodeBuffer(content); /* * 解密 */ byte [] byte_decode=cipher.doFinal(byte_content); String AES_decode=new String(byte_decode,"utf-8"); return AES_decode; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } //如果有錯就返加nulll return null; } public static void main(String[] args) { SymmetricEncoder se=new SymmetricEncoder(); Scanner scanner=new Scanner(System.in); /* * 加密 */ System.out.println("使用AES對稱加密,請輸入加密的規則"); String encodeRules=scanner.next(); System.out.println("請輸入要加密的內容:"); String content = scanner.next(); System.out.println("根據輸入的規則"+encodeRules+"加密后的密文是:"+se.AESEncode(encodeRules, content)); /* * 解密 */ System.out.println( "使用AES對稱解密,請輸入加密的規則:(須與加密相同)" ); encodeRules=scanner.next(); System.out.println( "請輸入要解密的內容(密文):" ); content = scanner.next(); System.out.println( "根據輸入的規則" +encodeRules+ "解密后的明文是:" +se.AESDncode(encodeRules, content)); } } |
測試結果:
使用AES對稱加密,請輸入加密的規則
使用AES對稱加密
請輸入要加密的內容:
使用AES對稱加密
根據輸入的規則使用AES對稱加密加密后的密文是:Z0NwrNPHghgXHN0CqjLS58YCjhMcBfeR33RWs7Lw+AY=
使用AES對稱解密,請輸入加密的規則:(須與加密相同)
使用AES對稱加密
請輸入要解密的內容(密文):
Z0NwrNPHghgXHN0CqjLS58YCjhMcBfeR33RWs7Lw+AY=
根據輸入的規則使用AES對稱加密解密后的明文是:使用AES對稱加密
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。