为了账号安全,请及时绑定邮箱和手机立即绑定

怎么使用openssl替换 encryt 下的ecb加密模式,加密的结果不一样

怎么使用openssl替换 encryt 下的ecb加密模式,加密的结果不一样

PHP
慕雪6442864 2019-03-11 14:48:11
PHP7.1后,mcrypt_decrypt加解密废弃了,以前项目使用的是mcrypt加密的,现在换成openssl,不能得到相同的密文,大侠帮忙看一下,哪个地方配置错了。 $str = 'oJrPejuwDI0yQnz1PVPEpqoRHWQ8'; $key = base64_decode('TMCKn1LCSPeWo9m79qQ73IF/unFhdMxw1'); $Encr = new AesCryptUtil(); $en1 = $Encr::mcryptEncrypt($str,$key); $en2 = $Encr::opensslEncrypt($str,$key); $den1= $Encr::mcryptDecrypt($en1,$key); $den2= $Encr::opensslDecrypt($en2,$key); echo "加密前数据:".$str."\r\n"; echo "Encrypt加密后数据:".$en1."\r\n"; echo "Decrypt解密的数据:".$den1."\r\n"; echo "openssl加密后数据:".$en2."\r\n"; echo "openssl解密的数据:".$den2."\r\n"; class AesCryptUtil{ private static $key = 'VE1DS24xTENTUGVXbzltNzlxUTczSUYvdW5GaGRNeHc='; /** * [encrypt description] * 使用mcrypt库进行加密 * @param [type] $input * @param [type] $key * @return [type] */ public static function mcryptEncrypt($input, $key) { $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $input = self::pkcs5Pad($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_DEV_URANDOM mcrypt_generic_init($td, $key, $iv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } /** * [pkcs5Pad description] * @param [type] $text * @param [type] $blocksize * @return [type] */ private static function pkcs5Pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } /** * [decrypt description] * 使用mcrypt库进行解密 * @param [type] $sStr * @param [type] $sKey * @return [type] */ public static function mcryptDecrypt($sStr, $sKey) { $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);//MCRYPT_DEV_URANDOM $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $sKey, base64_decode($sStr), MCRYPT_MODE_ECB, $iv); $dec_s = strlen($decrypted); $padding = ord($decrypted[$dec_s-1]); $decrypted = substr($decrypted, 0, -$padding); return $decrypted; } /** * [opensslDecrypt description] * 使用openssl库进行加密 * @param [type] $sStr * @param [type] $sKey * @return [type] */ public static function opensslEncrypt($sStr, $sKey, $method = 'AES-128-ECB'){ $str = openssl_encrypt($sStr,$method,$sKey); return $str; } /** * [opensslDecrypt description] * 使用openssl库进行解密 * @param [type] $sStr * @param [type] $sKey * @return [type] */ public static function opensslDecrypt($sStr, $sKey, $method = 'AES-128-ECB'){ $str = openssl_decrypt($sStr,$method,$sKey); return $str; } } 运行后的结果如下: 加密前数据:oJrPejuwDI0yQnz1PVPEpqoRHWQ8Encrypt加密后数据:r0d668uEQfHeeNjfH6bsu8c/sMWeoD9GB8vLLuDQv3k=Decrypt解密的数据:oJrPejuwDI0yQnz1PVPEpqoRHWQ8openssl加密后数据:kcRSH49Gi5plcNrIqR53N6ZX5llo07V0EgllUaRnAKo=openssl解密的数据:oJrPejuwDI0yQnz1PVPEpqoRHWQ8 运行后两种方法加密的结果不一样,但是各自都能解密。由于接口已经固定,所有现在需要使用openssl 加密的密文和mcrypt加密后的一致,所以只能调整openssl的加密了
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

可能是因为填充和向量的问题

查看完整回答
反对 回复 2019-03-18
?
皈依舞

TA贡献1851条经验 获得超3个赞

找到问题解决方法了,是密钥的位数造成的,我的密钥是二进制的24位,所以不能用AES-128-ECB ,改成AES-196-ECB就没问题了

查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 606 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信