php 调用python解密 AES-128-GCM

因工作需要,要解密Java AES-128-GCM iv=16 模式的加密密文,找了php的很多方法,都无法解密成功,最后找了一个使用python3进行解密的方法,下面是解密方法:

主要是运用php的函数exec()执行Linux命令调用python运行python文件,获得返回结果。

php 复制代码
// Java加密的密文
$encryptedDataB64 = file_get_contents("php://input");

// 有执行权限的Python文件路径
$pyfile = "/root/gcm.py";
 
// 执行Python文件
$result = exec("python3 {$pyfile} {$encryptedDataB64} 2>&1");
 
// 输出执行结果
echo $result;

注:此AES解密要用到python 3的 库 Cryptodome,所以,如果你服务器没有这个库 Cryptodome,要安装一下:

bash 复制代码
pip3 install pycryptodome

gcm.py文件内容:

python 复制代码
import base64
import sys

# print(sys.path)

# 在导入一个模块(Cryptodome)时,Python会在sys.path列表中的路径中查找该模块。
# 因此,如果模块在sys.path中不存在,Python就无法找到该模块,可以通过下面的代码来添加路径。如果存在,下面这行可以不运行。
# sys.path.append(r'/usr/local/lib/python3/dist-packages')

# 导入AES
from Cryptodome.Cipher import AES

# php执行exec()函数传来的密文参数
encryptedDataB64 = sys.argv[1]

encryptedData = base64.b64decode(encryptedDataB64)
nonce = encryptedData[:16] # 这行的16,是因为Java那边加密时iv设置的是16,所以要改成16
ciphertext = encryptedData[16:-16] # 这行前面的一个16也是同上
tag = encryptedData[-16:]

# 秘钥,下面key里面单引号部分的才是秘钥
key = b'uMV7abuWIqz7aoz8mxZhw41rtrcY6unL'
try:
    cipher = AES.new(key, AES.MODE_GCM, nonce)
    decryptedData = cipher.decrypt_and_verify(ciphertext, tag)
    print(decryptedData) # use authenticated data
except ValueError:
    print('Decryption failed')

最后,AES加解密分多种模式,大家在进行AES加解密时要先了解清楚具体的模式才能更好的解决问题。

相关推荐
Luca_kill7 分钟前
MCP数据采集革命:从传统爬虫到智能代理的技术进化
爬虫·python·ai·数据采集·mcp·webscraping·集蜂云
zhangchaoxies12 分钟前
CSS如何实现响应式弹性网格布局_配合media query修改flex-wrap属性
jvm·数据库·python
寒秋花开曾相惜13 分钟前
(学习笔记)第四章 处理器体系结构
linux·网络·数据结构·笔记·学习
疏星浅月25 分钟前
虚拟内存三大核心作用详解
linux·c语言·arm开发·嵌入式硬件
故事和你9139 分钟前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
ZC跨境爬虫1 小时前
Scrapy分布式爬虫(单机模拟多节点):豆瓣Top250项目设置与数据流全解析
分布式·爬虫·python·scrapy
sg_knight1 小时前
设计模式实战:命令模式(Command)
python·设计模式·命令模式
石榴树下的七彩鱼1 小时前
图片修复 API 接入实战:网站如何自动去除图片水印(Python / PHP / C# 示例)
图像处理·后端·python·c#·php·api·图片去水印
Polar__Star1 小时前
C#怎么操作Chart图表控件 C#如何用WinForms Chart控件绑定数据绘制统计图表【控件】
jvm·数据库·python
2401_897190551 小时前
CSS如何制作数字滚动效果_利用transform位移数字
jvm·数据库·python