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
相关产品推荐
相关产品推荐

