Advertisement
_eremec_

Untitled

Dec 15th, 2017
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.84 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 bitshiftleft(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.     for _ in range(k-1):
  80.         print(blocks[0])
  81.         blocks = encode_blocks(blocks, key, n)
  82.     print(blocks[0])
  83.     return [last_round(block, key, n) for block in blocks]
  84.  
  85. def last_swap(block):
  86.     """Меняет местами левую и правую часть блока"""
  87.     return [block[1], block[0]]
  88.  
  89. def my_decode(blocks, key, n, k):
  90.     """Дешифрование методом сети Файстеля"""
  91.     for _ in range(k):
  92.         blocks = encode_blocks(blocks, key, n)
  93.     return [last_swap(block) for block in blocks]
  94.  
  95. key = len("Александр")
  96. text = "Евклид был древнегреческим математиком"
  97. encoded_text = my_encode(text, 16, key, 16)
  98. text_str = blocks2str(encoded_text)
  99.  
  100. print(text_str)
  101. print(blocks2str(my_decode(encoded_text, key, 16, 16)))
  102.  
  103. #file = codecs.open("output.txt", "w", "utf-8")
  104.  
  105. #file.write(u'\ufeff')
  106. #file.write(text)
  107.  
  108. #file.write('\r\n')
  109. #file.write(blocks2str(my_decode(encoded_text, key, 2)))
  110. #file.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement