下面是对于“PHP实现的简单AES加密解密算法实例”的完整攻略,主要包括以下几个部分:
- 材料准备
- 算法实现
- 示例说明
1. 材料准备
在开始实现之前,需要确保已经安装好了 PHP 环境,并且可以使用 PHP 命令行工具进行脚本测试。
此外,我们还需要依赖一个 OpenSSL 扩展库,因此需要使用命令安装 OpenSSL 扩展库:
$ sudo apt-get install php-openssl
2. 算法实现
针对 AES 加密算法,我们可以使用 PHP 提供的 openssl_encrypt
和 openssl_decrypt
函数分别实现加密和解密的操作。
具体的使用方式如下:
$encrypted = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
$decrypted = openssl_decrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
其中,$data
为待加密或解密的数据,$key
为加密解密使用的密钥,$iv
则为初始化向量,这三个参数都是二进制字符串的形式。
值得注意的是,受限于 PHP 语言本身的限制,在使用 AES-128 加密算法时,密钥长度必须为 16 个字节。
在实际应用中,为了防止密钥泄露,在存储密钥时一般采用 Hash 函数生成固定长度的密钥值,而后将其用作实际的密钥值。
此外,在使用 AES 加密算法时,一般会采用 CBC 模式,同时会提供一个初始化向量参数,目的是防止明文相同的情况下,加密后产生相同的密文,从而增加加密的安全性。
3. 示例说明
以下是两个简单的示例,用于说明如何使用 PHP 实现 AES 加密解密算法。
示例 1:字符串加解密
function aesEncrypt($data, $key) {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-128-cbc'));
$encrypted = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($iv . $encrypted);
}
function aesDecrypt($data, $key) {
$data = base64_decode($data);
$iv = substr($data, 0, openssl_cipher_iv_length('aes-128-cbc'));
$encrypted = substr($data, openssl_cipher_iv_length('aes-128-cbc'));
return openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
}
// 测试
$data = 'Hello, world!';
$key = 'My secret key';
$encrypted = aesEncrypt($data, $key);
$decrypted = aesDecrypt($encrypted, $key);
echo "PlainText: $data\n";
echo "Encrypted: $encrypted\n";
echo "Decrypted: $decrypted\n";
示例 2:文件加解密
function fileEncrypt($sourceFile, $destFile, $key) {
// 读取源文件内容
$data = file_get_contents($sourceFile);
// 加密数据
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-128-cbc'));
$encrypted = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
$encrypted = $iv . $encrypted;
// 写入目标文件
file_put_contents($destFile, $encrypted);
}
function fileDecrypt($sourceFile, $destFile, $key) {
// 读取密文内容
$raw = file_get_contents($sourceFile);
// 解密数据
$iv = substr($raw, 0, openssl_cipher_iv_length('aes-128-cbc'));
$data = substr($raw, openssl_cipher_iv_length('aes-128-cbc'));
$decrypted = openssl_decrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
// 写入目标文件
file_put_contents($destFile, $decrypted);
}
// 测试
$sourceFile = 'test.txt';
$encryptedFile = 'test.enc';
$decryptedFile = 'test.dec';
$key = 'My secret key';
// 创建测试原文件
file_put_contents($sourceFile, 'Hello, world!');
// 加密文件
fileEncrypt($sourceFile, $encryptedFile, $key);
// 解密文件
fileDecrypt($encryptedFile, $decryptedFile, $key);
// 测试结果
echo "PlainText: " . file_get_contents($sourceFile) . "\n";
echo "Encrypted: " . base64_encode(file_get_contents($encryptedFile)) . "\n";
echo "Decrypted: " . file_get_contents($decryptedFile) . "\n";
以上例子分别演示了字符串和文件加解密的用法,供大家参考。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现的简单AES加密解密算法实例 - Python技术站