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

我想通过以下代码在Ubuntu 3的Python 3.x中创建ISO 9797 Algorithm3 MAC。我使用pyCryptoDome库提供基于DES3的MAC。该代码是从this网络日志中使用的。在算法和工作流程上都可以接缝。

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,"00")

def macIso9797_alg3(key,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,IV)
    bufferOutput = tdesb.decrypt(bufferOutput)

    print (" decrypted val = " + binascii.hexlify(bufferOutput).decode('utf-8').upper())

    tdesa = DES.new(keya,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准备适当的值?

firefox_2009 回答:如何为ECB模式提供有意义的IV(Python)

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

但是,即使如此,只有零的静态IV并不是最好的主意。

已编辑

存在new()函数的一个版本,该版本没有根据PyCryptoDome获得IV。

本文链接:https://www.f2er.com/3167918.html

大家都在问