TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
沙发
发表于 2014-12-25 13:48:17
|只看该作者
- /**# e, H0 k' _+ d, a
- * 加密解密7 x+ K) n% A& Q- n
- * @author zhangZhiPeng4 S, N" u% ?+ Q: M. f( `
- * @date 2014年12月24日
- \ W" H5 x6 X% I; d/ n' a8 t2 u% B - */; g& V# E+ r* O' R, n
- import java.io.UnsupportedEncodingException;
$ y: O% s1 r7 j$ h& F) { - import java.security.*;
( x) Y0 m: A- L7 a! E+ T3 C* ` - import java.util.ResourceBundle;! B' T/ r" q3 V) z9 P* e- c
- ' M0 }, `, C" \4 p$ p) L& p
- import javax.crypto.*;
: Y2 J( v" ^. w - import javax.crypto.spec.SecretKeySpec;( a& ~; |. Z6 V% S; _
- public class AESUtil {# p! E# Z3 _# P3 F" F3 k( a
- private static String PASSWORD = "";
, j7 e$ r0 ^. G+ J% e% V* V* ]1 u" K
1 [& J9 }6 {2 J+ u' O0 S* D. ^8 Z! a- static{; V9 A& G) x w! T: z4 r
- ResourceBundle resource = ResourceBundle.getBundle("config");1 Q8 N2 m: ?( M0 F
- PASSWORD = resource.getString("PASSWORD");
4 |8 O9 A, x. Z# p5 a& l! i - }: I- H4 I$ K/ X! |
- public static byte[] encrypt(String content) {
/ t4 a2 L# n, v" J6 g/ h! T2 t - try {
2 r6 D4 |2 C) Z- W H+ G - KeyGenerator kgen = KeyGenerator.getInstance("AES"); //KeyGenerator提供(对称)密钥生成器的功能。使用getInstance 类方法构造密钥生成器。
# L+ C0 T7 }+ m k1 R% J. [- x9 _ - kgen.init(128, new SecureRandom(PASSWORD.getBytes()));//使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。2 y: ?7 z8 _ ?7 b
- SecretKey secretKey = kgen.generateKey(); 7 C/ o1 B3 o2 j" u' k, Q; O
- byte[] enCodeFormat = secretKey.getEncoded();
0 t! L6 _2 l% D - SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");//使用SecretKeySpec类来根据一个字节数组构造一个 SecretKey,,而无须通过一个(基于 provider 的)SecretKeyFactory.% R" C) F% v" `5 P$ m0 z7 S+ d
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器 //为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。 , k$ T( q9 |7 s" N
- byte[] byteContent = content.getBytes("utf-8"); 8 l, U7 d' M: m4 S
- cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 # V1 b" z; i( _* M, S! ~
- byte[] result = cipher.doFinal(byteContent); //按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
* b: G" w( O, K+ i) p" J - return result; // 加密 8 f! d; {# ?' i- n* s: T* H
- } catch (NoSuchAlgorithmException e) {
, X0 E+ u3 d2 x. ]0 b$ n - e.printStackTrace();
* G! Z( _+ C6 t) d/ G- e9 m - } catch (NoSuchPaddingException e) {
& h4 w& D5 ~: C" M/ { - e.printStackTrace(); # F# J/ z& d: g. k0 g6 k. Q
- } catch (InvalidKeyException e) {
- E* P; K0 t$ }7 r. q5 _( r - e.printStackTrace();
2 u w6 m& S% `; w% k0 R. m - } catch (UnsupportedEncodingException e) {
3 B( M$ H" n l' g - e.printStackTrace();
+ B& @9 n+ r4 ] - } catch (IllegalBlockSizeException e) {
* t2 a" o% ~8 s* W9 K5 X. D+ D - e.printStackTrace();
! ?+ u+ ^& @* h) h$ k" t/ H$ f - } catch (BadPaddingException e) { ; m. I) d' d5 i& J3 U% R. T
- e.printStackTrace();
) m3 \- ]$ M0 c& W' S. D7 @) c2 w! X - }
+ H' H' x2 \. Q+ X' T6 p5 } - return null; x# r, t0 ^3 F7 i: G5 P
- } 0 S, ^: J- v) B: E) K$ \; G- ]1 j3 q
- public static byte[] decrypt(byte[] content) {
% q. Z9 C4 [+ W- b9 i6 K - try {5 T% ?0 V& M0 X& W
- KeyGenerator kgen = KeyGenerator.getInstance("AES"); X7 ]2 m5 Z+ C$ c) W8 c/ ?
- kgen.init(128, new SecureRandom(PASSWORD.getBytes())); 1 b2 j9 Z) I- @( l
- SecretKey secretKey = kgen.generateKey();
5 O; r( X+ v/ e2 S% d - byte[] enCodeFormat = secretKey.getEncoded();
0 i {6 d8 E* n# X1 c+ e - SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
& e; u8 E: r4 }( Y - Cipher cipher = Cipher.getInstance("AES");// 创建密码器
& ~) o, ~9 G3 ~ { - cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
' }7 ^* Y) K3 t$ q# T! w$ ?* n8 M - byte[] result = cipher.doFinal(content); 5 D; n9 J1 m, {2 |6 Q
- return result; // 加密 - r0 c, ?) H7 P+ ]* L
- } catch (NoSuchAlgorithmException e) { " r- y! u8 s! G7 ?4 t* w
- e.printStackTrace();
# I; V7 G9 C, z7 V) g - } catch (NoSuchPaddingException e) { $ k t a6 ]# M! T2 M' a9 ~
- e.printStackTrace();
: ~5 ] K3 a5 W: f+ e. c - } catch (InvalidKeyException e) { : b# V) J" N0 `; K
- e.printStackTrace();
6 r. f+ H) t% o& ?: V1 B - } catch (IllegalBlockSizeException e) { 0 ?6 @; J, Z4 [! |9 u0 w
- e.printStackTrace();
" ?# B# N! R- J3 d L- Z* f - } catch (BadPaddingException e) { 5 G( ^& u3 N1 l' o- B; n. |# U
- e.printStackTrace(); . @7 z! _/ c: S# S* N# q1 g9 q+ o L
- } . n1 H% q4 A6 z
- return null; ' k% p1 M9 I2 O1 h
- }
' P) x9 K7 r" Q - /**将二进制转换成16进制 ( K4 o( R8 K M. L, D; I$ I- a
- * @param buf & H9 E0 E4 I: j* x
- * @return / f/ r, o* Q! G
- */
( \1 O& w: e/ Y X6 S0 h0 B - public static String parseByte2HexStr(byte buf[]) { 7 E) U2 D, Q7 U) r
- StringBuffer sb = new StringBuffer();
! n3 F0 { v9 L: P) \ - for (int i = 0; i < buf.length; i++) { % J% I3 Z, W9 z* O3 H1 {; Y) p# `
- String hex = Integer.toHexString(buf[i] & 0xFF);
6 G# R7 E/ Y" p" @6 [- _ - if (hex.length() == 1) {
/ I( L! w1 M( B7 T: f - hex = '0' + hex;
s9 K3 `7 f; t4 g- b" } - }
7 H" S# l: |9 c) q! J - sb.append(hex.toUpperCase());
+ w6 p3 N$ Y3 P7 _" T) u - }
: ]: E5 Z) W$ ^* X ^) n4 Q - return sb.toString();
# J: x- H- o$ g$ D7 D I! o1 g - } G: S$ d& Q; z1 O% d! A) Z
- /**将16进制转换为二进制
1 @& K8 [- S5 f6 H' L. I' r( p - * @param hexStr
2 U6 s& Q' R! Y' L1 A - * @return 2 I4 J# N6 T! ^$ D
- */ 0 `5 U8 ?) h! A9 e
- public static byte[] parseHexStr2Byte(String hexStr) {
. d8 l3 ~+ ?6 [5 J3 S0 m0 S2 _ - if (hexStr.length() < 1) 3 h6 M, h" w5 h7 Q" J
- return null;
' L) O b/ g! i) k3 w& _8 c) N/ ~ - byte[] result = new byte[hexStr.length()/2];
* z! N+ P d. e3 G. G - for (int i = 0;i< hexStr.length()/2; i++) { / j' s1 b: M9 `5 \
- int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); `3 _2 d6 K ` Y, d
- int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); : G: g+ r7 j: a( i; \- [+ m
- result[i] = (byte) (high * 16 + low);
. r% P& K% G# Q' x- F - }
$ d6 s2 R4 s! a5 d( O- ?# n - return result; # Y4 ~0 ^) s, ?- w) _; b
- } 5 R4 r. m' w4 A% p
- //测试
, l' q0 @- s2 w* |. j a - public static void main(String[] args) {" U# U. \0 [3 U+ n) ~( } J
- String content = "test"; 9 @0 K5 b3 q- J" ?5 l
- //加密
# p7 H8 m; K& q2 }$ H - System.out.println("加密前:" + content);
3 `9 u- P2 L; \- O { - byte[] encryptResult = encrypt(content);
% }' ]6 |& u C# Z! Z, U - String encryptResultStr = parseByte2HexStr(encryptResult);
) z3 k m) M9 G$ O9 k6 w3 P: r0 ? - System.out.println("加密后:" + encryptResultStr);
& T8 P! U4 g" M2 E0 q - //解密
/ x0 B! d8 P# B8 J - byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
" q) r0 u! R" Y- m - byte[] decryptResult = decrypt(decryptFrom);
6 |0 g) `- B1 R! Q1 a5 N9 U - System.out.println("解密后:" + new String(decryptResult)); $ e# N7 C& s: e7 L
4 ?* O0 \( w5 q( R$ j/ E# L5 a- }
- Y3 p0 |9 W* ?; J( \4 E - }
复制代码 |
|