Python - Криптографическая функция Фейстеля (AUT64) - Проблемы математики / программирования при реализации - PullRequest
0 голосов
/ 03 января 2019

Не знаю, как добавить математические символы, поэтому вставьте изображение:

AUT64 Feistel function

На основании этого:

https://tches.iacr.org/index.php/TCHES/article/view/874/826 (стр. 52)

Мне удалось, я думаю, реализовать функцию сжатия (1)

Однако не понимаю, что означают 2,3 и 4.

Может кто-нибудь со знанием математики / программирования объяснить это? В идеале, как реализовать это в Python.

Вот мой фрагмент кода:

aut64.py

import ctypes


def hexTobinary(hexdigits):
    binarydigits = ""
    for hexdigit in hexdigits:
        binarydigits += bin(int(hexdigit, 16))[2:].zfill(4)
    return binarydigits


t_offset = [['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
            ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'],
            ['0', '2', '4', '6', '8', 'A', 'C', 'E', '3', '1', '7', '5', 'B', '9', 'F', 'D'],
            ['0', '3', '6', '5', 'C', 'F', 'A', '9', 'B', '8', 'D', 'E', '7', '4', '1', '2'],
            ['0', '4', '8', 'C', '3', '7', 'B', 'F', '6', '2', 'E', 'A', '5', '1', 'D', '9'],
            ['0', '5', 'A', 'F', '7', '2', 'D', '8', 'E', 'B', '4', '1', '9', 'C', '3', '6'],
            ['0', '6', 'C', 'A', 'B', 'D', '7', '1', '5', '3', '9', 'F', 'E', '8', '2', '4'],
            ['0', '7', 'E', '9', 'F', '8', '1', '6', 'D', 'A', '3', '4', '2', '5', 'C', 'B'],
            ['0', '8', '3', 'B', '6', 'E', '5', 'D', 'C', '4', 'F', '7', 'A', '2', '9', '1'],
            ['0', '9', '1', '8', '2', 'B', '3', 'A', '4', 'D', '5', 'C', '6', 'F', '7', 'E'],
            ['0', 'A', '7', 'D', 'E', '4', '9', '3', 'F', '5', '8', '2', '1', 'B', '6', 'C'],
            ['0', 'B', '5', 'E', 'A', '1', 'F', '4', '7', 'C', '2', '9', 'D', '6', '8', '3'],
            ['0', 'C', 'B', '7', '5', '9', 'E', '2', 'A', '6', '1', 'D', 'F', '3', '4', '8'],
            ['0', 'D', '9', '4', '1', 'C', '8', '5', '2', 'F', 'B', '6', '3', 'E', 'A', '7'],
            ['0', 'E', 'F', '1', 'D', '3', '2', 'C', '9', '7', '6', '8', '4', 'A', 'B', '5'],
            ['0', 'F', 'D', '2', '9', '6', '4', 'B', '1', 'E', 'C', '3', '8', '7', '5', 'A']]

tu = ['1', '0', '3', '2', '5', '4', '7', '6',
      '0', '1', '2', '3', '4', '5', '6', '7',
      '3', '2', '1', '0', '7', '6', '5', '4',
      '2', '3', '0', '1', '6', '7', '4', '5',
      '5', '4', '7', '6', '1', '0', '3', '2',
      '4', '5', '6', '7', '0', '1', '2', '3',
      '7', '6', '5', '4', '3', '2', '1', '0',
      '6', '7', '4', '5', '2', '3', '0', '1',
      '3', '2', '1', '0', '7', '6', '5', '4',
      '2', '3', '0', '1', '6', '7', '4', '5',
      '1', '0', '3', '2', '5', '4', '7', '6',
      '0', '1', '2', '3', '4', '5', '6', '7',
      '7', '6', '5', '4', '3', '2', '1', '0',
      '6', '7', '4', '5', '2', '3', '0', '1',
      '5', '4', '7', '6', '1', '0', '3', '2',
      '4', '5', '6', '7', '0', '1', '2', '3',
      '2', '3', '0', '1', '6', '7', '4', '5',
      '3', '2', '1', '0', '7', '6', '5', '4',
      '0', '1', '2', '3', '4', '5', '6', '7',
      '1', '0', '3', '2', '5', '4', '7', '6',
      '6', '7', '4', '5', '2', '3', '0', '1',
      '7', '6', '5', '4', '3', '2', '1', '0',
      '4', '5', '6', '7', '0', '1', '2', '3',
      '5', '4', '7', '6', '1', '0', '3', '2']

tl = ['4', '5', '6', '7', '0', '1', '2', '3',
      '5', '4', '7', '6', '1', '0', '3', '2',
      '6', '7', '4', '5', '2', '3', '0', '1',
      '7', '6', '5', '4', '3', '2', '1', '0',
      '0', '1', '2', '3', '4', '5', '6', '7',
      '1', '0', '3', '2', '5', '4', '7', '6',
      '2', '3', '0', '1', '6', '7', '4', '5',
      '3', '2', '1', '0', '7', '6', '5', '4',
      '5', '4', '7', '6', '1', '0', '3', '2',
      '4', '5', '6', '7', '0', '1', '2', '3',
      '7', '6', '5', '4', '3', '2', '1', '0',
      '6', '7', '4', '5', '2', '3', '0', '1',
      '1', '0', '3', '2', '5', '4', '7', '6',
      '0', '1', '2', '3', '4', '5', '6', '7',
      '3', '2', '1', '0', '7', '6', '5', '4',
      '2', '3', '0', '1', '6', '7', '4', '5',
      '6', '7', '4', '5', '2', '3', '0', '1',
      '7', '6', '5', '4', '3', '2', '1', '0',
      '4', '5', '6', '7', '0', '1', '2', '3',
      '5', '4', '7', '6', '1', '0', '3', '2',
      '2', '3', '0', '1', '6', '7', '4', '5',
      '3', '2', '1', '0', '7', '6', '5', '4',
      '0', '1', '2', '3', '4', '5', '6', '7',
      '1', '0', '3', '2', '5', '4', '7', '6']

w = 0xFFFFFF00
val = ctypes.c_uint32(~w).value

kg = [val]

kq = ['1', '2', '3', '0', '0', '0', '0', '0']

kt = ['1', '2', '3', '0', '0', '0', '0', '0',
      '0', '0', '0', '0', '0', '0', '0', '0']

AUT64_key = []
AUT64_key.extend(kg)
AUT64_key.extend(kq)
AUT64_key.extend(kt)


def apply_permutation_r(P_TABLE, PLAINTEXT):
    permutated_M = ""
    for index in P_TABLE:
        permutated_M += PLAINTEXT[int(index) - 1]
    return permutated_M


def apply_compression_g(o1, r_no, lk, uk):
    ln = int(o1[0:4], 2)
    un = int(o1[4:8], 2)
    gl = int(t_offset[int(lk)][int(ln)], 16)
    gu = int(t_offset[int(uk)][int(un)], 16)
    g = gl >> 4 | gu
    return g


def uk_round_key(i, r_no):
    uk = int(tu[(r_no * 8) + i])
    return uk


def lk_round_key(i, r_no):
    lk = int(tl[(r_no * 8) + i])
    return lk


def apply_fiestel_f(o1, r_no, i):
    uk = uk_round_key(i, r_no)
    lk = lk_round_key(i, r_no)
    o2 = apply_compression_g(o1, r_no, lk, uk)
    # o3 = apply_substitution_s(o2)
    # o4 = apply_permutation_bitwise(o3)
    # o5 = apply_permutation_substitution_s(o4)
    # return o5
    return o2


M = '01234567'
plaintext = hexTobinary(M)

enc = []

for r_no in range(8):
    o1 = apply_permutation_r(kq, plaintext)
    for i in range(8):
        enc.append(apply_fiestel_f(o1, r_no, i))

print enc

Любая помощь очень ценится. Я новичок, это выше может быть все неправильно :) 1025 *

Заранее спасибо!

...