Python 3.x 如何为ECB模式(Python)提供有意义的IV

Python 3.x 如何为ECB模式(Python)提供有意义的IV,python-3.x,cryptography,Python 3.x,Cryptography,我想通过以下代码在Ubuntu上用Python3.x创建ISO 9797 Algorithm3 MAC。我使用pyCryptoDome库提供基于DES3的MAC。代码是从weblog中使用的。它在算法和工作流程上都很好 import sys from Crypto.Cipher import DES from Crypto.Cipher import DES3 from Crypto.Util.strxor import strxor import binascii def macIso97

我想通过以下代码在Ubuntu上用Python3.x创建ISO 9797 Algorithm3 MAC。我使用pyCryptoDome库提供基于DES3的MAC。代码是从weblog中使用的。它在算法和工作流程上都很好

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))
但是我犯了以下错误

类型错误:IV对于ECB模式没有意义

如何为IV准备合适的值

模式不使用IV。因此,我认为该代码要么是错误的,要么是考虑到您可能希望在将来更改密码模式,并且该代码已经准备好了


但即便如此,只有零的静态IV也不是最好的主意

已编辑


有一个版本的
new()
函数没有根据需要进行静脉注射。

谢谢您的回答。你有合适的例子吗?欧洲央行的例子还是合适的IV?“但即便如此,只有零的静态IV也不是最好的主意。”这取决于模式和情况。@Daniel没有!任何基于ISO 9797 Alg3从纯文本创建MAC的示例。请向问题的回答者提出其他请求。您已经严格化了您的功能。加密算法是在字节上定义的,而不是在十六进制上定义的。只有在人类需要解释字节时(即打印出来时),才应使用十六进制。但是函数本身不应该有任何十六进制/base64/之类的内容。