Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 13, 2010 11:49:05

qweqwe
От:
Зарегистрирован: 2010-09-23
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

шифратор дешифратор

Доброго дня суток
Есть задание сделать шифратор перестановочным шифром.

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

ключ:
“Комбайн” (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
А вот из зашифрованного слова (ОЕРСИПОДАЭЩЯКОНТБЛВТЕОИ) , обратно текст составить (ЭТОСООБЩЕНИЕДЛЯОТПРАВКИ) никак не получается. Подскажите пожалуйста как реализовать?



Офлайн

#2 Окт. 14, 2010 06:39:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

шифратор дешифратор

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]$
в ключе символы не могут повторяться вроде



Офлайн

#3 Окт. 14, 2010 08:16:29

xyxel
От:
Зарегистрирован: 2010-04-18
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

шифратор дешифратор

ну у автора зашифрованный текст без пробелов, поэтому надо еще разделить его с помощью остатка от деления.



Офлайн

#4 Окт. 14, 2010 09:18:15

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

шифратор дешифратор

у меня шифратор получился несколько проще (и пробелы из сообщения я не выкидываю, не пойму, зачем это)

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, "КОМБАЙН"))
выводит следующее
СИОИ Н КОЕТЭБДРОЕЯВО ПТЩЛА
ЭТО СООБЩЕНИЕ ДЛЯ ОТПРАВКИ



Офлайн

#5 Окт. 14, 2010 10:48:12

qweqwe
От:
Зарегистрирован: 2010-09-23
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

шифратор дешифратор

Бальшоооое всем спасибо! =) попробую разобраться!!!!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version