PHP 中 AES
加密和解密的原理主要基于对称加密算法。对称加密算法使用相同的密钥进行加密和解密操作,常见的对称加密算法包括 AES
、DES
、3DES
等。
AES 加密解密原理
在 PHP 中,你可以使用 OpenSSL
扩展来实现 AES
加密和解密。AES
加密算法采用分组密码的方式,将明文分成固定长度的数据块,然后对每个数据块使用相同的密钥进行加密。解密时使用相同的密钥对密文进行解密,还原出原始的明文。
具体的加密和解密过程如下:
加密过程
- 选择一个合适的密钥,长度可以是 128 位、192 位或 256 位。
- 选择一个合适的初始化向量(
IV
),长度为 16 字节(128 位)。 - 将明文分成固定长度的数据块,每个数据块的长度与密钥长度相同(128 位)。
- 使用密钥对每个数据块进行加密,生成相应的密文。
- 可以选择使用
padding
方式对明文进行补齐,以确保明文的长度符合要求。常见的padding
方式有PKCS7
、PKCS5
等。 - 将加密后的数据块和初始化向量进行合并,生成最终的密文。
解密过程:
- 获取加密过程中使用的密钥和初始化向量。
- 将密文分成固定长度的数据块,每个数据块的长度与密钥长度相同(128 位)。
- 使用相同的密钥对每个数据块进行解密,还原出相应的明文。
- 可以选择使用相同的
padding
方式对解密后的数据进行处理,以确保还原的明文符合要求。 - 将解密后的数据块和初始化向量进行合并,生成最终的明文。
需要注意的是,在实际应用中,为了确保数据的安全性,通常会在传输过程中对数据进行加密,并在接收端进行解密。同时,为了防止重复攻击和篡改攻击,还需要对数据进行校验和签名等操作。
示例
1. 创建合适的密钥
对于这个,我们可以生成一个随机字符串,长度为 32 字节就行(也就是 256 位),下面是一个例子:
function randomStr($length = 32)
{
// 随机数种子
mt_srand(microtime(true) * 1000000);
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++)