AES CBC蒙特卡洛测试(MCT)解密实现异常问题排查求助
错误原因
你在适配解密代码时错误修改了CBC模式解密的IV参数,不符合CBC解密的链式逻辑,也不符合NIST MCT测试的规则。
加密代码中j≥1时的加密调用如下,第二个参数为CBC加密的IV,取上一轮输出的密文,符合规则:
ct = encrypt(key_array[0], ct_array[j - 1], pt_array[j])
但你写解密代码时,错误将该IV参数替换为了上一轮输出的明文pt_array[j - 1],导致解密链式计算完全错误。
修正后的解密代码
只需要修改循环内j≥1分支的decrypt调用的第二个参数即可,修正后的完整函数如下:
def monte_carlo_decrypt(key_len, initial_key, initial_iv, initial_ct): key_array = [] iv_array = [] pt_array = [] ct_array = [] key_array.append(bytes.fromhex(initial_key)) iv_array.append(bytes.fromhex(initial_iv)) ct_array.append(bytes.fromhex(initial_ct)) for j in range(0, 1000): if j == 0: pt = decrypt(key_array[0], iv_array[0], ct_array[j]) pt_array.append(pt) ct_array.append(iv_array[0]) else: # 仅修改这一行的IV参数为ct_array[j-1]即可 pt = decrypt(key_array[0], ct_array[j - 1], ct_array[j]) pt_array.append(pt) ct_array.append(pt_array[j - 1]) if key_len == 128: key_array.append(bytes(a ^ b for a, b in zip(key_array[0], pt_array[j]))) elif key_len == 256: key_array.append(bytes(a ^ b for a, b in zip(key_array[0], pt_array[j - 1] + pt_array[j]))) iv_array.append(pt_array[-1]) ct_array.clear() ct_array.append(pt_array[-2]) return key_array[-1], iv_array[-1], pt_array[-1], ct_array[-1] for k in range(0, 100): (next_key, next_iv, next_pt, next_ct) = monte_carlo_decrypt(key_len * 8, key.hex().upper(), iv.hex().upper(), given_ct.hex().upper()) key = next_key iv = next_iv given_ct = next_ct
修改后使用你给出的测试参数运行,输出的PT就会符合预期值。
内容的提问来源于stack exchange,提问作者factor2
相关产品推荐
相关产品推荐

