Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie openssl anstelle von mcrypt für die AES-Verschlüsselung und -Entschlüsselung in PHP7+

So verwenden Sie openssl anstelle von mcrypt für die AES-Verschlüsselung und -Entschlüsselung in PHP7+

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-05-28 09:12:102817Durchsuche

In diesem Artikel erfahren Sie, wie Sie openssl anstelle von mcrypt für die AES-Verschlüsselung und -Entschlüsselung in PHP7+ verwenden. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

So verwenden Sie openssl anstelle von mcrypt für die AES-Verschlüsselung und -Entschlüsselung in PHP7+

Zehn Jahre sind vergangen und mcrypt wird in PHP7+ schrittweise abgeschafft. Der offizielle Tipp lautet:

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

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

erfordert OpenSSL-Ersetzung in PHP7. Hier ist zu beachten:
Es gibt keine Begrenzung für die Länge des Verschlüsselungsschlüssels in mcrypt. Die Schlüssellänge kann nur 16 Längen betragen, das Signaturergebnis bleibt unverändert. Beim Testen alternativer Lösungen kann es leicht zu Fehlern kommen:

Weniger als bei php7 Versionscode

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

Unten Es ist PHP7 oder höher. Verwenden Sie die OpenSSL-Verschlüsselung:

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

Obwohl die Schlüssellänge 32 Bit beträgt, beträgt die Schlüssellänge bei der Verschlüsselung von OpenSSL_Encrypt nur 16 Bit und die Signatur wird später nicht einbezogen, während mcrypt_encrypt an der Verschlüsselung des gesamten Schlüssels beteiligt ist Die Verschlüsselungsergebnisse sind inkonsistent. Verursacht Verwirrung, die Ergebnisse von key=g87y65ki6e8p93av8zjdrtfdrtgdwetd und key=g87y65ki6e8p93av sind konsistent;

Empfohlenes Lernen: php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo verwenden Sie openssl anstelle von mcrypt für die AES-Verschlüsselung und -Entschlüsselung in PHP7+. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen