python-3.x - 如何为 ECB 模式提供有意义的 IV(Python)
问题描述
我想通过以下代码在 Ubuntu 的 Python 3.x 中创建 ISO 9797 Algorithm3 MAC。我使用 pyCryptoDome 库来提供基于 DES3 的 MAC。代码来自这个博客。它在算法和工作流程中都很好。
import sys
from Crypto.Cipher import DES
from Crypto.Cipher import DES3
from Crypto.Util.strxor import strxor
import binascii
def macIso9797_m2_alg3(key, msg):
return macIso9797_alg3(key, msg, "80")
def macIso9797_m1_alg3(key, msg):
return macIso9797_alg3(key, msg, "00")
def macIso9797_alg3(key, msg, pad_start):
key_len = int(len(key)/2)
if (key_len != 16):
raise ValueError("Key length should be 16 digits")
# force header padding
msg += pad_start
# padding with "00"
lenRestOfData = int((len(msg)/2) % 8)
msg += "00"*(8-lenRestOfData)
loopNum = int((len(msg)/2) / 8)
bufferOutput = binascii.unhexlify("00"*8)
IV = '\x00'*8
keya = binascii.unhexlify(key[0:16])
keyb = binascii.unhexlify(key[16:])
print ("\n")
i = 0
for i in range (0, loopNum):
tdesa = DES.new(keya, DES.MODE_ECB, IV)
data = msg[i*16:i*16+16]
print(str(i) + "=" + data)
x = bufferOutput
bufferOutput = strxor(binascii.unhexlify(data), bufferOutput)
print (data + " xor " + binascii.hexlify(x).decode('utf-8').upper() + " = " + binascii.hexlify(bufferOutput).decode('utf-8').upper())
bufferOutput = tdesa.encrypt(bufferOutput)
print (" encrypted val = " + binascii.hexlify(bufferOutput).decode('utf-8').upper())
print ("\n")
tdesb = DES.new(keyb, DES.MODE_ECB, IV)
bufferOutput = tdesb.decrypt(bufferOutput)
print (" decrypted val = " + binascii.hexlify(bufferOutput).decode('utf-8').upper())
tdesa = DES.new(keya, DES.MODE_ECB, IV)
bufferOutput = tdesa.encrypt(bufferOutput)
print (" encrypted val = " + binascii.hexlify(bufferOutput).decode('utf-8').upper())
return bufferOutput
macKey="EA1302AFBCCF791CB0065BFAD948B092"
message="test message"
print('MAC Key: ' + macKey)
print('MAC: ' + macIso9797_m1_alg3(macKey, message))
但我收到以下错误。
TypeError:IV 对 ECB 模式没有意义
如何为 IV 准备合适的值?
解决方案
ECB模式不使用 IV。因此,我认为代码要么是错误的,要么是考虑到您将来可能想要更改密码模式并且代码已经为此做好了准备。
但即便如此,只有零的静态 IV 并不是最好的主意。
编辑:
根据PyCryptoDomenew()
,有一个不采用 IV的函数版本。
推荐阅读
- ms-access - 为 Microsoft Access 进行电子邮件验证?
- python - 我如何在python中制作重复循环?
- python - Pandas 将 groupby 堆叠到 DataFrame MultiIndex 而不进行聚合
- r - 是否可以将向量索引 1 与列表元素 1 一起使用,索引 2 与元素 2 等一起使用?
- powerbi - Dax——除以来自两个不同事实的聚合
- sql - Postgres 无效的内存分配请求大小 1073741824
- email - 如何解决从网站发送的电子邮件中的可疑链接错误
- mysql - sql时间点到时间范围
- python - bs4:如何提取表“team-roster home”和“team-roster away”
- python - 从 python 的“文件”类继承并定义自定义行为 - python2 和 3