TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
沙发
发表于 2014-12-25 13:48:17
|只看该作者
- /**1 f( a; F( h) q& d k, ~& i& n2 {3 ^
- * 加密解密
6 `2 D6 c3 z/ X8 o - * @author zhangZhiPeng
; @% @5 Q: z" r4 i - * @date 2014年12月24日6 ^! v1 z x. W4 ~
- */7 l; F Z: B! `: e7 X4 S) U1 e8 r
- import java.io.UnsupportedEncodingException;0 O/ e0 S8 V1 e7 v9 j( d
- import java.security.*;
& z; A) S+ B8 \5 w7 f- z$ w% v - import java.util.ResourceBundle;
% b9 |: i( g* `
! O4 N' X0 g) c, U$ E, a, {- import javax.crypto.*;
! x2 ^# t) u( I - import javax.crypto.spec.SecretKeySpec;4 k6 @1 e3 ^6 O# U* E
- public class AESUtil {
# n2 M" F9 o# O O8 t! D - private static String PASSWORD = "";- m# _* {: L8 p6 q$ E* L
% W2 N" U0 |% `8 a3 s- static{% q, J" g9 ?9 X! y4 q" `
- ResourceBundle resource = ResourceBundle.getBundle("config");
! A' [. m% Y8 C" ~. R - PASSWORD = resource.getString("PASSWORD");8 P' i' ]2 w- d/ T; X2 a! Z
- }
3 S R9 I$ |1 b" @+ u. k* w+ V - public static byte[] encrypt(String content) { 8 H! r4 Y/ I/ h" F
- try {
+ ~1 o4 f# C1 ^% B7 r; c4 b) n - KeyGenerator kgen = KeyGenerator.getInstance("AES"); //KeyGenerator提供(对称)密钥生成器的功能。使用getInstance 类方法构造密钥生成器。
z- B5 x/ x7 s- A" q0 x - kgen.init(128, new SecureRandom(PASSWORD.getBytes()));//使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。$ t; ?5 O2 }8 `9 A2 G
- SecretKey secretKey = kgen.generateKey(); * G9 A% Y* I, H- K
- byte[] enCodeFormat = secretKey.getEncoded(); 1 p- j3 u9 E- S4 y+ Y8 B' }- b% W& P
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");//使用SecretKeySpec类来根据一个字节数组构造一个 SecretKey,,而无须通过一个(基于 provider 的)SecretKeyFactory.3 e w# H8 L% n0 {0 G6 P/ H* k+ `
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器 //为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。 4 @/ N( S' s+ k4 S. N
- byte[] byteContent = content.getBytes("utf-8"); 1 K7 a0 t4 P$ r! q# z6 _9 k- S
- cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 + B- c j$ i6 e. q5 t
- byte[] result = cipher.doFinal(byteContent); //按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。) G2 E6 q) K% T1 }+ x0 E
- return result; // 加密
3 N0 ^6 C9 k7 y( \1 q9 v - } catch (NoSuchAlgorithmException e) { % I7 W B6 K$ ?4 y9 s
- e.printStackTrace(); ( r O1 X4 d- l% B6 ?& z
- } catch (NoSuchPaddingException e) { 3 s0 M/ j. g [5 m
- e.printStackTrace(); ( [ ^$ C0 _0 N
- } catch (InvalidKeyException e) { / G$ E C* n) o- r' K
- e.printStackTrace(); + s$ t* D' W; h) L' X
- } catch (UnsupportedEncodingException e) { % f+ q) v$ I5 ?. A" d( K
- e.printStackTrace(); $ \( I% I3 W. L: Q |
- } catch (IllegalBlockSizeException e) { . N8 u% c' O( N3 R- k0 E
- e.printStackTrace();
, y6 e: I) ~# ^ - } catch (BadPaddingException e) {
' @4 O1 D7 a+ ?+ g - e.printStackTrace(); ) j [) y7 \1 c+ e, \
- }
! s* i3 n Z. F/ H - return null;
3 @$ M: W* Q1 v2 w* N* B, g- q - } " ~6 v7 G' c# L: Y7 e
- public static byte[] decrypt(byte[] content) { 2 M0 E: M4 a, a+ G3 ]* F
- try {
" l3 v4 m1 t3 \/ N2 I7 p - KeyGenerator kgen = KeyGenerator.getInstance("AES"); 8 y* ?3 x& z) q6 B3 h( `7 A
- kgen.init(128, new SecureRandom(PASSWORD.getBytes())); 0 g4 j. W! c. r* g0 J
- SecretKey secretKey = kgen.generateKey(); 3 U8 }9 m$ E7 S1 I8 S" ~" h: J
- byte[] enCodeFormat = secretKey.getEncoded();
/ ^( P& R. n$ N& G9 Y - SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
" e+ V o6 Q, o7 K) l - Cipher cipher = Cipher.getInstance("AES");// 创建密码器 . K- b5 `+ E, d$ {: N6 I
- cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 $ [: h0 [: W- P' ^* s
- byte[] result = cipher.doFinal(content);
/ L: R, R" w6 D1 { - return result; // 加密 ! K, `2 ~ p/ I
- } catch (NoSuchAlgorithmException e) {
U& s9 z: b5 ~" M% v' @8 A5 O( g& _ - e.printStackTrace(); ; j7 M! S+ d# m/ N* l0 Y
- } catch (NoSuchPaddingException e) { 4 m- N/ }; m& f2 e6 h0 q( a- ~
- e.printStackTrace();
% ]9 N; r s7 S - } catch (InvalidKeyException e) {
7 K/ {$ P8 o2 X* p - e.printStackTrace(); 8 x1 r9 a1 }* e! \
- } catch (IllegalBlockSizeException e) {
% ~; q" R0 W% ^( l$ y& r - e.printStackTrace(); 6 r4 |' B+ I( W7 ?; ?! o; v, _$ D
- } catch (BadPaddingException e) { - J. F+ z6 q$ X* j7 F
- e.printStackTrace(); # s; i0 y z. q- \, L
- }
, H* X0 `; ]* e2 p$ L - return null; ; l* B6 X$ v, ~$ v7 e
- }! O( G4 e# O3 B! b7 s% T
- /**将二进制转换成16进制 4 k. J2 g3 {7 V& g9 g |
- * @param buf ! i, h* B% m4 {/ h( a$ v
- * @return
/ |8 n6 z8 n. I3 H* n% x% `" L - */ # I, D, R* P& t% [' e3 @" Z* U
- public static String parseByte2HexStr(byte buf[]) {
/ n. [: E3 N$ `+ k! y7 W6 P - StringBuffer sb = new StringBuffer(); & |# H, v+ ]0 o7 [0 H1 t) ]
- for (int i = 0; i < buf.length; i++) { ) c8 K! z6 R% _' F: D; B& Q
- String hex = Integer.toHexString(buf[i] & 0xFF); 0 O! {- C8 O; J5 q. _! K* O7 c
- if (hex.length() == 1) { 8 E9 p7 g: U9 t8 Q9 |6 C8 O
- hex = '0' + hex; ; a! ~: g. A: S7 l
- }
% A, {5 [& u, O* D% x Z$ H - sb.append(hex.toUpperCase());
, @! |5 e% I# X" s5 v - }
! C7 K8 {2 G; @& ]0 J4 m% h - return sb.toString(); $ _/ Q+ f7 ~& l4 p- D
- }
5 X6 N- t! {# {. w: b% N - /**将16进制转换为二进制
- N" E2 D) _7 U - * @param hexStr " l# p V/ a3 D& I7 o3 S
- * @return
) f0 U! ]& m7 i3 x3 I" Z, i - */
$ ?- K, a& p/ P/ S \ - public static byte[] parseHexStr2Byte(String hexStr) { + |( L) @/ W, _0 c# X3 | P
- if (hexStr.length() < 1)
7 s( I% X, x! N" l, E5 R - return null; # O) [1 v: ]) `1 x9 V' z3 Y2 I. G
- byte[] result = new byte[hexStr.length()/2];
# H* O$ G: r9 j; i& y0 {2 T - for (int i = 0;i< hexStr.length()/2; i++) {
+ O- v9 b# l) `: ] - int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); $ Q' ?9 f( }) x) v" V6 e6 u- U
- int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
2 V* |9 u- N5 ^: j - result[i] = (byte) (high * 16 + low); ; J: t6 i- k* z- J! Q! s
- } & e; ?! f& ^$ F% `% \& ~" s) {
- return result; % Z7 I+ L6 R7 x$ t* L7 T1 x# n) g
- } * o2 \- E3 c9 s3 A5 w3 c( p
- //测试
3 Q+ t0 j9 [4 E* U& H - public static void main(String[] args) {
8 N; ]3 Z& j% m6 X - String content = "test";
" b2 i+ t) b$ L# T! X, A - //加密
\2 _9 n8 a* S/ d' j# U% e - System.out.println("加密前:" + content);
( t( Y) V- D- m) G" A0 ` - byte[] encryptResult = encrypt(content);
# i* r D' E/ T - String encryptResultStr = parseByte2HexStr(encryptResult);
% j6 E1 C0 b7 f. F; M# Q - System.out.println("加密后:" + encryptResultStr); ; y0 W% d: _( Z' i; C* d
- //解密 7 n# n) q7 Z$ I; X
- byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
( l9 ~7 t5 h% q0 T4 q. [ - byte[] decryptResult = decrypt(decryptFrom); , j" j$ a: @5 g$ S7 x- F# v
- System.out.println("解密后:" + new String(decryptResult));
_4 O% N& ]) h
" ]6 [1 J, p3 N6 l' [9 K- } }: j$ j4 i% ~/ _+ t1 M6 O0 D
- }
复制代码 |
|