Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
from itertools import cycle
def form_dict():
return dict([(i, chr(i)) for i in range(128)])
def comparator(value, key):
return dict([(idx, [ch[0], ch[1]])
for idx, ch in enumerate(zip(value, cycle(key)))])
def encode_val(word):
d = form_dict()
return [k for c in word for k,v in d.items() if v == c]
def full_encode(value, key):
d = comparator(value, key)
l = len(form_dict())
return [(v[0] + v[1]) % l for v in d.values()]
def decode_val(list_in):
l = len(list_in)
d = form_dict()
return [d[i] for i in list_in if i in d]
def full_decode(value, key):
d = comparator(value, key)
l = len(form_dict())
return [(v[0] - v[1]) % l for v in d.values()]
from itertools import cycle
LEN = 127
def full_encode(value, key):
return ''.join(map(lambda x: chr((ord(x[0]) + ord(x[1])) % LEN), zip(value, cycle(key))))
def full_decode(value, key):
return ''.join(map(lambda x: chr((ord(x[0]) - ord(x[1]) + LEN) % LEN), zip(value, cycle(key))))
if __name__ == "__main__":
word = 'Hello world'
key = 'key'
print 'Слово: '+ word
print 'Ключ: '+ key
shifre = full_encode(word, key)
print 'Шифр=', shifre
decoded = full_decode(shifre, key)
print 'Word=', decoded
# -*- coding: utf-8 -*-
d = [chr(i) for i in range(127)]
dl = len(d)
prepval = lambda val: zip( range(0,len(val)), val )
enc = lambda ch,key: (ch+key) % dl
dec = lambda ch,key: (ch-key+dl) % dl
def vigenere(value, key, func):
kl = len(key)
value = prepval( value )
e = [ func( ord(c), ord(key[i%kl]) ) for (i,c) in value ]
return ''.join( [ d[c] for c in e ] )
src = 'Hello world'
key = 'key'
tmp = vigenere( src, key, enc )
print tmp
print vigenere( tmp, key, dec )
# -*- coding: utf-8 -*-
from itertools import cycle, count
from functools import partial
def get_cypher(my_ord, my_chr, al_size):
def process(func, value, key):
key = cycle(map(my_ord, key))
value = map(my_ord, value)
result = map(func, zip(value, key))
return ''.join(map(my_chr, result))
encrypt = lambda x: (x[0] + x[1]) % al_size
decrypt = lambda x: (x[0] - x[1] + al_size) % al_size
return partial(process, encrypt), partial(process, decrypt)
# Используем ASCII в качестве алфавита
encrypt, decrypt = get_cypher(ord, chr, 256)
# Либо предоставляем свой словарь d
d = map(chr, range(128))
rd = dict(zip(d, count()))
encrypt, decrypt = get_cypher(rd.get, d.__getitem__, len(d))
Шифр Виженера. Разбор алгоритма на Python