为了验证我对 AES-GCM 和 AES-CTR 模式的理解,我使用 python Crpyto.Cipher 库创建了一个简单的示例。我期望从两种模式都使用 CTR 方法生成相同的密文。
由于我的目的只是比较来自加密引擎的加密结果,因此,我将 GCM 和 CTR 的消息设置为全 0(十六进制格式)。任何与 0 的异或都将保留为原始密文。
在 AES-CTR 方面,我将 nonce 设置为“00”。这意味着不会使用随机数,并且默认情况下计数器编号将从值 0 开始。
在 AES-GCM 方面,我将随机数 (IV) 设置为 16 字节“00”。我假设这相当于计数器的 0 起始值。
看看下面的 AES-GCM 框图,我应该从 AES-GCM 得到的第一个密文应该只是计数器值 1 的加密结果。
但是,我无法从 AES-CTR 和 AES-GCM 获得相同的加密结果。请赐教我是哪个部分出错了?最后,我对两种加密模式使用相同的 256-AES 密钥。
这是代码:
key = bytes.fromhex('0123456789ABCDEF11113333555577770123456789ABCDEF1111333355557777')
msg = bytes.fromhex('00000000000000000000000000000000')
msg1 = bytes.fromhex('00000000000000000000000000000001')
###### AES-256 ECB Mode ######
aes1 = AES.new(key,AES.MODE_ECB)
print("AES-ECB Result, Counter 1: "+str(binascii.hexlify(aes1.encrypt(msg1)))+"\n")
###### AES-256 CTR Mode ######
aes1 = AES.new(key,AES.MODE_CTR,nonce=bytes.fromhex('00'))
print("AES-CTR …Run Code Online (Sandbox Code Playgroud)