Advertisement
_eremec_

Untitled

Dec 17th, 2017
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.86 KB | None | 0 0
  1. def add_sybs(coll):
  2.     """Если число символов в строке нечетно, добавляет пробел в конец"""
  3.     return coll if len(coll) % 2 == 0 else coll + " "
  4.  
  5. def partition(coll, n):
  6.     """Разбивает переданную коллекцию на части по n элементов"""
  7.     p = []
  8.     for i in range(0, len(coll), n):
  9.         p.append(coll[i:i+n])
  10.     return p
  11.  
  12. def char2bin(letter):
  13.     """Переводит символ в бинарную последовательность"""
  14.     return bin(ord(letter))
  15.  
  16. def bin2char(binary):
  17.     """Переводит бинарную последовательность в символ"""
  18.     return chr(int(binary,2))
  19.  
  20. def bitshiftrigth(binary, n):
  21.     """Побитовый кольцевой сдвиг вправо"""
  22.     b = binary
  23.     for _ in range(n):
  24.         b = b[:1] + b[:-1]
  25.     return b
  26.  
  27. def handle_binary(b, n):
  28.     """Дополняет бинарную последовательность
  29.    незначащими нулями до длины n"""
  30.     return ([0 for _ in range(n - (len(b) - 2))]
  31.            + [int(el) for el in b[2:]])
  32.  
  33. def xor(b1, b2):
  34.     """Побитовый ксор"""
  35.     return [0 if r1 == r2 else 1 for r1, r2 in zip(b1, b2)]
  36.  
  37. def make_block(pair, n):
  38.     """Составляет блок для шифрования из пары символов"""
  39.     return [handle_binary(char2bin(pair[0]), n),
  40.             handle_binary(char2bin(pair[1]), n)]
  41.  
  42. def make_blocks(text, n):
  43.     """Разбивает текст на блоки"""
  44.     pairs = partition(add_sybs(text), 2)
  45.     return [make_block(pair, n) for pair in pairs]
  46.  
  47. def encode_block(block, key, n):
  48.     """Функция шифрования блока"""
  49.     l = block[0]
  50.     r = block[1]
  51.     return [xor(r, bitshiftleft(l, key)), l]
  52.  
  53. def encode_blocks(blocks, key, n):
  54.     """Шифрует последовательность блоков"""
  55.     return [encode_block(block, key, n) for block in blocks]
  56.  
  57. def list2str(arr):
  58.     """Переводит массив в строку"""
  59.     return ''.join([str(el) for el in arr])
  60.  
  61. def block2str(block):
  62.     """Конвертирует блок в строку"""
  63.     return (bin2char(list2str(block[0])) +
  64.            bin2char(list2str(block[1])))
  65.  
  66. def blocks2str(blocks):
  67.     """Конвертирует последоавтельность блоков в строку"""
  68.     return ''.join([block2str(block) for block in blocks])
  69.  
  70. def last_round(block, key, n):
  71.     """Шифрование последнего раунда"""
  72.     l = block[0]
  73.     r = block[1]
  74.     return [l, xor(r, bitshiftleft(l, key))]
  75.    
  76. def my_encode(text, n, key, k):
  77.     """Шифрование методом сети Файстеля"""
  78.     blocks = make_blocks(text, n)
  79.     print(blocks[0])
  80.     for _ in range(k-1):
  81.         print("Раунд: ", _)
  82.         blocks = encode_blocks(blocks, key, n)
  83.         print(blocks[0])
  84.     l = [last_round(block, key, n) for block in blocks]
  85.     print("Последний раунд:")
  86.     print(l[0])
  87.     return l
  88.  
  89. def last_swap(block):
  90.     """Меняет местами левую и правую часть блока"""
  91.     return [block[1], block[0]]
  92.  
  93. def my_decode(blocks, key, n, k):
  94.     """Дешифрование методом сети Файстеля"""
  95.     print("Исходные данные")
  96.     print(blocks[0])
  97.     for _ in range(k):
  98.         print("Раунд: ", _)
  99.         print(blocks[0])
  100.         blocks = encode_blocks(blocks, key, n)
  101.     print("Последний раунд")
  102.     print(blocks[0])
  103.     return [last_swap(block) for block in blocks]
  104.  
  105. key = len("Олег")
  106. text = "Если хочешь быть красивым, поступи в гусары"
  107. encoded_text = my_encode(text, 16, key, 16)
  108. text_str = blocks2str(encoded_text)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement