php与java通用AES加密解密算法
AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法。
php版代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
<?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected $pad_method = NULL; protected $secret_key = '' ; protected $iv = '' ; public function set_cipher( $cipher ) { $this ->cipher = $cipher ; } public function set_mode( $mode ) { $this ->mode = $mode ; } public function set_iv( $iv ) { $this ->iv = $iv ; } public function set_key( $key ) { $this ->secret_key = $key ; } public function require_pkcs5() { $this ->pad_method = 'pkcs5' ; } protected function pad_or_unpad( $str , $ext ) { if ( is_null ( $this ->pad_method) ) { return $str ; } else { $func_name = __CLASS__ . '::' . $this ->pad_method . '_' . $ext . 'pad' ; if ( is_callable ( $func_name ) ) { $size = mcrypt_get_block_size( $this ->cipher, $this ->mode); return call_user_func( $func_name , $str , $size ); } } return $str ; } protected function pad( $str ) { return $this ->pad_or_unpad( $str , '' ); } protected function unpad( $str ) { return $this ->pad_or_unpad( $str , 'un' ); } public function encrypt( $str ) { $str = $this ->pad( $str ); $td = mcrypt_module_open( $this ->cipher, '' , $this ->mode, '' ); if ( empty ( $this ->iv) ) { $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size( $td ), MCRYPT_RAND); } else { $iv = $this ->iv; } mcrypt_generic_init( $td , $this ->secret_key, $iv ); $cyper_text = mcrypt_generic( $td , $str ); $rt = base64_encode ( $cyper_text ); //$rt = bin2hex($cyper_text); mcrypt_generic_deinit( $td ); mcrypt_module_close( $td ); return $rt ; } public function decrypt( $str ){ $td = mcrypt_module_open( $this ->cipher, '' , $this ->mode, '' ); if ( empty ( $this ->iv) ) { $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size( $td ), MCRYPT_RAND); } else { $iv = $this ->iv; } mcrypt_generic_init( $td , $this ->secret_key, $iv ); //$decrypted_text = mdecrypt_generic($td, self::hex2bin($str)); $decrypted_text = mdecrypt_generic( $td , base64_decode ( $str )); $rt = $decrypted_text ; mcrypt_generic_deinit( $td ); mcrypt_module_close( $td ); return $this ->unpad( $rt ); } public static function hex2bin( $hexdata ) { $bindata = '' ; $length = strlen ( $hexdata ); for ( $i =0; $i amp;< $length ; $i += 2) { $bindata .= chr (hexdec( substr ( $hexdata , $i , 2))); } return $bindata ; } public static function pkcs5_pad( $text , $blocksize ) { $pad = $blocksize - ( strlen ( $text ) % $blocksize ); return $text . str_repeat ( chr ( $pad ), $pad ); } public static function pkcs5_unpad( $text ) { $pad = ord( $text { strlen ( $text ) - 1}); if ( $pad > strlen ( $text )) return false; if ( strspn ( $text , chr ( $pad ), strlen ( $text ) - $pad ) != $pad ) return false; return substr ( $text , 0, -1 * $pad ); } } $keyStr = 'UITN25LMUQC436IM' ; $plainText = 'this is a string will be AES_Encrypt' ; $aes = new CryptAES(); $aes ->set_key( $keyStr ); $aes ->require_pkcs5(); $encText = $aes ->encrypt( $plainText ); $decString = $aes ->decrypt( $encText ); echo $encText , "n" , $decString ; ?> |
运行结果:
fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9
this is a string will be AES_Encrypt
java版代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class CryptAES { private static final String AESTYPE = "AES/ECB/PKCS5Padding" ; public static String AES_Encrypt(String keyStr, String plainText) { byte [] encrypt = null ; try { Key key = generateKey(keyStr); Cipher cipher = Cipher.getInstance(AESTYPE); cipher.init(Cipher.ENCRYPT_MODE, key); encrypt = cipher.doFinal(plainText.getBytes()); } catch (Exception e){ e.printStackTrace(); } return new String(Base64.encodeBase64(encrypt)); } public static String AES_Decrypt(String keyStr, String encryptData) { byte [] decrypt = null ; try { Key key = generateKey(keyStr); Cipher cipher = Cipher.getInstance(AESTYPE); cipher.init(Cipher.DECRYPT_MODE, key); decrypt = cipher.doFinal(Base64.decodeBase64(encryptData)); } catch (Exception e){ e.printStackTrace(); } return new String(decrypt).trim(); } private static Key generateKey(String key) throws Exception{ try { SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES" ); return keySpec; } catch (Exception e){ e.printStackTrace(); throw e; } } public static void main(String[] args) { String keyStr = "UITN25LMUQC436IM" ; String plainText = "this is a string will be AES_Encrypt" ; String encText = AES_Encrypt(keyStr, plainText); String decString = AES_Decrypt(keyStr, encText); System.out.println(encText); System.out.println(decString); } } |
运行结果:
fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9
this is a string will be AES_Encrypt
学习时的痛苦是暂时的 未学到的痛苦是终生的