Реализация алгоритма CMAC на Python не работает

Мне нужно реализовать алгоритм CMAC для моей диссертации, однако я получаю неправильный результат и просто не могу распознать ошибку.

Генерация подключей K1 и алгоритм шифрования AES, а также XOR и состав m_i верны, я дважды это проверил.

Кто-нибудь может мне помочь?

есть только один блок размером 128 бит (16 октетов), поэтому 'flag' истинен и 'n' = 1

Шаги, которые я пытаюсь воспроизвести:

   +                                                                   +
   +   Step 4.  if flag is true                                        +
   +            then M_last := M_n XOR K1;                             +
   +            else M_last := padding(M_n) XOR K2;                    +
   +   Step 5.  X := const_Zero;                                       +
   +   Step 6.  for i := 1 to n-1 do                                   +
   +                begin                                              +
   +                  Y := X XOR M_i;                                  +
   +                  X := AES-128(K,Y);                               +
   +                end                                                +
   +            Y := M_last XOR X;                                     +
   +            T := AES-128(K,Y);                                     +
   +   Step 7.  return T;                                              +

и моя реализация такова:

def generate_cmac(master_key, message_counter, meter_id, key1):

    padding = [0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7]

    m_i = AES_Decryption.hexadecimal_to_binary([0, 0])
    m_i.extend(message_counter)
    m_i.extend(meter_id)
    m_i.extend(AES_Decryption.hexadecimal_to_binary(padding))

    print(AES_Decryption.binary_to_hexadecimal(m_i))

    m_last = AES_Decryption.xor(m_i, key1, 'bytewise')

    init_vector = AES_Decryption.hexadecimal_to_binary(
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

    variable_x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    variable_y = AES_Decryption.xor(m_last, variable_x, 'bytewise')

    k_enc = AES_Decryption.aes_encryption(variable_y, master_key, init_vector)

    print(AES_Decryption.binary_to_hexadecimal(k_enc))

0 ответов

Другие вопросы по тегам