TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
沙发
发表于 2014-12-25 13:48:17
|只看该作者
- /**
1 I$ @3 X6 j5 t1 d/ Z# F- {& a - * 加密解密( y1 K" Q/ k, W- @2 G" N4 Z
- * @author zhangZhiPeng7 Y& L4 N0 `" z& F4 ?* A: l, R& y
- * @date 2014年12月24日. A% T% h5 \9 V+ M! \/ p; v
- */
- [9 k: [- C: S& F/ K" Y - import java.io.UnsupportedEncodingException;
+ q& N1 R; F( G1 |% n# d, y9 [ - import java.security.*;
/ T3 q2 t3 `- I - import java.util.ResourceBundle;1 C, M5 ]6 ], q% X1 Z
0 c5 p, U/ P* Y. F; e- import javax.crypto.*;# z+ s6 y/ W2 P7 D6 b
- import javax.crypto.spec.SecretKeySpec;: R/ I$ K- X, s; g2 U l) v
- public class AESUtil {
" n% a/ Y6 _1 L - private static String PASSWORD = "";! b. K1 p+ B% V B7 D2 z
5 K: n9 f+ U* q* C* m- static{
' t: S5 x9 E1 { - ResourceBundle resource = ResourceBundle.getBundle("config");
7 ?3 Z- o+ K4 w+ ]0 i - PASSWORD = resource.getString("PASSWORD");$ k m$ h3 V. |0 u' b
- }
% x1 ?- g/ ^- |& K - public static byte[] encrypt(String content) {
) ~% e j8 E) M' K6 L - try { " n1 G4 B6 S# b( c* L! {- ?
- KeyGenerator kgen = KeyGenerator.getInstance("AES"); //KeyGenerator提供(对称)密钥生成器的功能。使用getInstance 类方法构造密钥生成器。7 o7 s" v+ @- E, Z
- kgen.init(128, new SecureRandom(PASSWORD.getBytes()));//使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。
; }3 Y; Y9 y* r6 W$ N) l* j - SecretKey secretKey = kgen.generateKey();
5 H( [. C Z/ o& S' i2 t7 _& I - byte[] enCodeFormat = secretKey.getEncoded(); ! i1 d. G% X1 U5 g8 D
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");//使用SecretKeySpec类来根据一个字节数组构造一个 SecretKey,,而无须通过一个(基于 provider 的)SecretKeyFactory.
1 ?9 A" O# r4 T/ m4 i - Cipher cipher = Cipher.getInstance("AES");// 创建密码器 //为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。 4 H( F; J2 [; e0 w2 @
- byte[] byteContent = content.getBytes("utf-8"); & o" u9 L: ?1 A/ L. I2 E' D) v! X8 [
- cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 0 e9 ]$ ?2 F" Q1 ]0 [& A
- byte[] result = cipher.doFinal(byteContent); //按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
+ C8 O/ u$ [* i! x/ R$ x9 S% N( s - return result; // 加密
' N' j- d# t5 f- h# ]- _6 T - } catch (NoSuchAlgorithmException e) {
7 x0 h' L \. t. G% d9 k. ~ h; g% y - e.printStackTrace();
( O& `2 E. T9 K& q7 W, } - } catch (NoSuchPaddingException e) {
7 d- C Q% D9 T7 s - e.printStackTrace(); % p9 P: l+ M4 H- M8 v
- } catch (InvalidKeyException e) {
3 \; Y( @3 ~' p2 k2 d+ O - e.printStackTrace(); 6 v2 r5 l$ P- z9 V) @6 P* @) y' X* S
- } catch (UnsupportedEncodingException e) {
/ p7 W2 {- b7 }! ~4 V0 l - e.printStackTrace();
; g. ?0 Z4 K* x% T+ z - } catch (IllegalBlockSizeException e) {
9 p- g6 Q. f( V# H: T5 h q3 V0 I - e.printStackTrace(); 9 I7 D) b: g) |
- } catch (BadPaddingException e) { : g( S, ~$ Y9 x) F
- e.printStackTrace(); $ \4 U" q, E' _. f2 N" J' W3 T$ P. @
- }
5 f( ~ H1 F' }: O - return null;
$ J' o! O. f8 k. M. |' p8 v1 { - } 5 `! c( ?1 E. d) d
- public static byte[] decrypt(byte[] content) {
7 g2 f& @, v4 V3 b5 k5 `# Y ~ - try {- [9 E. g' R9 q, P+ z
- KeyGenerator kgen = KeyGenerator.getInstance("AES"); 3 j8 E- l# ]7 t0 y; p4 G
- kgen.init(128, new SecureRandom(PASSWORD.getBytes()));
. u1 ]6 j2 w$ L# W" u4 J - SecretKey secretKey = kgen.generateKey(); ! R4 M- M, B/ t3 L3 V
- byte[] enCodeFormat = secretKey.getEncoded(); ; G5 t9 U9 \9 O, S$ J* o' n, E
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); : z( n: |2 n; D0 `1 q
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器
6 _/ _+ X# R7 Q, G6 ^$ C. a6 b - cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
t3 |. y9 ~$ F( r# s9 n - byte[] result = cipher.doFinal(content);
2 c2 }9 `8 m9 i0 I. v - return result; // 加密 4 f5 U& {# h) U4 a8 S
- } catch (NoSuchAlgorithmException e) {
/ y2 G, a' O' T6 l9 g0 D+ j. J - e.printStackTrace();
: X8 m: x/ I7 l2 L$ ~ - } catch (NoSuchPaddingException e) {
4 l/ w" T4 D9 b% n - e.printStackTrace(); * _, b3 m; q. F
- } catch (InvalidKeyException e) { 4 W( w/ E: ~7 e2 x X* q0 `
- e.printStackTrace(); % p4 g8 P, t# J: u' V9 ~
- } catch (IllegalBlockSizeException e) {
1 ? p) O6 r1 [' K - e.printStackTrace();
0 L- C/ s. ^- ^1 e, ? - } catch (BadPaddingException e) { , y" W+ g' P& j
- e.printStackTrace();
" U1 |) G7 i' G+ v4 _ - } 0 I8 V, o0 U5 s" z, P/ Q
- return null;
% M8 E# d3 U# v8 L+ a' {# `4 F - }
3 b, ?; e8 T8 p+ S- l - /**将二进制转换成16进制
/ v$ \' N: j" G, o - * @param buf ' Y5 e9 D( Q. |+ |0 @2 Q
- * @return & P: t, `% K1 Z! d: N3 K: h' u
- */
+ A8 O3 m6 T' @ - public static String parseByte2HexStr(byte buf[]) {
( d. Q7 `2 v% C+ B( X - StringBuffer sb = new StringBuffer(); 8 F* [+ X& U' C: p& c
- for (int i = 0; i < buf.length; i++) {
. c& G( r; d. F, a& a; @2 l - String hex = Integer.toHexString(buf[i] & 0xFF);
! k) n) _, q6 H: b" n) b2 g - if (hex.length() == 1) {
% o6 ]9 o2 t- B2 o! T; |7 U - hex = '0' + hex;
8 @( Y# U6 v8 u; L! x# z5 d - } ' o" F) L: D3 O: P0 p+ Q
- sb.append(hex.toUpperCase());
! H( B4 f, N; B& I' t - } 1 s( O8 J2 U3 N1 `' }5 a
- return sb.toString(); , n/ X4 A. i4 `% Z, I( ^
- }
3 P R {, ^+ {0 D5 I: ]- ~ - /**将16进制转换为二进制 g! M) d4 [& X' Z! `
- * @param hexStr
& I) e' F+ @6 w, M1 ] - * @return
# y& ]2 ~4 y4 }1 s - */
* Y- {! \+ H9 ^. j$ p9 H* h% k. Y - public static byte[] parseHexStr2Byte(String hexStr) {
. s- } R, O' q F/ X5 y - if (hexStr.length() < 1) % V2 @$ E% R5 B) u4 {* O/ c$ D
- return null;
' R1 g% j) l" r( _6 E0 t8 y: ^ - byte[] result = new byte[hexStr.length()/2];
$ ^; ~/ z ?8 x0 q$ G. m - for (int i = 0;i< hexStr.length()/2; i++) {
6 E+ j9 N+ z8 J4 N4 `' g - int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); 9 {+ M, h2 ~$ |# g- q, r8 \
- int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); r" o1 b8 A [% p0 v+ l% Q/ ^
- result[i] = (byte) (high * 16 + low); 9 z& x9 R- R6 i1 y. R
- }
; n& Y' L! u9 x' P5 b5 i! f4 [ - return result; ' W8 D2 Y6 s4 Z$ q: j# i! ]
- }
( y1 P& \, T3 M& Y - //测试
& ~! x$ G6 W0 ^( x3 R - public static void main(String[] args) {
, ^8 i! P3 P% w8 g! c! M# K( B - String content = "test";
) e9 m% ^3 t4 s& Q; [# } - //加密 ; v# W7 `6 u! ]; a# k
- System.out.println("加密前:" + content);
1 e, E* ?" L; K/ E- {& C - byte[] encryptResult = encrypt(content); * ~) _$ [: v; N1 `
- String encryptResultStr = parseByte2HexStr(encryptResult);
( y* O: |1 h0 ? - System.out.println("加密后:" + encryptResultStr); - }) z& c, q( \( H
- //解密 3 l( y2 P& O- X( I& j
- byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
8 q" X6 [: [2 U - byte[] decryptResult = decrypt(decryptFrom); $ @$ Y8 |4 ]! u( w' v5 k% o+ k. M
- System.out.println("解密后:" + new String(decryptResult));
" V7 s, D z5 y5 E1 g: C$ e8 k# d7 g
1 `6 v8 N& D$ n) x" Z- g. V- }5 R; J7 f, ]5 I- f- R
- }
复制代码 |
|