首页 > 解决方案 > 如何为 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 准备合适的值?

标签: python-3.xcryptography

解决方案


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

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

编辑

根据PyCryptoDomenew() ,有一个不采用 IV的函数版本。


推荐阅读