鍍金池/ 問(wèn)答/PHP/ 怎么使用openssl替換 encryt 下的ecb加密模式,加密的結(jié)果不一樣

怎么使用openssl替換 encryt 下的ecb加密模式,加密的結(jié)果不一樣

PHP7.1后,mcrypt_decrypt加解密廢棄了,以前項(xiàng)目使用的是mcrypt加密的,現(xiàn)在換成openssl,不能得到相同的密文,大俠幫忙看一下,哪個(gè)地方配置錯(cuò)了。




    $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 "加密前數(shù)據(jù):".$str."\r\n";
    echo "Encrypt加密后數(shù)據(jù):".$en1."\r\n";
    echo "Decrypt解密的數(shù)據(jù):".$den1."\r\n";
    echo "openssl加密后數(shù)據(jù):".$en2."\r\n";
    echo "openssl解密的數(shù)據(jù):".$den2."\r\n";



    class AesCryptUtil{
        private static $key = 'VE1DS24xTENTUGVXbzltNzlxUTczSUYvdW5GaGRNeHc=';
        /**
         * [encrypt description]
         * 使用mcrypt庫(kù)進(jìn)行加密
         * @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庫(kù)進(jìn)行解密
         * @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庫(kù)進(jìn)行加密
         * @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庫(kù)進(jìn)行解密
         * @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;
        }
    }

運(yùn)行后的結(jié)果如下:

加密前數(shù)據(jù):oJrPejuwDI0yQnz1PVPEpqoRHWQ8
Encrypt加密后數(shù)據(jù):r0d668uEQfHeeNjfH6bsu8c/sMWeoD9GB8vLLuDQv3k=
Decrypt解密的數(shù)據(jù):oJrPejuwDI0yQnz1PVPEpqoRHWQ8
openssl加密后數(shù)據(jù):kcRSH49Gi5plcNrIqR53N6ZX5llo07V0EgllUaRnAKo=
openssl解密的數(shù)據(jù):oJrPejuwDI0yQnz1PVPEpqoRHWQ8

運(yùn)行后兩種方法加密的結(jié)果不一樣,但是各自都能解密。由于接口已經(jīng)固定,所有現(xiàn)在需要使用openssl 加密的密文和mcrypt加密后的一致,所以只能調(diào)整openssl的加密了

回答
編輯回答
墨小白

$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND)
這里的初始向量生成,參數(shù)是MCRYPT_RAND 是隨機(jī)源 所以理論上可能每次mcrypt加密出來(lái)的密文都是不一樣的?
http://php.net/manual/zh/func...

2017年7月25日 16:22
編輯回答
獨(dú)特范

可能是因?yàn)樘畛浜拖蛄康膯?wèn)題

2017年7月13日 19:19
編輯回答
孤毒

找到問(wèn)題解決方法了,是密鑰的位數(shù)造成的,我的密鑰是二進(jìn)制的24位,所以不能用AES-128-ECB ,改成AES-196-ECB就沒(méi)問(wèn)題了

2017年12月2日 21:27