TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
沙发
发表于 2014-12-25 13:48:17
|只看该作者
- /**
" `& @3 h! I& A; x/ i Z - * 加密解密$ c* `, O3 h' V$ m
- * @author zhangZhiPeng- W* X+ H; V" }5 J
- * @date 2014年12月24日
/ _- L+ X: f& C - */
" I- s9 U& ]! W1 z! m - import java.io.UnsupportedEncodingException;0 u+ G$ H5 N J; C: s! V
- import java.security.*;
' \ f7 b% b6 \& r5 t2 o! t7 x' O - import java.util.ResourceBundle;. W8 k9 C* j) {3 c! y
" Y( z& m3 z: n! D7 k, e. v- import javax.crypto.*;
4 L/ z6 F1 w$ | - import javax.crypto.spec.SecretKeySpec;7 F+ B' Q* P" G+ ~- e: C7 o6 L: N
- public class AESUtil {7 x) ?: H2 ?3 U$ A' U
- private static String PASSWORD = "";( b6 s) ~; D) ^3 s: ~. G
# B& k3 g3 f/ A2 n- static{
. }4 Z: r, y4 z, T3 b! v - ResourceBundle resource = ResourceBundle.getBundle("config");, N/ c7 T2 f9 r1 G8 `0 h( z# J' X, A
- PASSWORD = resource.getString("PASSWORD");( o7 X6 d+ w n
- }& D) J% B$ y& H! f- E& R: N6 t
- public static byte[] encrypt(String content) { . E$ E! C: H- V% m
- try { 6 [/ U3 M( c1 H
- KeyGenerator kgen = KeyGenerator.getInstance("AES"); //KeyGenerator提供(对称)密钥生成器的功能。使用getInstance 类方法构造密钥生成器。
|) ~. l; k0 L/ P$ h+ X1 e - kgen.init(128, new SecureRandom(PASSWORD.getBytes()));//使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。
# t4 V- j/ j, B% r' c - SecretKey secretKey = kgen.generateKey(); # n% a+ Z$ z% {+ e. ^
- byte[] enCodeFormat = secretKey.getEncoded(); 3 P6 V4 X; G( b N& F
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");//使用SecretKeySpec类来根据一个字节数组构造一个 SecretKey,,而无须通过一个(基于 provider 的)SecretKeyFactory.
1 G" M- ~! j y - Cipher cipher = Cipher.getInstance("AES");// 创建密码器 //为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。
' q O: H) W2 } - byte[] byteContent = content.getBytes("utf-8");
0 r& m0 a$ Z0 t+ u3 y - cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
. G& d- C* J+ i. c$ j9 q( v* y) G - byte[] result = cipher.doFinal(byteContent); //按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。- d" ]( t( Y: P5 W0 t
- return result; // 加密 ' h5 d! Z- Y& S3 S* b3 c( H; X+ \2 \% V
- } catch (NoSuchAlgorithmException e) {
# d# s. p- M" _* D# w - e.printStackTrace();
2 G6 S- o- [' H- C/ N! z - } catch (NoSuchPaddingException e) { ! m1 H, P. d* Q
- e.printStackTrace();
) a" `* D9 Y5 \& e. s - } catch (InvalidKeyException e) { 3 h0 F# s% n6 ^. y% E
- e.printStackTrace();
' r# Q. N; k, U/ D - } catch (UnsupportedEncodingException e) {
3 g* X1 M1 b; ~8 h4 E" B - e.printStackTrace(); . z4 y0 b3 ~3 E+ P$ C- Q& ^
- } catch (IllegalBlockSizeException e) { x8 U; A9 v; K
- e.printStackTrace();
4 V [- P: I3 |" d - } catch (BadPaddingException e) { 1 y! {. d* Y. ]; @' X
- e.printStackTrace(); 1 r% k, | ^6 y1 b3 c) q
- } # t r% D8 J- U% }. z" |
- return null; ; [! P5 r3 V% ?! d9 Z
- } 4 U4 X( `. W0 z5 w% h! O
- public static byte[] decrypt(byte[] content) {
( D9 s- w# L/ N1 ^7 I% _) H+ ` y - try {
+ X9 L# i1 W3 h7 |% W! f# r - KeyGenerator kgen = KeyGenerator.getInstance("AES"); 0 W3 I' a5 n8 Z5 n
- kgen.init(128, new SecureRandom(PASSWORD.getBytes())); ! }2 }. n7 y I
- SecretKey secretKey = kgen.generateKey();
0 A( r9 l, j+ v: c+ ^ @+ R5 X# \ - byte[] enCodeFormat = secretKey.getEncoded();
" R. x& |7 @" U+ ]' d- g - SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
p) L1 t6 b2 h1 G5 E# y% U/ l5 P: j - Cipher cipher = Cipher.getInstance("AES");// 创建密码器 5 _4 p5 D) h( G5 H
- cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
3 `8 _- E9 N$ Q2 ^( |3 ^7 w* B- o& V+ K8 ^ - byte[] result = cipher.doFinal(content);
1 |8 W; y; ~! J0 j* L, S o. a - return result; // 加密 ' E+ | b% T. M/ f. m
- } catch (NoSuchAlgorithmException e) {
+ V, H2 N2 y; Z: T - e.printStackTrace(); 7 i. @7 V3 [" j- ]- {. {
- } catch (NoSuchPaddingException e) {
( W( b: c l1 r$ ^( O, d9 P - e.printStackTrace(); 7 o0 v f! _5 H9 S# b1 m
- } catch (InvalidKeyException e) { ' ]4 \" E- M- U3 t2 w- E
- e.printStackTrace(); $ {/ s& v H6 Q$ u# x7 U
- } catch (IllegalBlockSizeException e) { 6 N9 x* S1 s Q x- ]
- e.printStackTrace(); . [* u1 }" Y$ X9 H8 V" G
- } catch (BadPaddingException e) { 1 m- Z" r, o, t; E6 K$ g
- e.printStackTrace(); 0 U: b }. Y2 s& ~) r
- }
% `! Y1 t( R1 D, X - return null; , O9 A8 ^/ Z6 g: ^$ n2 h% L
- }( _/ f7 V7 A6 G4 x a$ R0 b
- /**将二进制转换成16进制
5 v4 k, }' M" H - * @param buf
- i- w% _3 p1 r' }, v - * @return - @; c C) t: ?/ ?& P
- */
7 V4 {( i# m1 t. s0 y6 x7 p5 e3 q - public static String parseByte2HexStr(byte buf[]) {
) a! r& A8 ?2 o g# X ^ r+ y - StringBuffer sb = new StringBuffer(); % g4 f. N: W! e$ T0 l( d
- for (int i = 0; i < buf.length; i++) { 6 \# R, X* d; R& p0 |! q
- String hex = Integer.toHexString(buf[i] & 0xFF); $ r% v7 H! t- h1 `8 B( o
- if (hex.length() == 1) {
0 Q" b0 j: }+ a - hex = '0' + hex;
, a) w5 E! w/ Q w, `" d - }
3 u0 f+ f7 ?. Z: o" J9 l# n: o - sb.append(hex.toUpperCase());
# Y7 N5 B' w3 L0 ] y& j, Q - }
' l: ]3 H* k. d \ - return sb.toString();
' _3 C: W$ I6 {4 D, Y - } ( y; L: }* b7 a/ R+ Z* }& K5 B/ B2 ]
- /**将16进制转换为二进制 : z2 U X1 O/ E3 d4 }
- * @param hexStr ( D$ n& V! |) r& J1 Q1 A) D
- * @return . g( T. M$ P, J4 W
- */ 5 Q6 K. {/ ]& \; |6 R
- public static byte[] parseHexStr2Byte(String hexStr) {
) T! o% g+ h! U - if (hexStr.length() < 1) - k) ^1 T5 ^8 p6 ~1 S6 \& }
- return null;
3 u- z# @( H9 i. P$ C" t - byte[] result = new byte[hexStr.length()/2];
, d ~# Z# h* ~ f3 b" V. y - for (int i = 0;i< hexStr.length()/2; i++) {
2 I) K5 p. W! j1 ~ - int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
4 z* B* J+ h1 P# Y: u - int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); 7 t2 F! `% s( q* Y
- result[i] = (byte) (high * 16 + low); ; m X4 D; k: y' [6 T
- } 4 o) S; ]5 G' d5 o' B* \! R$ ]# r
- return result; , b% ]! T: ?! V
- }
' W4 ]" G) H3 D( | - //测试; L7 S. X" D! f/ T1 Z
- public static void main(String[] args) {
" L7 ^# L0 K5 P - String content = "test";
6 W& W8 l& x8 @. s3 D' K- \ - //加密
3 x& C5 k" L5 n& t3 j0 @ - System.out.println("加密前:" + content); $ ?: @' ?0 Q# c* [9 h. x6 S/ `
- byte[] encryptResult = encrypt(content);
4 P' ^: V/ V" n" F - String encryptResultStr = parseByte2HexStr(encryptResult);
3 }* J* s! o0 h$ E) e4 d4 E - System.out.println("加密后:" + encryptResultStr); ; F u% ], W' d6 Q; r7 ^
- //解密
4 _& {7 S& Q7 E6 H$ l. g - byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
$ b8 i8 C3 D7 r2 z5 v - byte[] decryptResult = decrypt(decryptFrom);
/ N( r9 _, A6 a/ g1 v/ t7 M - System.out.println("解密后:" + new String(decryptResult)); * a# e) @" Z, C i0 T* u
- ( l1 ]/ Q$ v7 l. e' f
- }% F) p0 {' o, O( e( K8 w
- }
复制代码 |
|