Maison > développement back-end > PHP7 > le corps du texte

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

醉折花枝作酒筹
Libérer: 2023-02-17 22:50:01
avant
2822 Les gens l'ont consulté

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.
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal