PHP与JAVA使用AES128位加密通信
问题:联调时候发现php的解密解析不了java加密后的东西,解出来发现时乱码,当时就崩溃了,,奇了怪了,看了这篇文章,我真的是要醉了。。。。。。。。。。最后附上了php类库,留作以后备用。
问题:使用Java默认的AES加密方式(Cipher.getInstance("AES"))并对加密后结果进行Base64编码,这样php(http://phpaes.com/使用这里免费的AES实现版本
附:php aes类库
<?php
class AesDe{
const SHA1 = 'SHA1';
const CBC = 'cbc';
const CIPHER = 'rijndael-128';
const BLOCKSIZE = 128;
const HASH_ITERATIONS = 10000;
const KEY_LENGTH = 32;
//偏移变量
private $arrIv = array(0xA, 1, 0xB, 5, 4, 0xF, 7, 9, 0x17, 3, 1, 6, 8, 0xC, 0xD, 91);
//salt 值
private $arrSalt = array(1, 3, 9, 6, 9, 4, 4, 4, 0, 2, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF);
public function aes($ostr, $aes_key, $type='encrypt'){
if($ostr==''){
return '';
}
//只能用128解密,虽然大地的demo是256
$td = mcrypt_module_open(self::CIPHER, '', self::CBC, '');
//不能用随机的iv
$iv = self::genIV();
$salt = self::genSalt();
$key = self::pbkdf2(self::SHA1, $aes_key, $salt, self::HASH_ITERATIONS, self::KEY_LENGTH);
mcrypt_generic_init($td, $key, $iv);
$str = '';
switch($type){
case 'encrypt':
$str = trim(base64_encode(mcrypt_generic($td, $this->pkcs5Pad($ostr))));
break;
case 'decrypt':
$str = trim(mdecrypt_generic($td, base64_decode($ostr)));
break;
}
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $str;
}
private function pbkdf2($algorithm, $password, $salt, $count, $key_length) {
$algorithm = strtolower($algorithm);
if(!in_array($algorithm, hash_algos(), true)){
trigger_error('PBKDF2 ERROR: Invalid hash algorithm.', E_USER_ERROR);
}
if($count <= 0 || $key_length <= 0) {
trigger_error('PBKDF2 ERROR: Invalid parameters.', E_USER_ERROR);
}
$hash_length = strlen(hash($algorithm, "", true));
$block_count = ceil($key_length / $hash_length);
$output = "";
for($i = 1; $i <= $block_count; $i++) {
$last = $salt . pack("N", $i);
$last = $xorsum = hash_hmac($algorithm, $last, $password, true);
for ($j = 1; $j < $count; $j++) {
$xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
}
$output .= $xorsum;
}
return substr($output, 0, $key_length);
}
private function genIV() {
$iv = '';
foreach($this->arrIv as $value) {
$iv .= chr($value);
}
return $iv;
}
private function genSalt() {
$salt = '';
foreach($this->arrSalt as $value) {
$salt .= chr($value);
}
return $salt;
}
private function pkcs5Pad($data) {
$blockSize = mcrypt_get_block_size(self::CIPHER, self::CBC);
$pad = $blockSize - (strlen($data) % $blockSize);
return $data . str_repeat(chr($pad), $pad);
}
}