Как обеспечить значимый IV для режима ECB (Python) - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу создать ISO 9797 Algorithm3 MAC в Python 3.x в Ubuntu с помощью следующего кода. Я использовал библиотеку pyCryptoDome для предоставления MAC на основе DES3. Код используется из этого блога. Это выглядит нормально в алгоритме и рабочем процессе.

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?

1 Ответ

1 голос
/ 04 ноября 2019

ECB режим не использует IV. Поэтому я бы поспорил, что код либо неправильный, либо, возможно, учитывает, что вы можете захотеть изменить режим шифрования в будущем, и код был подготовлен для этого.

Но даже в этом случае статический IV только из нулей - не лучшая идея.

EDITED :

Существует версияnew() функция, которая не принимает IV в соответствии с PyCryptoDome .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...