AES對稱加密和解密代碼詳細(xì)介紹,供大家參考,具體內(nèi)容如下
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.構(gòu)造密鑰生成器 * 2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器 * 3.產(chǎn)生密鑰 * 4.創(chuàng)建和初始化密碼器 * 5.內(nèi)容加密 * 6.返回字符串 */ public static String AESEncode(String encodeRules,String content){ try { //1.構(gòu)造密鑰生成器,指定為AES算法,不區(qū)分大小寫 KeyGenerator keygen=KeyGenerator.getInstance("AES"); //2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器 //生成一個(gè)128位的隨機(jī)源,根據(jù)傳入的字節(jié)數(shù)組 keygen.init(128, new SecureRandom(encodeRules.getBytes())); //3.產(chǎn)生原始對稱密鑰 SecretKey original_key=keygen.generateKey(); //4.獲得原始對稱密鑰的字節(jié)數(shù)組 byte [] raw=original_key.getEncoded(); //5.根據(jù)字節(jié)數(shù)組生成AES密鑰 SecretKey key=new SecretKeySpec(raw, "AES"); //6.根據(jù)指定算法AES自成密碼器 Cipher cipher=Cipher.getInstance("AES"); //7.初始化密碼器,第一個(gè)參數(shù)為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個(gè)參數(shù)為使用的KEY cipher.init(Cipher.ENCRYPT_MODE, key); //8.獲取加密內(nèi)容的字節(jié)數(shù)組(這里要設(shè)置為utf-8)不然內(nèi)容中如果有中文和英文混合中文就會(huì)解密為亂碼 byte [] byte_encode=content.getBytes("utf-8"); //9.根據(jù)密碼器的初始化方式--加密:將數(shù)據(jù)加密 byte [] byte_AES=cipher.doFinal(byte_encode); //10.將加密后的數(shù)據(jù)轉(zhuǎn)換為字符串 //這里用Base64Encoder中會(huì)找不到包 //解決辦法: //在項(xiàng)目的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(); } //如果有錯(cuò)就返加nulll return null; } /* * 解密 * 解密過程: * 1.同加密1-4步 * 2.將加密后的字符串反紡成byte[]數(shù)組 * 3.將加密內(nèi)容解密 */ public static String AESDncode(String encodeRules,String content){ try { //1.構(gòu)造密鑰生成器,指定為AES算法,不區(qū)分大小寫 KeyGenerator keygen=KeyGenerator.getInstance("AES"); //2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器 //生成一個(gè)128位的隨機(jī)源,根據(jù)傳入的字節(jié)數(shù)組 keygen.init(128, new SecureRandom(encodeRules.getBytes())); //3.產(chǎn)生原始對稱密鑰 SecretKey original_key=keygen.generateKey(); //4.獲得原始對稱密鑰的字節(jié)數(shù)組 byte [] raw=original_key.getEncoded(); //5.根據(jù)字節(jié)數(shù)組生成AES密鑰 SecretKey key=new SecretKeySpec(raw, "AES"); //6.根據(jù)指定算法AES自成密碼器 Cipher cipher=Cipher.getInstance("AES"); //7.初始化密碼器,第一個(gè)參數(shù)為加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二個(gè)參數(shù)為使用的KEY cipher.init(Cipher.DECRYPT_MODE, key); //8.將加密并編碼后的內(nèi)容解碼成字節(jié)數(shù)組 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(); } //如果有錯(cuò)就返加nulll return null; } public static void main(String[] args) { SymmetricEncoder se=new SymmetricEncoder(); Scanner scanner=new Scanner(System.in); /* * 加密 */ System.out.println("使用AES對稱加密,請輸入加密的規(guī)則"); String encodeRules=scanner.next(); System.out.println("請輸入要加密的內(nèi)容:"); String content = scanner.next(); System.out.println("根據(jù)輸入的規(guī)則"+encodeRules+"加密后的密文是:"+se.AESEncode(encodeRules, content)); /* * 解密 */ System.out.println( "使用AES對稱解密,請輸入加密的規(guī)則:(須與加密相同)" ); encodeRules=scanner.next(); System.out.println( "請輸入要解密的內(nèi)容(密文):" ); content = scanner.next(); System.out.println( "根據(jù)輸入的規(guī)則" +encodeRules+ "解密后的明文是:" +se.AESDncode(encodeRules, content)); } } |
測試結(jié)果:
使用AES對稱加密,請輸入加密的規(guī)則
使用AES對稱加密
請輸入要加密的內(nèi)容:
使用AES對稱加密
根據(jù)輸入的規(guī)則使用AES對稱加密加密后的密文是:Z0NwrNPHghgXHN0CqjLS58YCjhMcBfeR33RWs7Lw+AY=
使用AES對稱解密,請輸入加密的規(guī)則:(須與加密相同)
使用AES對稱加密
請輸入要解密的內(nèi)容(密文):
Z0NwrNPHghgXHN0CqjLS58YCjhMcBfeR33RWs7Lw+AY=
根據(jù)輸入的規(guī)則使用AES對稱加密解密后的明文是:使用AES對稱加密
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。