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

