如何用Python解密PHP openssl_encrypt AES-128-CTR模式加密的内容
跨语言AES-128-CTR解密实现方案
完全可以使用Python实现对应解密逻辑,无需重构原有PHP加密体系,以下是具体实现方案:
一、PHP加密逻辑梳理
你给出的PHP加密代码核心逻辑如下:
- 加密算法为AES-128-CTR模式,IV固定长度为16字节
- 调用
openssl_encrypt时第四个参数为0,输出的密文为Base64编码格式 - 最终加密结果格式为:
Base64编码密文::十六进制编码的原始IV - CTR模式本身不需要额外填充,解密时无需处理填充逻辑
二、Python解密代码实现
首先安装依赖加密库:
pip install pycryptodome
解密函数代码:
from Crypto.Cipher import AES import base64 def decrypt_php_aes128ctr(encrypted_str: str, enc_key: bytes) -> str: # 拆分Base64密文和十六进制编码的IV b64_cipher, hex_iv = encrypted_str.split("::") # 解码得到原始密文和IV ciphertext = base64.b64decode(b64_cipher) iv = bytes.fromhex(hex_iv) # 初始化CTR模式解密器,注意nonce必须设为空 cipher = AES.new(enc_key, AES.MODE_CTR, nonce=b'', initial_value=iv) # 解密后转UTF-8字符串返回 return cipher.decrypt(ciphertext).decode("utf-8")
三、常见踩坑说明
此前解密失败大概率是遇到了以下问题:
- 密钥长度不符:AES-128要求密钥必须为16字节长度,需保证Python端传入的
enc_key字节内容和PHP端的$enc_key完全一致,长度严格为16字节 - IV参数配置错误:PyCryptodome库的CTR模式初始化时,必须将
nonce设为空,IV作为initial_value参数传入,否则会出现解密结果乱码 - 密文未解码:PHP输出的密文是Base64编码格式,必须先解码为原始字节再解密,不能直接使用字符串解密
四、加密领域学习资源推荐
- 入门类:《图解密码技术》,零基础友好,通过大量实例讲解对称加密、非对称加密、哈希校验等核心密码学概念,适合快速建立知识体系
- 进阶类:《应用密码学:协议、算法与C源程序》,密码学领域经典参考书籍,覆盖各类加密算法实现逻辑、安全协议设计思路,适合想要深入研究加密技术的开发者
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

