Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.87 KB | None | 0 0
  1. Шифр Поворотная решётка:
  2. import random
  3. def normalize(st):
  4. '''Нормализует строку'''
  5. abc='абвгдеёжзийклмнопрстуфхцчшщъыьэюя,.*-?!'
  6. st = st.lower()
  7. res = ''
  8. for i in st:
  9. if i in abc:
  10. res+=i
  11. return res
  12. def create_grille(x,y):
  13. '''Создаёт поворотную решетку (с заданием координат)'''
  14. mas = []
  15. for i in range(y):
  16. mas.append([0 for j in range(x)])
  17. mas2 = []
  18. for i in range(y):
  19. mas2.append([0 for j in range(x)])
  20. i=0
  21. while i < x*y//4:
  22. a,b = map(int,input("Введите координату окошка: ").split(' '))
  23. if a<=y and b<=x and mas[a][b]!=1 and mas2[a][b]!=1:
  24. mas[a][b]=1
  25. mas2[a][b]=1
  26. mas2[y-a-1][b]=1
  27. mas2[a][x-1-b]=1
  28. mas2[y-a-1][x-b-1]=1
  29. i+=1
  30. else:
  31. print("Значение введено неправильно.")
  32. print("Полученная решетка: ")
  33. for i in range(y):
  34. print(mas[i])
  35. return mas
  36. def auto_grille(x,y):
  37. '''Создаёт поворотную решетку (автоматически)'''
  38. mas = []
  39. for i in range(y):
  40. mas.append([0 for j in range(x)])
  41. for i in range(y//2):
  42. for j in range (x//2):
  43. mas[i][j]=1
  44. for a in range(y//2):
  45. for b in range (x//2):
  46. k = random.randrange(1,5)
  47. if k == 2:
  48. mas[a][x-1-b]=1
  49. mas[a][b]=0
  50. elif k == 3:
  51. mas[y-a-1][b]=1
  52. mas[a][b] = 0
  53. elif k == 4:
  54. mas[y-a-1][x-b-1]=1
  55. mas[a][b] = 0
  56. print("Полученная решетка: ")
  57. for i in range(y):
  58. print(mas[i])
  59. return mas
  60. def create_list(st,x,y):
  61. '''Создаёт массив'''
  62. m = []
  63. while len(st)<x*y:
  64. st+='*'
  65. for i in range(y):
  66. m.append([st[i*x:(i*x+x)]])
  67. return m
  68. def cdivide_str(st,x,y):
  69. '''Разбивает строку для зашифровки'''
  70. m = []
  71. k = len(st)
  72. for i in range(k//(x*y)+1):
  73. m.append([st[0:x*y]])
  74. st = st[x*y:]
  75. return m
  76. def ddivide_str(st,x,y):
  77. '''Разбивает строку для дешифровки'''
  78. m = []
  79. k = len(st)
  80. for i in range(k//(x*y)):
  81. m.append([st[0:x*y]])
  82. st = st[x*y:]
  83. return m
  84. def turn_grille(re,k,x,y):
  85. '''Поворачивает решетку'''
  86. res = []
  87. for i in range(y):
  88. res.append([0 for j in range(x)])
  89. if k == 0:
  90. for i in range(y):
  91. for j in range(x):
  92. if re[i][j] == 1:
  93. res[i][x-1-j] = 1
  94. elif k == 1:
  95. for i in range(y):
  96. for j in range(x):
  97. if re[i][j] == 1:
  98. res[y-1-i][x-1-j] = 1
  99. elif k == 2:
  100. for i in range(y):
  101. for j in range(x):
  102. if re[i][j] == 1:
  103. res[i][x-1-j] = 1
  104. return res
  105. def encrypt_grille(mas,re,x,y):
  106. '''Зашифровывает сообщение'''
  107. res = ''
  108. for k in range (4):
  109. for i in range(y):
  110. for j in range (x):
  111. if re[i][j]==1:
  112. res+=mas[i][0][j]
  113. re = turn_grille(re,k,x,y)
  114.  
  115. return res
  116. def decrypt_grille(st,re,x,y):
  117. '''Дешифровывает сообщение'''
  118. res = []
  119. for i in range(y):
  120. res.append([0 for j in range(x)])
  121. a = 0
  122. for k in range (4):
  123. for i in range(y):
  124. for j in range (x):
  125. if re[i][j]==1:
  126. res[i][j]=st[a]
  127. a+=1
  128. re = turn_grille(re,k,x,y)
  129. p = ''
  130. for i in range (len(res)):
  131. p += ''.join(res[i])
  132. return p
  133. st = normalize(input("Введите сообщение: "))
  134. while True:
  135. x,y = int(input("Ширина решётки: ")),int(input("Высота решётки: "))
  136. if x%2==0 and y%2==0 :
  137. break
  138. else:
  139. print("Значение введено неправильно.")
  140. k = int(input("1 - Задать координаты решётки.\n2 - Автоматически создать решётку.\n"))
  141. if k == 1:
  142. if len(st) > x*y:
  143. st = cdivide_str(st,x,y)
  144. r = create_grille(x,y)
  145. s = encrypt_grille(create_list(st[0][0],x,y),r,x,y)
  146. for i in range(1, len(st)):
  147. s+=encrypt_grille(create_list(st[i][0],x,y),r,x,y)
  148. print("Зашифрованное сообщение:",s)
  149. else:
  150. print("Зашифрованное сообщение:",encrypt_grille(create_list(st,x,y),create_grille(x,y),x,y))
  151. elif k == 2:
  152. if len(st) > x*y:
  153. st = cdivide_str(st,x,y)
  154. r = auto_grille(x,y)
  155. s = encrypt_grille(create_list(st[0][0],x,y),r,x,y)
  156. for i in range(1,len(st)):
  157. s+=encrypt_grille(create_list(st[i][0],x,y),r,x,y)
  158. print("Зашифрованное сообщение:",s)
  159. else:
  160. print("Зашифрованное сообщение:", encrypt_grille(create_list(st,x,y),auto_grille(x,y),x,y))
  161. else:
  162. print("Значение введено неправильно.")
  163. st = normalize(input("Введите зашифрованное сообщение: "))
  164. while True:
  165. x,y = int(input("Ширина решётки: ")),int(input("Высота решётки: "))
  166. if x%2==0 and y%2==0:
  167. break
  168. else:
  169. print("Значение введено неправильно.")
  170. if len(st) > x*y:
  171. st = ddivide_str(st,x,y)
  172. r = create_grille(x,y)
  173. s = decrypt_grille(st[0][0],r,x,y)
  174. for i in range(1, len(st)):
  175. s+=decrypt_grille(st[i][0],r,x,y)
  176. print("Дешифрованное сообщение:",s)
  177. else:
  178. print("Дешифрованное сообщение:", decrypt_grille(st,create_grille(x,y),x,y))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement