PHP实现的简单AES加密解密算法实例

yizhihongxing

下面是对于“PHP实现的简单AES加密解密算法实例”的完整攻略,主要包括以下几个部分:

  1. 材料准备
  2. 算法实现
  3. 示例说明

1. 材料准备

在开始实现之前,需要确保已经安装好了 PHP 环境,并且可以使用 PHP 命令行工具进行脚本测试。

此外,我们还需要依赖一个 OpenSSL 扩展库,因此需要使用命令安装 OpenSSL 扩展库:

$ sudo apt-get install php-openssl

2. 算法实现

针对 AES 加密算法,我们可以使用 PHP 提供的 openssl_encryptopenssl_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技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 完美的2个php检测字符串是否是utf-8编码函数分享

    我来详细讲解下“完美的2个php检测字符串是否是utf-8编码函数分享”的完整攻略: 函数说明 这是一个有关于 UTF-8 编码判断的 PHP 函数,可用于判断一个字符串是否为 UTF-8 编码形式。此类编码判断函数的基本思路上,检查字符串的每个字符是否为 UTF-8 编码,并处理其对应的位数。 函数名:my_utf8_strlen 参数: string $…

    PHP 2023年5月26日
    00
  • 深入理解php底层之php生命周期

    深入理解PHP底层之PHP生命周期 PHP语言的生命周期是指PHP程序从脚本开始执行到脚本结束,期间经过的一系列阶段和过程。理解PHP生命周期对于深入了解PHP的工作原理和调优具有重要作用。本文将介绍PHP生命周期的各个阶段和相应的处理方式。 PHP生命周期的阶段 PHP生命周期可以分为以下几个阶段: 1. 解析阶段 PHP的解析阶段是将PHP代码翻译成低级…

    PHP 2023年5月23日
    00
  • scratch怎么制作点击香蕉图片出现香蕉英文小程序?

    制作点击香蕉图片出现香蕉英文小程序是一个非常简单的scratch游戏,只需要加入一些简单的代码块即可完成,以下是完整攻略。 第一步:准备素材 在制作游戏之前,我们需要准备好游戏所需要的素材,即一个点击香蕉的图片,以及一张香蕉图片。可以选择从互联网上下载免费的素材,或者自己使用图片编辑软件制作。 第二步:创建游戏 打开Scratch网站,点击Create按钮,…

    PHP 2023年5月23日
    00
  • php实现数组按拼音顺序排序的方法 原创

    以下是“php实现数组按拼音顺序排序的方法 原创”的完整攻略。 1. 问题描述 在php开发中,我们常常会遇到需要将数组按照拼音顺序排序的需求,例如需要对一批中文姓名进行按拼音排序,或者需要对某个分类下的一些中文词汇进行按拼音排序。那么,在php实现一个数组按拼音顺序排序应该怎样实现呢? 2. 实现方法 2.1 导入pinyin类库 首先,我们需要使用拼音处…

    PHP 2023年5月26日
    00
  • PHP中的闭包function() use() {}使用场景和技巧

    闭包(Closure)是PHP中的一种特殊的函数,它可以访问外部作用域中的变量,并且可以在函数调用结束后保持对这些变量的访问。在PHP中,我们可以使用闭包来实现一些高级的编程技巧和设计模式。下面是一些使用闭包的场景和技巧。 1. 使用闭包实现延迟绑定 在PHP中,如果在一个类的方法中使用$this关键字访问类的属性或方法,那么$this关键字会绑定到对象。但…

    PHP 2023年5月12日
    00
  • php面试实现反射注入的详细方法

    让我来详细讲解一下用PHP实现反射注入的方法。 什么是反射注入? 反射注入,又称为“依赖注入”,是将一个对象实例注入到另一个对象中,以便后者可以使用前者提供的服务。反射注入可以显著减少代码的耦合度,提高代码的可维护性和可扩展性。 如何使用反射注入? 使用反射注入,需要先创建一个反射类,通过反射类获取到需要注入的类的构造函数,然后通过构造函数创建一个新的实例。…

    PHP 2023年5月27日
    00
  • 小文件php+SQLite存储方案

    小文件PHP+SQLite存储方案是一种轻量、高效的数据存储方案,它利用PHP语言和SQLite数据库技术,可以快速地在Web应用程序中存储和管理小型文件(如图片、文本、音视频、JSON数据等)。 下面是一个完整的小文件PHP+SQLite存储方案攻略: 步骤一:搭建SQLite数据库和PHP环境 首先,我们需要在本地或Web服务器上搭建SQLite数据库和…

    PHP 2023年5月26日
    00
  • 配置php.ini实现PHP文件上传功能

    配置php.ini实现PHP文件上传功能需要注意以下步骤: 步骤一:修改php.ini文件 打开php.ini文件,找到 file_uploads 参数,确保该参数的值为 On file_uploads = On 找到 upload_max_filesize 参数,设置上传的文件最大值,例如设置为 5MB: upload_max_filesize = 5M …

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部