Python 3.x 如何为ECB模式(Python)提供有意义的IV
我想通过以下代码在Ubuntu上用Python3.x创建ISO 9797 Algorithm3 MAC。我使用pyCryptoDome库提供基于DES3的MAC。代码是从weblog中使用的。它在算法和工作流程上都很好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
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/之类的内容。