本文實(shí)例講述了java使用Hex編碼解碼實(shí)現(xiàn)Aes加密解密功能。分享給大家供大家參考,具體如下:
這里的Aes加密解密方法使用Hex進(jìn)行了編碼解碼
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
|
package com.baidu.wallet.bdwallet.utils; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; public class Test { private static final String AES= "AES" ; private static final String UTF8= "UTF-8" ; /** * AES加密 * @param content * @param pkey * @return * @throws DecoderException */ private static byte [] encrypt(String content, String pkey) throws DecoderException { try { String private_key=pkey; byte [] encodeFormat= null ; try { //秘鑰 Hex解碼為什么秘鑰要進(jìn)行解碼,因?yàn)槊罔€是某個(gè)秘鑰明文進(jìn)行了Hex編碼后的值,所以在使用的時(shí)候要進(jìn)行解碼 encodeFormat = Hex.decodeHex(private_key.toCharArray()); } catch (DecoderException e) { e.printStackTrace(); } SecretKeySpec key = new SecretKeySpec(encodeFormat, AES); // Cipher對(duì)象實(shí)際完成加密操作 Cipher cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" ); // 加密內(nèi)容進(jìn)行編碼 byte [] byteContent = content.getBytes(UTF8); // 用密匙初始化Cipher對(duì)象 cipher.init(Cipher.ENCRYPT_MODE, key); // 正式執(zhí)行加密操作 byte [] result = cipher.doFinal(byteContent); return result; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null ; } /** * AES解密 * @param contents * @param password * @return * @throws DecoderException */ private static byte [] decrypt(String contents, String password) throws DecoderException { try { //密文使用Hex解碼 byte []content = Hex.decodeHex(contents.toCharArray()); //秘鑰 Hex解碼為什么秘鑰要進(jìn)行解碼,因?yàn)槊罔€是某個(gè)秘鑰明文進(jìn)行了Hex編碼后的值,所以在使用的時(shí)候要進(jìn)行解碼 byte [] encodeFormat = Hex.decodeHex(password.toCharArray()); SecretKeySpec key = new SecretKeySpec(encodeFormat, AES); // Cipher對(duì)象實(shí)際完成加密操作 Cipher cipher = Cipher.getInstance(AES); // 用密匙初始化Cipher對(duì)象 cipher.init(Cipher.DECRYPT_MODE, key); // 正式執(zhí)行解密操作 byte [] result = cipher.doFinal(content); return result; } 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(); } return null ; } /** * Aes加密 * @param context 明文 * @param private_key 秘鑰 * @return * @throws DecoderException */ public static String encryption(String context,String private_key) throws DecoderException{ //加密后的明文也就變成了密文 byte [] encryptResult = encrypt(context, private_key); //密碼文Hex編碼 String encryptResultStr = Hex.encodeHexString(encryptResult); return encryptResultStr; } /** * Aes解密 * @param context 密文 * @param private_key 秘鑰 * @return * @throws DecoderException * @throws UnsupportedEncodingException */ public static String decryption(String context,String private_key) throws DecoderException, UnsupportedEncodingException{ //這里的密文解密前先進(jìn)行了Hex解碼 byte [] decryptResult = decrypt(context, private_key); String result = new String(decryptResult, UTF8); return result; } public static void main(String[] args) throws UnsupportedEncodingException, DecoderException { //加密內(nèi)容 String content = "123456787654321" ; //AES加密解密秘鑰 String password = "這個(gè)值一般都是給定的,雙發(fā)都知道" ; // 加密 System.out.println( "加密前:" + content); // 調(diào)用加密方法 String encryptResultStr = encryption(content, password); System.out.println( "加密后:" + encryptResultStr); // 調(diào)用解密方法 String result = decryption(encryptResultStr, password); // 解密內(nèi)容進(jìn)行解碼 System.out.println( "解密后:" + result); } } |
這個(gè)方法在正式的項(xiàng)目中已經(jīng)在使用木有問題,注意這里的AES加密解密你要要對(duì)哦……
上面使用的就是org.apache.commons.codec.binary.Hex這個(gè)類的方法,在maven中配置如下:
1
2
3
4
5
|
< dependency > < groupId >commons-codec</ groupId > < artifactId >commons-codec</ artifactId > < version >1.4</ version > </ dependency > |
注意:這里要使用1.4以及以上版本,應(yīng)為1.4以下的沒有Hex.encodeHexString(byte[])這個(gè)方法!
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。