Last active
July 23, 2017 00:23
-
-
Save border/90b19dfc7d2ff0745f94a11983bbf4ac to your computer and use it in GitHub Desktop.
php/java AES encrypt ref: 1. https://bluehua.org/2010/03/20/1039.html 2. https://github.com/stevenholder/PHP-Java-AES-Encrypt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package demo; | |
import javax.crypto.Cipher; | |
import javax.crypto.spec.SecretKeySpec; | |
public class aes { | |
/** | |
* java字节码转字符串 | |
* @param b | |
* @return | |
*/ | |
public static String byte2hex(byte[] b) { //一个字节的数, | |
// 转成16进制字符串 | |
String hs = ""; | |
String tmp = ""; | |
for (int n = 0; n < b.length; n++) { | |
//整数转成十六进制表示 | |
tmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); | |
if (tmp.length() == 1) { | |
hs = hs + "0" + tmp; | |
} else { | |
hs = hs + tmp; | |
} | |
} | |
tmp = null; | |
return hs.toUpperCase(); //转成大写 | |
} | |
/** | |
* 字符串转java字节码 | |
* @param b | |
* @return | |
*/ | |
public static byte[] hex2byte(byte[] b) { | |
if ((b.length % 2) != 0) { | |
throw new IllegalArgumentException("长度不是偶数"); | |
} | |
byte[] b2 = new byte[b.length / 2]; | |
for (int n = 0; n < b.length; n += 2) { | |
String item = new String(b, n, 2); | |
// 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个进制字节 | |
b2[n / 2] = (byte) Integer.parseInt(item, 16); | |
} | |
b = null; | |
return b2; | |
} | |
public static String encrypt(String input, String key) { | |
byte[] crypted = null; | |
try { | |
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES"); | |
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); | |
cipher.init(Cipher.ENCRYPT_MODE, skey); | |
crypted = cipher.doFinal(input.getBytes()); | |
} catch (Exception e) { | |
System.out.println(e.toString()); | |
} | |
return new String(byte2hex(crypted)); | |
} | |
public static String decrypt(String input, String key) { | |
byte[] output = null; | |
try { | |
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES"); | |
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); | |
cipher.init(Cipher.DECRYPT_MODE, skey); | |
output = cipher.doFinal(hex2byte(input.getBytes())); | |
} catch (Exception e) { | |
System.out.println(e.toString()); | |
} | |
return new String(output); | |
} | |
public static void main(String[] args) { | |
String key = "1234567890123456"; | |
String data = "abcd"; | |
System.out.println(encrypt(data, key)); | |
System.out.println(decrypt(encrypt(data, key), key)); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$aes = new CryptAES(); | |
$aes->set_key('1234567890123456'); | |
$aes->require_pkcs5(); | |
$rt = $aes->encrypt('abcd'); | |
echo $rt . PHP_EOL; | |
echo $aes->decrypt($rt) . PHP_EOL; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 = 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)); | |
$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 < $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); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment