TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
沙发
发表于 2014-12-25 13:48:17
|只看该作者
- /**! f2 T& Q# C% s$ Z T/ q/ z
- * 加密解密
3 ~8 w7 E5 m9 D0 ` - * @author zhangZhiPeng
6 P* O( V" ?) I - * @date 2014年12月24日. f+ \2 y& o; V
- *// F0 X9 z6 y; L' R2 b7 ], u8 ]
- import java.io.UnsupportedEncodingException;
7 s0 U% @, _6 {7 P( r4 A- F' f - import java.security.*;$ t6 K) {3 V, l
- import java.util.ResourceBundle;
" I5 E* J3 F$ d - . G. \: M. a6 R
- import javax.crypto.*;0 s) @# p6 I1 u9 x: G4 @
- import javax.crypto.spec.SecretKeySpec;+ Q- b9 j/ L3 N& z$ X. {
- public class AESUtil {7 z/ |( s' t- q6 `
- private static String PASSWORD = "";
9 t5 P# m6 W" P* z! A- M
" w M5 K N8 @5 g1 _- static{
& ]# }, @2 m& J - ResourceBundle resource = ResourceBundle.getBundle("config");' q# @, L" S5 _' z* h2 y
- PASSWORD = resource.getString("PASSWORD");1 U5 @" \+ s$ X+ o4 P! p9 F' w* t
- }: ^ R# U3 c- k- q8 b( U
- public static byte[] encrypt(String content) {
/ K; ~- a/ }/ x' _1 M - try {
9 x% m0 _! u2 D; n! a - KeyGenerator kgen = KeyGenerator.getInstance("AES"); //KeyGenerator提供(对称)密钥生成器的功能。使用getInstance 类方法构造密钥生成器。1 f- v( c0 j1 F2 M4 K' c
- kgen.init(128, new SecureRandom(PASSWORD.getBytes()));//使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。
# m" T* u' v) u' x& e2 o, @ e - SecretKey secretKey = kgen.generateKey();
' G4 m! z# T4 B3 V0 @* h7 l% U6 l - byte[] enCodeFormat = secretKey.getEncoded();
) [: {) l# l8 s5 m' u - SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");//使用SecretKeySpec类来根据一个字节数组构造一个 SecretKey,,而无须通过一个(基于 provider 的)SecretKeyFactory.: V& x h- O( a1 W, n: `
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器 //为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。
8 B+ p0 D3 @. @ - byte[] byteContent = content.getBytes("utf-8");
H5 y2 [" l0 i c. X M9 Z; [ - cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
* P) A2 p3 |9 K5 t - byte[] result = cipher.doFinal(byteContent); //按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
& x+ d( M" h$ p8 ^ - return result; // 加密 - a7 A, j7 z1 u9 `6 O
- } catch (NoSuchAlgorithmException e) { , _3 ~" D T/ d$ |' O. T
- e.printStackTrace(); 8 F- p% c$ q% R. ~- |5 `
- } catch (NoSuchPaddingException e) {
: {8 r! r0 ?" ?. A - e.printStackTrace(); & s Q( M, E; `1 v: u4 t
- } catch (InvalidKeyException e) { 6 N9 f& Q4 f( R' F
- e.printStackTrace(); : x% F1 a4 c$ }) b& x8 t( {! s
- } catch (UnsupportedEncodingException e) { / `8 v4 v( ?! y$ T5 k
- e.printStackTrace();
A" f5 v5 b$ H9 |6 N: Y - } catch (IllegalBlockSizeException e) {
' Z) l* d& D3 l5 d - e.printStackTrace();
& F9 F" t9 r# Q - } catch (BadPaddingException e) {
# v- Q' U9 i8 v/ ?( n" U/ [0 o) W) ` - e.printStackTrace();
6 P7 r6 J9 J6 i4 f e - }
: p/ l9 [. a! [/ l - return null;
. l" u0 W1 V! S5 l4 ?' S4 L - }
8 n0 o8 e, A7 R; ^9 _6 r7 \ - public static byte[] decrypt(byte[] content) { / G" g* e5 T/ ]8 c& P7 |$ ^% ?4 `
- try {
5 Q+ M: ?% d9 E3 I. S - KeyGenerator kgen = KeyGenerator.getInstance("AES"); ' S1 a& q6 t& A( Y
- kgen.init(128, new SecureRandom(PASSWORD.getBytes()));
) f c1 y$ @" K- ^' o - SecretKey secretKey = kgen.generateKey(); ) j3 D8 E$ T% d
- byte[] enCodeFormat = secretKey.getEncoded();
" Z. q b$ U. J0 q3 U6 n8 A - SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); ' w: K. _4 M* z+ x+ [
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器
- w. i8 @7 {( }) E+ v# y; k+ X7 p# x - cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 % y) g+ E! w; Y3 n6 D! P- j5 E
- byte[] result = cipher.doFinal(content); X) \, I* X! _
- return result; // 加密 7 Y8 x. {7 r; Q. Z
- } catch (NoSuchAlgorithmException e) {
# L2 e0 W8 @5 v$ n - e.printStackTrace(); $ f% h3 v2 S% A
- } catch (NoSuchPaddingException e) { 0 L# b0 d H4 q% i- @4 ?* L
- e.printStackTrace();
' j6 a5 ]7 s% T0 w3 J4 _3 m - } catch (InvalidKeyException e) { ( E3 O# V) U) K8 ^: a/ R: W
- e.printStackTrace(); 5 Y% X7 O5 h2 N* g2 V z; w
- } catch (IllegalBlockSizeException e) { ! J3 G7 Q4 o9 D5 u# ]" X
- e.printStackTrace();
) p# M$ C: B7 C# ` - } catch (BadPaddingException e) { ! K" V+ a5 Z; n% h0 H0 I
- e.printStackTrace(); " X; x# Y# q* Y5 i" O( ^, h
- } ) j- o' ]4 p% O" r- K
- return null;
+ ?* u7 N4 Q" C0 x7 P - }
$ j% I- a, L# l( d8 O7 M - /**将二进制转换成16进制 4 x5 ] k- E% s' d1 ~; z
- * @param buf
7 @2 n2 U2 C$ u; t+ o& w - * @return 4 _0 C- |+ b7 }$ o* g, ?
- */
% G" d( n( M( P# ^4 R: W$ s - public static String parseByte2HexStr(byte buf[]) {
( B0 N3 T/ x2 f1 D Q - StringBuffer sb = new StringBuffer(); ( O W% o! A6 P: x# B9 C' ^
- for (int i = 0; i < buf.length; i++) {
6 s0 M/ `4 [8 W - String hex = Integer.toHexString(buf[i] & 0xFF);
1 W4 Z# w; j; p: y/ p - if (hex.length() == 1) {
2 E6 ^5 q8 {* K# O. X) X) r - hex = '0' + hex; 5 S; r& Y) T0 t! K' y1 G. j
- } $ Q* k* x5 Z. @2 N' ]: g( |
- sb.append(hex.toUpperCase()); & z( W+ N5 ?8 Z% K/ t3 \4 m
- } 8 S5 M* z Z+ y; I- [
- return sb.toString();
3 d0 J# |2 s* t% w* x - } : n2 d7 n. d, ^; V2 S( l5 C
- /**将16进制转换为二进制
& \! ~& D) S; P) o! {. p1 z; Z - * @param hexStr
6 Q, _& r' R4 ~8 O4 k' k9 [4 x4 F - * @return . E$ o- c0 a1 {- c4 N
- */ {+ C& F/ q8 M* G
- public static byte[] parseHexStr2Byte(String hexStr) {
8 H* e3 O) z3 F: J4 [- d - if (hexStr.length() < 1)
! `; U% [8 b3 F: A# |6 r7 l% X - return null; 1 Y4 v- U" M* e i7 |2 O( u" }
- byte[] result = new byte[hexStr.length()/2];
7 D9 G0 o B# U6 k# L. z6 d - for (int i = 0;i< hexStr.length()/2; i++) { 5 O4 g: R* y1 F: `* R% }) ?% @
- int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); * q, k$ ~; T- @, Q* m. U0 Q& h% r
- int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); ) ?) T8 ?, v; }$ u# m z6 T
- result[i] = (byte) (high * 16 + low); 2 J' ?' B/ c3 c5 s0 h. \
- }
4 a$ ^$ o3 t2 K& d3 A4 d - return result; 0 F0 ` B+ w4 q. {. G' }
- } ) \$ X2 T, z4 |1 D
- //测试! K% ?! M$ t: a1 ~/ T( V; r: {
- public static void main(String[] args) {
& f4 T2 K* o1 ]8 k7 a: k3 H - String content = "test"; 2 S9 x$ L# i7 t! ^
- //加密 1 I' o; ]/ w$ _
- System.out.println("加密前:" + content); ' T' {. m& ~$ y5 I# g
- byte[] encryptResult = encrypt(content);
: a$ E+ T4 u4 Y1 q. s - String encryptResultStr = parseByte2HexStr(encryptResult); 5 i, R4 N3 N0 o+ b$ t
- System.out.println("加密后:" + encryptResultStr);
3 y4 m# Z. C( n& S* n# k D - //解密
: K [5 k5 H! Z$ C- R* B% l - byte[] decryptFrom = parseHexStr2Byte(encryptResultStr); 3 Z2 G, B/ e9 k& [/ _. c* c
- byte[] decryptResult = decrypt(decryptFrom); % h. U' Z2 l# X0 n, l% T8 _, E
- System.out.println("解密后:" + new String(decryptResult)); 0 p1 `- t( R9 e$ B8 U; a$ b H. g
+ q/ J/ S) I0 u" ^; ]- h; q- }
+ \1 ]$ l' F" a }- E! h7 N2 ~5 b - }
复制代码 |
|