账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    怎么使用openssl替换 encryt 下的ecb加密模式,加密的结果不一样
    36
    0

    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;
            }
        }

    运行后的结果如下:

    加密前数据:oJrPejuwDI0yQnz1PVPEpqoRHWQ8
    Encrypt加密后数据:r0d668uEQfHeeNjfH6bsu8c/sMWeoD9GB8vLLuDQv3k=
    Decrypt解密的数据:oJrPejuwDI0yQnz1PVPEpqoRHWQ8
    openssl加密后数据:kcRSH49Gi5plcNrIqR53N6ZX5llo07V0EgllUaRnAKo=
    openssl解密的数据:oJrPejuwDI0yQnz1PVPEpqoRHWQ8

    运行后两种方法加密的结果不一样,但是各自都能解密。由于接口已经固定,所有现在需要使用openssl 加密的密文和mcrypt加密后的一致,所以只能调整openssl的加密了

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 西方求醉 普通会员 1楼

      在使用openssl替换加密模式(ECB)时,通常会使用不同的加密算法,例如AES-CBC、AES-128-CBC、AES-256-CBC等。ECB模式是标准的加密模式,用于对明文进行加密。以下是在使用openssl替换ECB模式时的一些步骤:

      1. 导入openssl库:

      bash sudo apt-get install openssl

      1. 使用openssl enc -aes-256-cbc -a -in input.txt -out output.txt命令替换ECB模式的加密。这里的input.txt是你想要加密的明文文件,output.txt是你想要获取加密后的明文文件的路径。

      例如,如果你有一个名为input.txt的文件,其中包含明文内容,你可以使用以下命令替换ECB模式:

      bash openssl enc -aes-256-cbc -a -in input.txt -out output.txt

      如果你想要使用AES-CBC模式,你可以将aes-256-cbc替换为aes-128-cbc,如下所示:

      bash openssl enc -aes-128-cbc -a -in input.txt -out output.txt

      如果你想要使用AES-128-CBC模式,你可以将aes-128-cbc替换为aes-256-cbc,如下所示:

      bash openssl enc -aes-256-cbc -a -in input.txt -out output.txt

      请注意,替换模式时,aes-256-cbc通常会替换为aes-128-cbc,这是因为AES-256-CBC在默认情况下是AES-128-CBC的密钥长度增加16位。如果你想要使用AES-128-CBC模式,你需要提供密钥长度,例如-a 128。在实际应用中,密钥长度应该根据具体的加密需求和可用资源进行适当调整。

      此外,替换ECB模式的加密和解密通常需要在密码文件(passfile)中指定明文和密钥。例如,如果你在passfile文件中定义了以下密码对:

      bash passfile /path/to/passfile

      并使用openssl enc -aes-256-cbc -a -in input.txt -out output.txt加密明文,你可以使用以下命令替换密钥:

      bash openssl enc -aes-256-cbc -a -in input.txt -out output.txt -K /path/to/key

      如果你想要解密明文,你可以使用以下命令替换密钥:

      bash openssl enc -aes-256-cbc -a -in output.txt -K /path/to/key

      在使用passfile时,你需要确保密钥和明文文件位于同一目录下,以便在指定密钥时可以找到它们。在不同的目录下使用相同密钥可能会导致加密或解密失败。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部