Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Шифр Поворотная решётка:
- import random
- def normalize(st):
- '''Нормализует строку'''
- abc='абвгдеёжзийклмнопрстуфхцчшщъыьэюя,.*-?!'
- st = st.lower()
- res = ''
- for i in st:
- if i in abc:
- res+=i
- return res
- def create_grille(x,y):
- '''Создаёт поворотную решетку (с заданием координат)'''
- mas = []
- for i in range(y):
- mas.append([0 for j in range(x)])
- mas2 = []
- for i in range(y):
- mas2.append([0 for j in range(x)])
- i=0
- while i < x*y//4:
- a,b = map(int,input("Введите координату окошка: ").split(' '))
- if a<=y and b<=x and mas[a][b]!=1 and mas2[a][b]!=1:
- mas[a][b]=1
- mas2[a][b]=1
- mas2[y-a-1][b]=1
- mas2[a][x-1-b]=1
- mas2[y-a-1][x-b-1]=1
- i+=1
- else:
- print("Значение введено неправильно.")
- print("Полученная решетка: ")
- for i in range(y):
- print(mas[i])
- return mas
- def auto_grille(x,y):
- '''Создаёт поворотную решетку (автоматически)'''
- mas = []
- for i in range(y):
- mas.append([0 for j in range(x)])
- for i in range(y//2):
- for j in range (x//2):
- mas[i][j]=1
- for a in range(y//2):
- for b in range (x//2):
- k = random.randrange(1,5)
- if k == 2:
- mas[a][x-1-b]=1
- mas[a][b]=0
- elif k == 3:
- mas[y-a-1][b]=1
- mas[a][b] = 0
- elif k == 4:
- mas[y-a-1][x-b-1]=1
- mas[a][b] = 0
- print("Полученная решетка: ")
- for i in range(y):
- print(mas[i])
- return mas
- def create_list(st,x,y):
- '''Создаёт массив'''
- m = []
- while len(st)<x*y:
- st+='*'
- for i in range(y):
- m.append([st[i*x:(i*x+x)]])
- return m
- def cdivide_str(st,x,y):
- '''Разбивает строку для зашифровки'''
- m = []
- k = len(st)
- for i in range(k//(x*y)+1):
- m.append([st[0:x*y]])
- st = st[x*y:]
- return m
- def ddivide_str(st,x,y):
- '''Разбивает строку для дешифровки'''
- m = []
- k = len(st)
- for i in range(k//(x*y)):
- m.append([st[0:x*y]])
- st = st[x*y:]
- return m
- def turn_grille(re,k,x,y):
- '''Поворачивает решетку'''
- res = []
- for i in range(y):
- res.append([0 for j in range(x)])
- if k == 0:
- for i in range(y):
- for j in range(x):
- if re[i][j] == 1:
- res[i][x-1-j] = 1
- elif k == 1:
- for i in range(y):
- for j in range(x):
- if re[i][j] == 1:
- res[y-1-i][x-1-j] = 1
- elif k == 2:
- for i in range(y):
- for j in range(x):
- if re[i][j] == 1:
- res[i][x-1-j] = 1
- return res
- def encrypt_grille(mas,re,x,y):
- '''Зашифровывает сообщение'''
- res = ''
- for k in range (4):
- for i in range(y):
- for j in range (x):
- if re[i][j]==1:
- res+=mas[i][0][j]
- re = turn_grille(re,k,x,y)
- return res
- def decrypt_grille(st,re,x,y):
- '''Дешифровывает сообщение'''
- res = []
- for i in range(y):
- res.append([0 for j in range(x)])
- a = 0
- for k in range (4):
- for i in range(y):
- for j in range (x):
- if re[i][j]==1:
- res[i][j]=st[a]
- a+=1
- re = turn_grille(re,k,x,y)
- p = ''
- for i in range (len(res)):
- p += ''.join(res[i])
- return p
- st = normalize(input("Введите сообщение: "))
- while True:
- x,y = int(input("Ширина решётки: ")),int(input("Высота решётки: "))
- if x%2==0 and y%2==0 :
- break
- else:
- print("Значение введено неправильно.")
- k = int(input("1 - Задать координаты решётки.\n2 - Автоматически создать решётку.\n"))
- if k == 1:
- if len(st) > x*y:
- st = cdivide_str(st,x,y)
- r = create_grille(x,y)
- s = encrypt_grille(create_list(st[0][0],x,y),r,x,y)
- for i in range(1, len(st)):
- s+=encrypt_grille(create_list(st[i][0],x,y),r,x,y)
- print("Зашифрованное сообщение:",s)
- else:
- print("Зашифрованное сообщение:",encrypt_grille(create_list(st,x,y),create_grille(x,y),x,y))
- elif k == 2:
- if len(st) > x*y:
- st = cdivide_str(st,x,y)
- r = auto_grille(x,y)
- s = encrypt_grille(create_list(st[0][0],x,y),r,x,y)
- for i in range(1,len(st)):
- s+=encrypt_grille(create_list(st[i][0],x,y),r,x,y)
- print("Зашифрованное сообщение:",s)
- else:
- print("Зашифрованное сообщение:", encrypt_grille(create_list(st,x,y),auto_grille(x,y),x,y))
- else:
- print("Значение введено неправильно.")
- st = normalize(input("Введите зашифрованное сообщение: "))
- while True:
- x,y = int(input("Ширина решётки: ")),int(input("Высота решётки: "))
- if x%2==0 and y%2==0:
- break
- else:
- print("Значение введено неправильно.")
- if len(st) > x*y:
- st = ddivide_str(st,x,y)
- r = create_grille(x,y)
- s = decrypt_grille(st[0][0],r,x,y)
- for i in range(1, len(st)):
- s+=decrypt_grille(st[i][0],r,x,y)
- print("Дешифрованное сообщение:",s)
- else:
- print("Дешифрованное сообщение:", decrypt_grille(st,create_grille(x,y),x,y))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement