我想通过以下代码在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准备适当的值?