在PHP中,AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,用于保护数据的安全性。AES加密算法基于块密码,通常使用128位(16字节)的块大小,并支持128、192和256位的密钥长度。在这个实例中,我们看到的是使用MCrypt库实现的AES-128-CBC模式的加密和解密过程。
定义了一个名为`MCrypt`的类,这个类包含了加密和解密函数。在类中,有一个16字节的十六进制初始化向量(IV),在AES-CBC模式下,它是必须的,因为每个数据块都依赖于前一个块的输出。初始化向量在这里被硬编码为`$hex_iv`。同时,还有一个密钥`$key`,它在构造函数中被转换为SHA256哈希值,以确保其长度至少为32字节,即使原始密钥可能是更短的字符串。
`encrypt`方法是用于加密数据的,它首先打开一个Rijndael-128(即AES)模块,并设置加密模式为CBC。然后,使用`mcrypt_module_open`、`mcrypt_generic_init`进行初始化。在填充数据之前,会检查数据长度是否为16字节的倍数,如果不是,使用PKCS7填充方式添加额外的字节。接着,调用`mcrypt_generic`执行加密操作,并将结果编码为Base64,以便在网络传输中使用。
`decrypt`方法负责解密已加密的数据。它同样打开Rijndael-128模块,但这次是用于解密。解密后,会使用`strippadding`函数移除PKCS7填充,恢复原始数据。
`addpadding`和`strippadding`是PKCS7填充的实现。PKCS7是一种确保数据块长度对齐的填充方式,它在数据末尾添加与所需填充数相同的字节,值等于需要填充的字节数。`addpadding`函数将字符串填充到16字节的倍数,而`strippadding`函数则在解密后移除这些填充字节。
在实际应用中,密钥和初始化向量应作为参数传递,而不是硬编码在代码中,以增加安全性。此外,由于MCrypt库在PHP 7.2版本后已被弃用,建议使用更现代的加密库如OpenSSL或 Sodium扩展来实现AES加密。这些库提供了更好的安全特性,如随机生成的IV,并且与最新的加密标准保持一致。尽管如此,理解这个实例有助于了解AES加密的基本工作原理和流程。