ホームページ  >  記事  >  バックエンド開発  >  php7+ で AES 暗号化と復号化に mcrypt の代わりに openssl を使用する方法

php7+ で AES 暗号化と復号化に mcrypt の代わりに openssl を使用する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-05-28 09:12:102763ブラウズ

この記事では、php7 で AES 暗号化と復号化に mcrypt の代わりに openssl を使用する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

php7+ で AES 暗号化と復号化に mcrypt の代わりに openssl を使用する方法

10 年が経過し、php7 では mcrypt が段階的に廃止され始めました。公式のヒント:

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 までしか指定できません。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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。