TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
沙发
发表于 2014-12-25 13:48:17
|只看该作者
- /**
# n8 |' Q1 t2 p7 X" J/ t9 b - * 加密解密' B$ ? U# k% Z$ M
- * @author zhangZhiPeng& }, ?6 o, q, U w* r
- * @date 2014年12月24日) d, Y, |3 g( Q! K5 Y5 D: A
- */
9 z: H1 O, S6 x, T* T( T% i - import java.io.UnsupportedEncodingException;' y+ I0 A4 T# F8 [
- import java.security.*;
9 f" d) l1 X+ S5 P5 {& w S - import java.util.ResourceBundle;4 i0 z) p% ~) w# B* C! J
1 e' x& H% l: X+ w# o0 T8 I- import javax.crypto.*;
7 S+ u( J# ^( L# C2 a& z9 p: { - import javax.crypto.spec.SecretKeySpec;3 C- T9 R) S( `' I" k) I6 v
- public class AESUtil {* j7 o% b2 Z, d8 t! s3 V
- private static String PASSWORD = "";
% r# h' i2 \4 R6 ?: p! Q5 `0 U, a - . [/ p; D. d. s
- static{
* z% H. l3 D+ D9 x$ S - ResourceBundle resource = ResourceBundle.getBundle("config");
/ n8 [' L: ~" b5 K3 K, b- I% J - PASSWORD = resource.getString("PASSWORD");
) h1 v. E7 u _) ?; C4 e9 } - }
: R( i+ O8 g+ x# i0 v7 | - public static byte[] encrypt(String content) { $ N6 j: k& g+ ^ Q( s
- try { . z4 q3 ]) q; D+ ~! z& d; L+ f$ S5 L6 o
- KeyGenerator kgen = KeyGenerator.getInstance("AES"); //KeyGenerator提供(对称)密钥生成器的功能。使用getInstance 类方法构造密钥生成器。
, m+ c! X5 [" h0 l" ^4 c$ D. E- n - kgen.init(128, new SecureRandom(PASSWORD.getBytes()));//使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。3 z) b2 C. [# r2 P1 F# e {
- SecretKey secretKey = kgen.generateKey();
7 N) c; |4 O( t1 a5 `( ~+ D" K, P - byte[] enCodeFormat = secretKey.getEncoded();
, y2 E* }4 g1 X) `1 @ - SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");//使用SecretKeySpec类来根据一个字节数组构造一个 SecretKey,,而无须通过一个(基于 provider 的)SecretKeyFactory. M% a, ^/ m: m3 l% M# W3 t
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器 //为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。 2 P x8 K1 K, F( j; j& N2 w/ w: B
- byte[] byteContent = content.getBytes("utf-8");
& F% G) |) A x) a7 q) J6 I0 h - cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 5 ]5 k- H, \1 W: `! o7 x( g
- byte[] result = cipher.doFinal(byteContent); //按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
, d( j1 e$ P) d, x5 s: w" Q - return result; // 加密 . T( y! L5 b% |
- } catch (NoSuchAlgorithmException e) {
, T8 Q8 G& I) ^, i2 L p |% ` - e.printStackTrace();
; y" `1 n0 l% F/ j - } catch (NoSuchPaddingException e) { ( f" W% d5 e, }4 o2 N) b( v7 I2 V
- e.printStackTrace(); / S5 `9 P) s) p7 O1 G* O
- } catch (InvalidKeyException e) {
4 N+ ~+ w2 I4 G2 S- d" @& P - e.printStackTrace();
5 ?1 h" D. F" T: _) ]) F - } catch (UnsupportedEncodingException e) {
7 w* q7 g9 N+ s# { - e.printStackTrace(); 8 A: V/ H. O2 k) y7 x1 o
- } catch (IllegalBlockSizeException e) { 0 E. W; n* u: s1 O ]# V/ l; c- o' y
- e.printStackTrace();
% c3 `: I0 N! ^! t - } catch (BadPaddingException e) {
A7 I+ ]1 B8 T* { - e.printStackTrace();
) y6 M! E: {9 f. A - }
0 o0 b" m8 b& c2 w+ s - return null; / R$ x5 ]/ j3 ?! [9 n
- }
/ b6 u$ N- p3 h, d - public static byte[] decrypt(byte[] content) {
- y% v( [0 L" d- _$ y - try {
' L: ~- l6 u2 }% l5 G3 l1 n2 M - KeyGenerator kgen = KeyGenerator.getInstance("AES"); 4 `( B6 }6 u8 f6 M
- kgen.init(128, new SecureRandom(PASSWORD.getBytes()));
, U- D7 P- A9 ?6 z* C( l - SecretKey secretKey = kgen.generateKey();
3 w% C, U" r. b) Z1 [+ L9 A - byte[] enCodeFormat = secretKey.getEncoded(); 6 Z; v! U/ r& x2 A8 f
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
' p( V) D" L0 ^ - Cipher cipher = Cipher.getInstance("AES");// 创建密码器 . d& B6 [$ `& ~) P7 Y* V
- cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 1 R/ ?* ~+ c2 ], Y9 k9 T) t
- byte[] result = cipher.doFinal(content); ( G7 O" b. V$ y1 e) L3 j8 s
- return result; // 加密
+ o! F# A# V. g$ T - } catch (NoSuchAlgorithmException e) { 5 P K; M; O0 J- @& d+ I: N! J
- e.printStackTrace();
' G5 t- t4 ~# O0 G6 j - } catch (NoSuchPaddingException e) { ; y& Q# I- }! E
- e.printStackTrace();
1 Y8 c0 K3 d5 @ - } catch (InvalidKeyException e) { 2 M! i; s4 N( z$ X
- e.printStackTrace();
% [& h0 J. D4 j) o. o3 ` - } catch (IllegalBlockSizeException e) {
8 r# J; L* T& C - e.printStackTrace(); 2 r% Y/ l. n7 u& m9 E
- } catch (BadPaddingException e) {
2 n% }& m+ c9 J# a* E5 r( y% Q" T - e.printStackTrace(); & \( i: ~6 ]$ R. d1 n$ B
- }
: L! D/ I% Z. S" y2 L8 q. ` - return null; . f& J# _' n; d: |
- }( d/ ?' j+ I) x- S
- /**将二进制转换成16进制 / B i: F5 g+ S) [8 [+ E f1 k
- * @param buf 8 t. X" f& Z9 { u' i' Y) `
- * @return 6 m8 L1 G; @; X# S' a% |, o+ _, K
- */ # o$ q$ [$ H& @% j$ d' h$ h' D
- public static String parseByte2HexStr(byte buf[]) { - B) E! L' M( A' u. `! E
- StringBuffer sb = new StringBuffer(); 7 _; x4 \# ]2 ]9 I0 S( @$ ?
- for (int i = 0; i < buf.length; i++) {
& Y9 c. ?! U# u, m9 G - String hex = Integer.toHexString(buf[i] & 0xFF);
" S. j) K6 {/ S: V+ G6 n8 s; J - if (hex.length() == 1) {
" ^! g/ p$ d. ?4 ? O- @9 e1 U - hex = '0' + hex;
, V( A& A' e7 \2 ~1 x - }
% e& s& o+ _1 D' t. G, l - sb.append(hex.toUpperCase());
+ _9 J. E$ Q7 j - }
+ g- P* [, D2 h0 k6 d/ a8 ` - return sb.toString();
2 q/ x6 m6 M9 F, D# v8 o. f" N - } ' ^8 H) B. S- s) w% i/ a5 y! S
- /**将16进制转换为二进制
9 i0 H& U: }3 @3 ^ - * @param hexStr
3 H# k- N. C" |% u8 b0 W; P8 i# D - * @return
' B1 h: ?! a# \3 h2 ? - */ . O) }; O" |: o0 t7 }! m' T
- public static byte[] parseHexStr2Byte(String hexStr) { ; k* |8 d m* O5 g6 _+ l" N. G
- if (hexStr.length() < 1)
2 a$ ^: _6 z2 R! g" i6 L! i - return null;
/ u6 C, Z% U4 ? - byte[] result = new byte[hexStr.length()/2];
& W1 F4 q" a/ k6 G" B - for (int i = 0;i< hexStr.length()/2; i++) {
5 h. R2 [0 m# o, ?7 g - int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
' P' _$ D$ I% X# n+ N - int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
$ [% l1 B9 P; ?4 D* X A - result[i] = (byte) (high * 16 + low); $ y" z3 u5 o& ^5 O& o$ `" i$ p3 K
- } & W2 U1 O. G* W
- return result; % m. w7 n% V8 G7 w, h
- } / E+ U8 ~: x9 A3 M& [" i4 C! E
- //测试/ X1 y; b8 d8 Q
- public static void main(String[] args) {+ q! h n8 H4 q n" D7 f
- String content = "test"; % K5 x$ [1 ]4 `% \5 D! N
- //加密 7 M" r/ m! w* K7 L+ ^% ~
- System.out.println("加密前:" + content);
; d3 c* S& v# H; c% c - byte[] encryptResult = encrypt(content);
+ k/ u+ w. ^% i9 w; b - String encryptResultStr = parseByte2HexStr(encryptResult);
: D8 I0 k1 U: ` - System.out.println("加密后:" + encryptResultStr); + S. Q( ?5 V2 D8 l' p: e* e
- //解密
% _6 T$ G# k) T1 H1 p$ v - byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
# l/ s' [$ r% u7 r: r7 t - byte[] decryptResult = decrypt(decryptFrom); 9 Y: ^4 S+ c; W0 ^
- System.out.println("解密后:" + new String(decryptResult)); 2 ~" ~5 q3 b4 ^, z T$ Q, Z7 s
- * m D1 Y, Y% l, m# }
- }4 P+ n r: ?* @, t; u; l& E/ |
- }
复制代码 |
|