Maison  >  Article  >  développement back-end  >  Comment utiliser openssl au lieu de mcrypt pour le cryptage et le décryptage AES en php7+

Comment utiliser openssl au lieu de mcrypt pour le cryptage et le décryptage AES en php7+

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-05-28 09:12:102829parcourir

Cet article vous présentera comment utiliser openssl au lieu de mcrypt pour le cryptage et le décryptage AES en php7+. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment utiliser openssl au lieu de mcrypt pour le cryptage et le décryptage AES en php7+

Dix années se sont écoulées et mcrypt a commencé à être progressivement supprimé dans php7+. Le conseil officiel est :

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

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

Openssl doit être remplacé dans php7. Ce qu'il faut noter ici est :
Il n'y a aucune limite sur la longueur de la clé de cryptage dans mcrypt. sera inclus dans le cryptage, mais dans openssl_encrypt. La longueur de clé ne peut être que de 16 longueurs. Après >16 longueurs, le résultat de la signature reste inchangé. Il est facile de faire des erreurs lors du test des alternatives. Pour plus de détails, comparez directement les codes :

. inférieur au code de la version 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

Ce qui suit est pour php7 et supérieur. Utiliser le cryptage 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

Bien que la longueur de la clé soit de 32 bits, lorsque openssl_encrypt est crypté, la longueur de la clé n'est que de 16 bits, et aucune signature n'est incluse plus tard, tandis que mcrypt_encrypt participera au cryptage de la clé entière , de sorte que le chiffrement se produira. Les résultats sont incohérents. Semant la confusion, les résultats de key=g87y65ki6e8p93av8zjdrtfdrtgdwetd et key=g87y65ki6e8p93av sont cohérents

Apprentissage recommandé : Tutoriel vidéo php

 ;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer