本文正在参加「金石计划 . 瓜分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万现金大奖」