【PHP】对称加密算法 AES-256-GCM 代码示例

2023-11-03 03:44

本文主要是介绍【PHP】对称加密算法 AES-256-GCM 代码示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

下面介绍在PHP代码中,如何对数据进行 AES-256-GCM 加密和解密。我们可以使用 openssl 和 sodium 扩展来实现加密,它们都支持 AES-256-GCM 算法,下面将给出两种扩展的代码示例。

环境

PHP 7.3

一、使用openssl扩展

<?phpfunction aes256gcm_encrypt(string $data, string $keygen, string $aad = ''): array
{$cipher = 'aes-256-gcm';$ivLen = openssl_cipher_iv_length($cipher);$iv = random_bytes($ivLen); // 12字节的iv$encrypt = openssl_encrypt($data, $cipher, $keygen, OPENSSL_RAW_DATA, $iv,$tag, $aad);return ['iv'          => base64_encode($iv),'tag'         => base64_encode($tag),'aad'         => base64_encode($aad),'cipher_text' => base64_encode($encrypt),];
}function aes256gcm_decrypt(array $secretData, string $keygen)
{$iv = base64_decode($secretData['iv']);$tag = base64_decode($secretData['tag']);$aad = base64_decode($secretData['aad']);$cipherText = base64_decode($secretData['cipher_text']);$cipher = 'aes-256-gcm';return openssl_decrypt($cipherText, $cipher, $keygen, OPENSSL_RAW_DATA, $iv, $tag, $aad);
}function main()
{// AES-256-GCM需要32字节的密钥$keygen = bin2hex(random_bytes(16));// 加密$data = 'Hello World!';$secretData = aes256gcm_encrypt($data, $keygen, 'foobar');// 解密$plainText = aes256gcm_decrypt($secretData, $keygen);echo "原文:$data\n";echo "密文数据:" . json_encode($secretData) . "\n";echo "解密后:$plainText\n";
}main();

二、使用 sodium 扩展

<?phpfunction aes256gcm_encrypt(string $data, string $keygen, string $aad = ''): array
{$iv = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);$encrypt = sodium_crypto_aead_aes256gcm_encrypt($data, $aad, $iv, $keygen); // 包含密文、tagreturn ['iv'          => sodium_bin2base64($iv, SODIUM_BASE64_VARIANT_ORIGINAL),'aad'         => sodium_bin2base64($aad, SODIUM_BASE64_VARIANT_ORIGINAL),'cipher_text' => sodium_bin2base64($encrypt, SODIUM_BASE64_VARIANT_ORIGINAL),];
}function aes256gcm_decrypt(array $secretData, string $keygen)
{$iv = sodium_base642bin($secretData['iv'], SODIUM_BASE64_VARIANT_ORIGINAL);$aad = sodium_base642bin($secretData['aad'], SODIUM_BASE64_VARIANT_ORIGINAL);$cipherText = sodium_base642bin($secretData['cipher_text'], SODIUM_BASE64_VARIANT_ORIGINAL);return sodium_crypto_aead_aes256gcm_decrypt($cipherText, $aad, $iv, $keygen);
}function main()
{if (!sodium_crypto_aead_aes256gcm_is_available()) {exit('Not support AES-256-GCM');}// 生成AES-256-GCM的密钥$keygen = sodium_crypto_aead_aes256gcm_keygen();// 加密$data = 'Hello World!';$secretData = aes256gcm_encrypt($data, $keygen, 'foobar');// 解密$plainText = aes256gcm_decrypt($secretData, $keygen);echo "原文:$data\n";echo "密文数据:" . json_encode($secretData) . "\n";echo "解密后:$plainText\n";
}main();

AAD参数(Additional Authenticated Data)

在上面的代码示例中,可以看到在加密的时候有一个$aad参数,如果在加密的时候使用了这个参数,那么在解密时也需要使用同样的AAD值才能成功解密。

什么时候会需要用到AAD呢?下面举个例子:
用户Alice在CSDN博客上写了一篇私密文章,CSDN使用 AES-256-GCM 加密了这篇文章,然后存储到了数据库里,AAD的取值是Alice的用户ID。

后续如果Alice去查看这篇文章,CSDN会使用Alice的用户ID(AAD值)去解密,因为解密的AAD值与加密的AAD值相同,所以可以成功解密。

然后有一个黑客Bob,他也向CSDN发出解密这篇文章的请求,CSDN就会使用Bob的用户ID作为AAD去解密这篇文章,但因为AAD值错误,肯定是解密不了的,所以这时候AAD的作用就体现了出来。

参阅

  • https://cloud.google.com/kms/docs/additional-authenticated-data?hl=zh-cn

这篇关于【PHP】对称加密算法 AES-256-GCM 代码示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335353

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语