最近做一个跟java系统对接,java那边传过来的数据进行了AES加密,所以php这边需要对数据进行解密 PHP里面补码方式只有:ZeroPadding这一种方式,而java接口那边是用PKCS5Padding补码方式,所以需要自己实现PKCS5Padding补码

加密方式:

  • AES 加密使用的方式为:ECB/PKCS5,密码key 使用16个字节,如果密码字符串转字节长度大于16,则有效密码为(1-16)的字节,如果密码字符串转字节长度小于16,则后面的字节统一使用字符‘0’的ASCII码(0x48)。
  • 使用GZIP压缩
  • 字符串与字节的转换使用编码格式:UTF-8 (使用环境:BASE64/ GZIP字符串压缩/解压缩及AES加密)

程序如下:

class Security {
    public static function encrypt($input, $key) {
        $size     = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $input     = Security::pkcs5_pad($input, $size);
        $td     = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
        $iv     = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $key, $iv);
        $data     = mcrypt_generic($td, $input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        //gzip压缩
        $data     = gzencode($data);
        //base64压缩
        $data     = base64_encode($data);
        return $data;
    }
    private static function pkcs5_pad ($text, $blocksize) {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }
    public static function decrypt($sStr, $sKey) {
        $decrypted = mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128,
            $sKey,
            gzdecode(base64_decode($sStr)),
            MCRYPT_MODE_ECB
        );

        $dec_s         = strlen($decrypted);
        $padding     = ord($decrypted[$dec_s-1]);
        $decrypted     = substr($decrypted, 0, -$padding);
        return $decrypted;
    }
}

测试程序:

$key = "1234567800000000";
$data = "数据测试123456789ABCDEF";

$value = Security::encrypt($data , $key );
echo "输入:" . $data;
echo "\n";
echo "加密:" . $value;
echo "\n";
echo "解密:" . Security::decrypt($value, $key );

测试结果:

输入:数据测试123456789ABCDEF
加密:H4sIAAAAAAAAC7tzTqOaW6phYyLLAv87Jq6iMfFs288YZjp3rk5avdhgyzQABVsjIyAAAAA=
解密:数据测试123456789ABCDEF