>  기사  >  백엔드 개발  >  php7+에서 AES 암호화 및 암호 해독을 위해 mcrypt 대신 openssl을 사용하는 방법

php7+에서 AES 암호화 및 암호 해독을 위해 mcrypt 대신 openssl을 사용하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-05-28 09:12:102839검색

이 글에서는 php7+에서 AES 암호화 및 복호화를 위해 mcrypt 대신 openssl을 사용하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

php7+에서 AES 암호화 및 암호 해독을 위해 mcrypt 대신 openssl을 사용하는 방법

10년이 지났고 mcrypt는 php7+에서 단계적으로 폐지되기 시작했습니다. 공식 팁은 다음과 같습니다.

mcrypt_get_block_size — 获得加密算法的分组大小

Warning
This function has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.

는 php7에서 openssl 교체가 필요합니다. 여기서 주의해야 할 사항은 다음과 같습니다.
mcrypt의 암호화 키 길이에는 제한이 없습니다. 전달된 모든 길이는 암호화에 포함되지만 openssl_encrypt에는 포함됩니다. 키 길이는 16개를 초과하면 서명 결과가 변경되지 않습니다. 이는 대체 솔루션을 테스트할 때 실수하기 쉽습니다.

php7보다 적습니다. 버전 코드

class AES {
    public static function encrypt($input,$key) {
        $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $paddedData = static::pkcs5_pad($input, $blockSize);
        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
        $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $paddedData, MCRYPT_MODE_ECB, $iv);
        return bin2hex($encrypted);

    }
    private static function pkcs5_pad ($text, $blocksize) {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }
    public static function decrypt($sStr,$key) {
        $decrypted= mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128,
            $key,
            hex2bin($sStr),
            MCRYPT_MODE_ECB
            );
        $dec_s = strlen($decrypted);
        $padding = ord($decrypted[$dec_s-1]);
        $decrypted = substr($decrypted, 0, -$padding);
        return $decrypted;
    }
    /**
     *url 安全的base64编码 sunlonglong
     */
    function base64url_encode($data) {
        return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
    }
    /**
     *url 安全的base64解码 sunlonglong
     */
    function base64url_decode($data) {
        return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
    }
}

$key = 'g87y65ki6e8p93av8zjdrtfdrtgdwetd';
$encrypt = AES::encrypt('123abc',$key);
$decrypt = AES::decrypt($encrypt,$key);
var_dump($encrypt,$decrypt);

加密结果:
    da07f6363eb0024b4bdd264e5fd4a2f5

이하 php7 이상입니다. openssl 암호화 사용:

class AES {

    /**
     *
     * @param string $string 需要加密的字符串
     * @param string $key 密钥
     * @return string
     */
    public static function encrypt($string, $key)
    {

        // openssl_encrypt 加密不同Mcrypt,对秘钥长度要求,超出16加密结果不变
        $data = openssl_encrypt($string, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);

        $data = strtolower(bin2hex($data));

        return $data;
    }


    /**
     * @param string $string 需要解密的字符串
     * @param string $key 密钥
     * @return string
     */
    public static function decrypt($string, $key)
    {
        $decrypted = openssl_decrypt(hex2bin($string), 'AES-128-ECB', $key, OPENSSL_RAW_DATA);

        return $decrypted;
    }
}


$encrypt = AES::encrypt('123abc', 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
$decrypt = AES::decrypt($encrypt, 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
var_dump($encrypt,$decrypt);die;

加密结果:
8c927c42f93a83c5de763aa18e4e6c7d

키 길이는 32비트이지만 openssl_encrypt가 암호화되면 키 길이는 16비트에 불과하고 나중에 서명이 포함되지 않으며 mcrypt_encrypt가 전체 키 암호화에 참여하므로 암호화 결과가 일관되지 않습니다. 혼란을 야기합니다. key=g87y65ki6e8p93av8zjdrtfdrtgdwetd 및 key=g87y65ki6e8p93av의 결과는 일관됩니다.

권장 학습: php 비디오 튜토리얼

위 내용은 php7+에서 AES 암호화 및 암호 해독을 위해 mcrypt 대신 openssl을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제