Найти - Пользователи
Полная версия: Шифр Виженера
Начало » Python для новичков » Шифр Виженера
1
inck
Здравствуйте, пытался написать шифровщик для шифра Виженера
 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
помогите!!!
Rodegast
Шифр Виженера это просто.
 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 минут. Но она работает только с малыми буквами латинского алфавита. Попробуй в ней разобраться и доработай так что бы можно было использовать символы заранее заданного алфавита.
DamMercul
Лмао, изи пизи. Я с этой легкотни начинал, Цезарь, Бекон, Вижинер.

Вот пример:
 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 минуты, просто я долго интересовался всякими шифрами, сейчас тоже самое, но не так сильно.
Rodegast
> Вот пример … Это за 3 минуты, просто я долго интересовался всякими шифрами

Это будет работать если у тебя нет строго заданного алфавита и ты можешь использовать всю плоскость юникода. Ну и лучше разбить это на 2 функции.
DamMercul
Ну наверно. И даже если алфавит ограниченный, можно легдко изменить chr и ord на
 list.index; list[index]
, и делить с остатком на размер массива. Ничего не поменяется
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