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

trezor-crypto AES-128-CTR加密与Python PyCryptodome结果不一致的问题排查

trezor-crypto AES-128-CTR加密与Python PyCryptodome结果不一致的问题排查

你遇到的这个问题我之前也帮人排查过,核心原因是trezor-crypto和PyCryptodome在AES-CTR模式下的两个关键参数处理不一致,下面给你一步步分析并解决:

问题1:Key长度不匹配

你在C代码里调用的是aes_encrypt_key128,这个函数只会使用传入Key的前16字节(128位),但你在Python代码里直接用了完整的32字节Key,相当于用256位Key进行加密,这和C的加密参数完全不一致,是结果不同的原因之一。

问题2:CTR计数器字节序差异

trezor-crypto的aes_ctr_cbuf_inc函数是把计数器缓冲区当作小端(little-endian)字节序来递增的,而PyCryptodome的Counter.new默认使用**大端(big-endian)**处理初始值和递增逻辑,这是导致结果不同的核心原因。

修正后的Python代码

把这两个问题修正后,就能得到和C++完全一致的加密结果了:

from Crypto.Util import Counter
from Crypto.Cipher import AES

iv = bytes.fromhex("cd26feb0cb51469d06b8134251da1d02")
# 截取前16字节作为128位Key,对应C++的aes_encrypt_key128逻辑
key = bytes.fromhex("130886bab757196acdd97243cad73d74571c462ed8c8791afbfce94ca6a37a1c")[:16]
plaintext = bytes.fromhex("48656c6c6f20576f726c6421") # = Hello World! in utf-8

# 显式指定小端字节序,完全匹配trezor-crypto的计数器递增逻辑
ctr = Counter.new(
    128,
    initial_value=int.from_bytes(iv, byteorder='little'),
    endian='little'
)
aes = AES.new(key, AES.MODE_CTR, counter=ctr)
encrypted = aes.encrypt(plaintext)
print(encrypted.hex())
# 输出结果:e61da4e002a75e857a3a2954,和C++代码的结果一致

验证说明

运行修正后的代码,输出的加密字符串就会和你C++代码里的e61da4e002a75e857a3a2954完全相同,这说明两个加密逻辑的参数终于对齐了~

备注:内容来源于stack exchange,提问作者DevilsJin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:43:08