Найти - Пользователи
Полная версия: шифратор дешифратор
Начало » Python для новичков » шифратор дешифратор
1
qweqwe
Доброго дня суток
Есть задание сделать шифратор перестановочным шифром.

т.е допустим есть текст:
“ЭТОСООБЩЕНИЕДЛЯОТПРАВКИ”

ключ:
“Комбайн” (7 символов)

сначало записываем текст по ключу. Т.е. после 7 символов переходим на следующую строку.

комбайн
ЭТОСООБ
ЩЕНИЕДЛ
ЯОТПРАВ
КИ

таким образом на каждую букву привязывается определенный текст. например:
К - “ЭЩЯК”
О - “ТЕОИ”
М - “ОНТ”
и тд

потом переставляем ключ со своими значениями по алфавиту и получается текст

оер сип ода Эщяк онт блв теои

Шифратор сделать у меня получилось.
Вот примерно так:
# -*- coding: cp1251 -*-
import sys
slovo = raw_input('Введите текст:') # ЭТО СООБЩЕНИЕ ДЛЯ ОТПРАВКИ
filtslovo = filter(lambda x: x.isalpha(),slovo ) # пробелы
k=len(filtslovo)
key = raw_input('Введите ключ:') # КОМБАЙН
n = list(key)
t=len(n)

d = {}
i=0
while i<t:
d[n[i]]=filtslovo[i:k:t]
i=i+1

print 'Результат:'
j=0
n.sort()
while j<t:
sys.stdout.write(d[n[j]]) # ОЕРСИПОДАЭЩЯКОНТБЛВТЕОИ
j=j+1
А вот из зашифрованного слова (ОЕРСИПОДАЭЩЯКОНТБЛВТЕОИ) , обратно текст составить (ЭТОСООБЩЕНИЕДЛЯОТПРАВКИ) никак не получается. Подскажите пожалуйста как реализовать?
py.user.next
text = "оер сип ода Эщяк онт блв теои"
passw = "комбайн"
la = list(text.split())
print(la)
lb = list(passw)
print(lb)
lb.sort()
print(lb)
da = dict(zip(lb, la))
print(da)
lc = [da[k] for k in passw]
print(lc)
maxlen = max(len(i) for i in lc)
print(maxlen)
sa = ""
for i in range(maxlen):
for j in lc:
if i < len(j):
sa += j[i]
print(sa)
[guest@localhost tests]$ python3 t.py
['оер', 'сип', 'ода', 'Эщяк', 'онт', 'блв', 'теои']
['к', 'о', 'м', 'б', 'а', 'й', 'н']
['а', 'б', 'й', 'к', 'м', 'н', 'о']
{'б': 'сип', 'а': 'оер', 'й': 'ода', 'к': 'Эщяк', 'н': 'блв', 'м': 'онт', 'о': 'теои'}
['Эщяк', 'теои', 'онт', 'сип', 'оер', 'ода', 'блв']
4
Этосообщениедляотправки
[guest@localhost tests]$
в ключе символы не могут повторяться вроде
xyxel
ну у автора зашифрованный текст без пробелов, поэтому надо еще разделить его с помощью остатка от деления.
pyuser
у меня шифратор получился несколько проще (и пробелы из сообщения я не выкидываю, не пойму, зачем это)
def coder(msg, key):
lmsg = len(msg)
lkey = len(key)
tmp = dict((k, msg[i:lmsg:lkey]) for i, k in enumerate(key))
return "".join(tmp[x] for x in sorted(key))
а дешифратор выглядит так:
from itertools import izip_longest

def decoder(msg, key):
lmsg = len(msg)
lkey = len(key)

d, m = divmod(lmsg, lkey)
group = dict((k, d) for k in key)
for i in range(m):
group[key[i]] += 1

tmp = {}
for k in sorted(key):
tmp[k], msg = msg[:group[k]], msg[group[k]:]
return("".join("".join(x) for x in izip_longest(*(tmp[k] for k in key), fillvalue="")))
код
if "__main__" == __name__:
s = coder("ЭТО СООБЩЕНИЕ ДЛЯ ОТПРАВКИ", "КОМБАЙН")
print(s)
print(decoder(s, "КОМБАЙН"))
выводит следующее
СИОИ Н КОЕТЭБДРОЕЯВО ПТЩЛА
ЭТО СООБЩЕНИЕ ДЛЯ ОТПРАВКИ
qweqwe
Бальшоооое всем спасибо! =) попробую разобраться!!!!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB