TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
沙发
发表于 2014-12-25 13:48:17
|只看该作者
- /**5 }3 ~. {$ g% z1 d$ D' l4 i) l
- * 加密解密4 r! w/ O% W% k5 O! o, {
- * @author zhangZhiPeng
+ T0 Y& S% w6 K& k+ ?& I - * @date 2014年12月24日
* u2 P+ |3 c. [" g. S - */* ?+ W0 X3 H0 s7 R2 T/ N. S, p2 W$ d# j
- import java.io.UnsupportedEncodingException;: [8 i2 S; m+ F4 O, l- l+ \3 k, H" [
- import java.security.*;9 }0 s( T9 p0 X# b$ H' z
- import java.util.ResourceBundle;
* V! I7 v4 {/ W - ! j0 h$ u1 \( g: l% ^
- import javax.crypto.*;
/ s5 [, {) N5 G, o4 e/ Q7 }5 V - import javax.crypto.spec.SecretKeySpec;# q; U2 f0 {& P, X8 ?- q4 \3 x
- public class AESUtil {
1 X- g) K& [) b2 r. o0 |# D - private static String PASSWORD = "";
i* f7 m9 C/ B5 b - ; u& ^9 D2 v! z" B
- static{
* q1 L" ^# w9 K- s, L% N - ResourceBundle resource = ResourceBundle.getBundle("config");8 D: J6 \: W( X( R4 l
- PASSWORD = resource.getString("PASSWORD");# _- A( ` d9 W# \( a T: G
- }
! h, s, }2 r0 j1 e - public static byte[] encrypt(String content) { + V2 f- [- b! k ]
- try {
0 _; y8 l/ T, h8 T- L6 D1 @( h. n" [2 r - KeyGenerator kgen = KeyGenerator.getInstance("AES"); //KeyGenerator提供(对称)密钥生成器的功能。使用getInstance 类方法构造密钥生成器。- }$ {& a( [7 m
- kgen.init(128, new SecureRandom(PASSWORD.getBytes()));//使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。
/ O, N1 u' M4 U5 A - SecretKey secretKey = kgen.generateKey();
- N4 [" l9 X! v) i - byte[] enCodeFormat = secretKey.getEncoded(); 4 m3 m5 {/ y8 F8 U
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");//使用SecretKeySpec类来根据一个字节数组构造一个 SecretKey,,而无须通过一个(基于 provider 的)SecretKeyFactory.0 F; b: \. a3 ~" t6 Z% U# ]
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器 //为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。 4 A* A" C; V s/ ]
- byte[] byteContent = content.getBytes("utf-8");
@: p9 R" q$ O+ o - cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 , q/ |$ A% M+ r3 I3 x7 O
- byte[] result = cipher.doFinal(byteContent); //按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
0 j; K# Y% R+ a/ i# I6 h+ P - return result; // 加密 3 ?9 V I& v3 c" V# z
- } catch (NoSuchAlgorithmException e) { 7 B9 z; Z& `% {2 m# j- ?$ t
- e.printStackTrace();
5 A8 P, i( A0 o - } catch (NoSuchPaddingException e) { 0 o. o1 m, i$ _
- e.printStackTrace(); 2 I7 i4 R" ^* N _
- } catch (InvalidKeyException e) { 5 W1 _; t% U5 B
- e.printStackTrace(); + Q. w# d, I8 g7 N4 c' u
- } catch (UnsupportedEncodingException e) { / }1 N o' z8 S4 ~9 T, E
- e.printStackTrace();
+ O# F) t Q* s) @) {* }) K/ o6 ^ - } catch (IllegalBlockSizeException e) { % J1 t! F! z& y$ J
- e.printStackTrace(); $ k; W+ g/ V! x* u
- } catch (BadPaddingException e) {
( a7 @ ~. P y1 u$ r! M - e.printStackTrace(); ' b; G! z' A# u- _9 N4 U: n. |
- } 7 g- N- B" Q3 Q" i7 `: @0 i; ^' l
- return null; 7 O3 O3 M! N4 ^
- }
$ W7 U6 g3 Q/ L! S( T - public static byte[] decrypt(byte[] content) {
9 u: D1 S, {7 Z1 A6 V - try {- S" R$ F8 E6 z
- KeyGenerator kgen = KeyGenerator.getInstance("AES"); 4 B& |& A6 q3 H& l& |
- kgen.init(128, new SecureRandom(PASSWORD.getBytes()));
" K& H5 n0 P3 F- q) L& k, t+ z - SecretKey secretKey = kgen.generateKey();
, ^& }8 n( X u8 ]! E: q" `4 e - byte[] enCodeFormat = secretKey.getEncoded(); , O, M& _3 H5 Q4 [+ x* }
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
1 H6 Q% a# I) b& n1 N - Cipher cipher = Cipher.getInstance("AES");// 创建密码器
, Z/ [: J, n$ n/ }; J+ c. a7 q V: D - cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
; Z0 U0 V* [ m6 }0 W5 d1 Y& @ - byte[] result = cipher.doFinal(content);
4 {4 |% b' T4 N9 q - return result; // 加密 : k, m/ n5 `) _4 ?& G# _
- } catch (NoSuchAlgorithmException e) { 9 a6 R/ w1 q0 k {4 X
- e.printStackTrace(); & q1 q9 e9 E' k% r- i7 k* ]
- } catch (NoSuchPaddingException e) {
( ?( c! u1 b- J7 p# }* a! q1 l+ D+ r - e.printStackTrace(); & [! A, b- E, M0 k/ z! v
- } catch (InvalidKeyException e) {
& \/ e Q7 d% L4 @# ~/ D - e.printStackTrace(); - q% t( v+ f; Z+ f3 T& a
- } catch (IllegalBlockSizeException e) { # ?+ g2 Y# H* [$ c
- e.printStackTrace(); 0 O% c9 C* O2 |$ }/ ?
- } catch (BadPaddingException e) {
* D2 Y2 s- s3 i" j0 T- D* P' g - e.printStackTrace();
! e0 _+ C) N# i% w5 C/ @( w1 k# ] - } 7 J& G% `' a& ]
- return null;
$ w( L2 n7 w9 M( q9 V6 R - }
b% D- T/ s- p/ w( N. l8 V9 L1 z - /**将二进制转换成16进制 1 j9 K. [ L2 [4 s
- * @param buf
5 m7 |8 F) @4 j# V2 e! [1 [ - * @return ; s- K7 r) i" T! } U
- */
+ h/ u0 h% O Z" |+ s - public static String parseByte2HexStr(byte buf[]) { 9 X3 \3 R; r6 F: D) p
- StringBuffer sb = new StringBuffer();
6 ?' V- p! [/ H5 I - for (int i = 0; i < buf.length; i++) { " {/ j/ v% _. r" w
- String hex = Integer.toHexString(buf[i] & 0xFF);
) D) r4 [" f, o, L - if (hex.length() == 1) {
4 s' o( ?, V9 t3 N2 Q, u' Z6 g) B - hex = '0' + hex; ' O" D6 c _1 j# o5 B& i
- }
* v! _& E) t- f/ D# m. [/ b7 S - sb.append(hex.toUpperCase());
7 A. g: ~: x" t1 L' T h# J - }
- J( a8 S5 a6 N0 ` @7 f% C - return sb.toString(); 7 h" w9 `: V* X: E9 p/ i; m
- } : {. x( r4 q1 a0 }' f1 C
- /**将16进制转换为二进制
) ^6 D# V2 t2 H) M0 t* m - * @param hexStr
! w" g3 v- S# ^6 Z+ J* T - * @return 6 Z# T8 n& ~: o) o
- */
( C: v2 w2 Z8 v$ e& i- J. o - public static byte[] parseHexStr2Byte(String hexStr) { / h& Y5 B7 m" K# g- }
- if (hexStr.length() < 1) " k* H* g+ i, l, g
- return null;
, ]8 u- j( }0 D+ l - byte[] result = new byte[hexStr.length()/2];
$ v O; H# L, X" z. N0 U6 L0 q - for (int i = 0;i< hexStr.length()/2; i++) { # B+ ^2 I8 S# l+ [# q
- int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
2 ]# E# _3 A- E# { - int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); + \ e. N% x7 Z: b: @
- result[i] = (byte) (high * 16 + low);
7 o( [/ e5 x2 {! F1 | - } * e/ `! V1 @" O3 f |& R4 ~
- return result;
% l' k+ f( ^' @* ^ - }
$ N( u t) Z1 T/ e- n - //测试
: ?& @. m" J" q( q - public static void main(String[] args) {& i( c8 r+ \& [$ K9 ?
- String content = "test"; # L; `. ^$ b0 M
- //加密
3 t) U& L) d/ ~9 Y - System.out.println("加密前:" + content);
7 q8 O8 v) [. K( }1 w$ | - byte[] encryptResult = encrypt(content); ( G/ \4 |/ ^" D( R
- String encryptResultStr = parseByte2HexStr(encryptResult); ! {/ O6 M( x2 N" B% m3 ?' z+ L
- System.out.println("加密后:" + encryptResultStr); * ]( D$ V# ^( I1 @
- //解密
# B- k. C: `4 `: [0 @) U - byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
0 f+ ]1 C, @( k; @- E - byte[] decryptResult = decrypt(decryptFrom); 8 ? H$ k; n% G) j6 O: C6 k+ ?
- System.out.println("解密后:" + new String(decryptResult));
7 S8 f* Y) ^, q4 c8 [1 d
$ U' A! Y/ a- ?- U. B. I- }' H8 _+ ?6 X: o3 o2 v* ^% k% Z
- }
复制代码 |
|