Уведомления

Группа в Telegram: @pythonsu

#1 Июль 30, 2018 13:03:42

inck
Зарегистрирован: 2018-07-20
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Шифр Виженера

Здравствуйте, пытался написать шифровщик для шифра Виженера

 abc = list("abcdefghijklmnopqrstuvwxyz")
ABC = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
word = input()
key = input()
global wordcount
global count
global abcup
abcup = list()
global keycount
def code(word, key):
    word = list(word)
    key = list(key)
    a = len(word)
    acopy = a
    while(a):
        if(word[count].isupper()):
            wordcount = abc.index(word[count])
            abcup[word[count]] = 0
        else:
            wordcount = ABC.index(word[count])
            abcup[word[count]] = 1
        if(key[count].isupper()):
            keycount = abc.index(key[count])
        else:
            keycount = ABC.index(key[count])
        coded = list()
        coded[count] = wordcount + keycount
        count = count + 1
        a = a - 1
    count = 0
    while(acopy):
        if(abcup[count] == 1):
            keycount = ABC.index(coded[count])
            coded[count] = keycount
        else:
            keycount = abc.index(coded[count])
        count = count + 1
        acopy = acopy - 1
    return(coded)
'''def decode(word, key):
    word = list(word)
    key = list(key)
    '''
code(word, key)
выдает такие ошибки:
Traceback (most recent call last):
File “/Users/Vlad/PycharmProjects/untitled/vijiner.py”, line 55, in <module>
code(word, key)
File “/Users/Vlad/PycharmProjects/untitled/vijiner.py”, line 17, in code
if(word.isupper()):
UnboundLocalError: local variable ‘count’ referenced before assignment
помогите!!!

Офлайн

#2 Июль 30, 2018 15:25:26

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Шифр Виженера

Шифр Виженера это просто.

 tabula_recta = ["".join([ chr(x) for x in xrange(97+y, 123+y) if x < 123 ] + [ chr(x-123+97) for x in xrange(97+y, 123+y) if x >= 123 ]) for y in xrange(26) ]
 
def norm_key(key, word):
	return key * (len(word)//len(key)) + key[:len(word)%len(key)]
 
def coder(word, key):
	return "".join([ tabula_recta[ord(x)-97][ord(y)-97] for (i,x) in enumerate(word) for (n,y) in enumerate(norm_key(key, word)) if n == i ])
 
def decoder(word, key):
	return "".join([ chr(tabula_recta[ord(x)-97].index(y)+97) for (i,x) in enumerate(norm_key(key, word)) for (n,y) in enumerate(word) if n == i ])
  
>>> coder("rodegast", "lord")
'ccuhrojw'
>>> decoder("ccuhrojw", "lord")
'rodegast'
Эту реализацию шифра я написал за 15 минут. Но она работает только с малыми буквами латинского алфавита. Попробуй в ней разобраться и доработай так что бы можно было использовать символы заранее заданного алфавита.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июль 30, 2018 16:58:35)

Офлайн

#3 Июль 31, 2018 20:52:48

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Шифр Виженера

Лмао, изи пизи. Я с этой легкотни начинал, Цезарь, Бекон, Вижинер.

Вот пример:

 def vegenere(text: str, key: str, encrypt: bool):
	return "".join([chr((ord(text[a]) + (-ord(key[a % len(key)]) if not encrypt else ord(key[a % len(key)])) ) % 0x110000) for a in range(text.__len__())])
Это за 3 минуты, просто я долго интересовался всякими шифрами, сейчас тоже самое, но не так сильно.



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Офлайн

#4 Авг. 1, 2018 10:46:07

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Шифр Виженера

> Вот пример … Это за 3 минуты, просто я долго интересовался всякими шифрами

Это будет работать если у тебя нет строго заданного алфавита и ты можешь использовать всю плоскость юникода. Ну и лучше разбить это на 2 функции.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Авг. 2, 2018 22:28:44

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Шифр Виженера

Ну наверно. И даже если алфавит ограниченный, можно легдко изменить chr и ord на

 list.index; list[index]
, и делить с остатком на размер массива. Ничего не поменяется



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Отредактировано DamMercul (Авг. 2, 2018 22:29:14)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version