You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现AES-256-CTR加密无法被PHP解密,如何修改Python代码适配

故障原因
  • AES-CTR模式要求加密、解密两侧的计数器递增逻辑完全一致,Python侧手动构造的Counter对象计数规则和PHP openssl内置的AES-256-CTR计数规则不匹配是解密失败的核心原因。
  • PHP的openssl_decrypt使用AES-256-CTR时,会直接把传入的IV作为初始计数器值,按大端字节序逐块递增1,手动转IV为整数再创建Counter的操作存在字节序对齐隐患,属于冗余操作。
修复后的Python加密代码

不需要手动构造Counter实例,直接使用PyCryptodome库AES对象内置的CTR模式IV参数即可,修改后代码如下:

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64

def encrypt_data(data: bytes):
    # 生成32字节密钥对应aes-256要求
    encryption_key = get_random_bytes(32)
    # 生成16字节IV和AES块大小匹配
    iv = get_random_bytes(AES.block_size)
    # 直接传入iv参数,库会自动适配符合标准的CTR计数器逻辑
    cipher = AES.new(encryption_key, AES.MODE_CTR, iv=iv)
    encrypted = cipher.encrypt(data)
    # 返回值顺序和PHP接收参数对应
    return base64.b64encode(iv), base64.b64encode(encryption_key), base64.b64encode(encrypted)

# 测试示例
if __name__ == "__main__":
    iv, key, encrypted_text = encrypt_data(b"qwerty")
    print("iv:", iv.decode())
    print("key:", key.decode())
    print("encrypted_text:", encrypted_text.decode())
验证说明

将输出的三个值对应传入PHP代码的$data['iv']、$data['key']、$data['text'],即可正常解密得到原始字符串qwerty。
如果仍有问题,可检查两侧密钥长度是否为32字节,和aes-256-ctr的要求对齐。


内容的提问来源于stack exchange,提问作者Oleksii Piddubnyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:45:07