AES-128-CBC-Pkcs7Padding加密PHP实例

2022-12-07 14:44:10 浏览数 (1)

本文正在参加「金石计划 . 瓜分6万现金大奖」

本文环境 PHP8.1,Mysql5.7 不懂的可以评论或联系我邮箱:owen@owenzhang.com 著作权归OwenZhang所有。商业转载请联系OwenZhang获得授权,非商业转载请注明出处。

大概

AES-128-CBC-Pkcs7Padding加密PHP实例:

编码base64,模式cbc,填充Pkcs7Padding,位数128位,

输入格式base64,输出格式string,字符集utf-8,

密钥T3lUf3t4ddHzSx8U,偏移量cdccB3uiWDu7mcxw

(例如17350886066加密后 eupvMFtSc0E7veMi XCgQ==)

(https://www.mklab.cn/utils/aes)

(https://www.lddgo.net/encrypt/aes)

AES介绍

1.AES简介:

AES即高级加密标准(Advanced Encryption Standard),是美国NIST在2001年发布的,旨在代替DES称为广泛使用的标准。AES是一种对称分组密码算法。

2.AES的分组长度和密钥长度:

AES的明文分组长度为128位(16字节),密钥长度可以为128位(16字节)、192位(24字节)、256位(32字节),根据密钥长度的不同,AES分为AES-128、AES-192、AES-256三种。

AES-PHP服务代码

代码块介绍

openssl_encrypt(data, method, password, options,

  • 参数说明:
  • $data 加密明文
  • $method 加密方法: DES-ECB

DES-CBC

DES-CTR

DES-OFB

DES-CFB

  • $passwd 加密密钥[密码]
  • $options 数据格式选项(可选)【选项有:】 0

OPENSSL_RAW_DATA=1

OPENSSL_ZERO_PADDING=2

OPENSSL_NO_PADDING=3

  • $iv 密初始化向量(可选)

如果method为DES-ECB,则iv无需填写

具体代码

代码语言:javascript复制
<?php

namespace appservice;

class AesService
{
    public static ?AesService $_instance = null;
    /*密钥,22个字符*/
    protected string $key = 'T3lUf3t4ddHzSx8U';
    /*向量,8个或10个字符*/
    protected string $iv = 'cdccB3uiWDu7mcxw';

    /**
     * @return AesService|mixed
     */
    public static function instance(): ?AesService
    {
        if (!static::$_instance) static::$_instance = new self();
        return static::$_instance;
    }

    public function setkey(string $key): static
    {
        $this->key = $key;
        return $this;
    }

    public function getkey(): string
    {
        return $this->key;
    }

    public function getiv(): string
    {
        return $this->iv;
    }

    /**
     * 加密
     * AES/CBC/PKCS7Padding
     * AES加密:(https://www.mklab.cn/utils/aes)
     * 编码base64,模式CBC,填充Pkcs7Padding,位数128位,输入格式base64,输出格式string,
     * 字符集utf-8,密钥T3lUf3t4ddHzSx8U,偏移量cdccB3uiWDu7mcxw
     * (例如17350886066加密后 eupvMFtSc0E7veMi XCgQ==)
     * (https://www.lddgo.net/encrypt/aes)
     *
     * @param boolean $status 是否加密
     *
     * @return string 处理过的数据
     */
    public function encrypt($data, bool $status = true): string
    {
        if (is_array($data)) $data = json_encode($data);
        $key = $this->getkey();
        $iv  = $this->getiv();
        if ($status) return base64_encode(openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv));
        return $data;
    }

    /**
     * 解密
     *
     * @return string 加密的字符串不是完整的会返回空字符串值
     */
    public function decrypt($data, bool $status = true): string
    {
        $key = $this->getkey();
        $iv  = $this->getiv();
        if ($status) return openssl_decrypt(base64_decode($data), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
        return $data;
    }

}

AES-调用代码

AES加密

const API_AES_KEY = 'T3lUf3t4ddHzSx8U'; $mobileAesEncrypt = AesService::instance()->setkey(API_AES_KEY)->encrypt('17350886066');

AES解密

const API_AES_KEY = 'T3lUf3t4ddHzSx8U'; $mobileAesDecrypt = AesService::instance()->setkey(API_AES_KEY)->decrypt(' eupvMFtSc0E7veMi XCgQ==');

本文正在参加「金石计划 . 瓜分6万现金大奖」

0 人点赞