Форум сайта python.su
Собсна, захотелось мне автоматизировать процесс шифрования. Думал, что получится также просто как и системой Виженера, но нет.
Из-за того что решение не продумал, а сразу начал фигачить код, то все очень сумбурно и непотяно почему.
Сейчас при запуске выкидывает исключение в строке
if first_symb[0] > second_symb[0]:
TypeError: 'NoneType' object is not subscriptable
import string import random def group(iterable, count): """ Группировка элементов последовательности по count элементов """ return list(zip(*[iter(iterable)] * count)) def find_pos(symb, lst): if symb in lst: return lst.index[symb] def get_pos(symb, table): for i in range(len(table)): if symb in table[i]: return i, table[i].index(symb) def make_lst(table): for i in range(len(table)): table[i] = list(table[i]) return table def make_bigramms(phrs): bigramms = [] i = 0 while i < len(phrs): stop = i + 2 bigramms.append(phrase[i:stop]) i += 2 if len(bigramms[-1]) < 2: bigramms[-1].append('a') return bigramms def get_enc_symb(symb1, symb2, table1, table2): first_symb = get_pos(symb1, table1) second_symb = get_pos(symb2, table2) if first_symb[0] > second_symb[0]: first_enc_symb = table2[second_symb[0]-1][second_symb[1]] if first_symb[0] == len(table1): second_enc_symb = table1[first_symb[0]+1][first_symb[1]] elif first_symb[0] < second_symb[0]: first_enc_symb = table1[first_symb[0]-1][first_symb[1]] if first_symb[0] == len(table1): second_enc_symb = table2[second_symb[0]+1][second_symb[1]] elif first_symb[0] == second_symb[0]: first_enc_symb = table2[second_symb[0]][second_symb[1]] second_enc_symb = table1[first_symb[0]][first_symb[1]] return table1[first_symb[0]][first_symb[1]], table2[second_symb[0]][second_symb[1]] alphabet = string.ascii_lowercase chars_to_fill = list(alphabet) # список для заполнения таблиц phrase = 'People rarely succeed unless they have fun in what they are doing.'.lower() reserve = [' ', '-', ',', ':', ';', '.'] # список добавочных символов для заполнения таблиц for i in phrase.lower(): # формирование списка для заполнения if i not in alphabet: chars_to_fill.append(i) chars_to_fill = list(set(chars_to_fill)) while len(chars_to_fill) < 30: for i in reserve: if i not in chars_to_fill: chars_to_fill.append(i) table1 = make_lst(group(chars_to_fill, 5)) # генерация таблиц random.shuffle(chars_to_fill) table2 = make_lst(group(chars_to_fill, 5)) bigramms = make_bigramms(phrase) res = '' for i in bigramms: res += str(get_enc_symb(i[0], i[1], table1, table2)) print(res)
Отредактировано kozlo22 (Ноя. 6, 2014 00:46:34)
Офлайн
1. когда в
phrase = 'People rarely succeed unless they have fun in what they are doing.'.lower()
bigramms[-1].append('a')
bigramms[-1] = bigramms[-1] + 'a'
Офлайн
ага, проблема не в точке
неправильная таблица
second_symb = get_pos('s', [['z', 'j', 'q', 'l', ':'], ['g', 'c', 'b', 't', 'd'], ['f', ' ', 'e', 'y', 'p'], [';', 'k', 'a', 'v', 'h'], ['i', '-', 'm', 'n', 'r'], ['u', ',', 'x', 'w', '.']])
r [['i', 't', 'x', 'q', 'h'], ['f', 'g', 'a', 'l', 'n'], ['o', 'v', 's', 'd', ' '], ['c', ',', ';', 'e', 'u'], ['m', 'k', 'b', '-', 'y'], ['z', 'j', '.', 'p', 'w']]
Отредактировано terabayt (Ноя. 6, 2014 01:03:37)
Офлайн
terabayt
да, спасибо за пинок. Пофиксиил, нашел еще ошибки, при чем очень странные.
Но вроде работает.
import string import random def group(iterable, count): """ Группировка элементов последовательности по count элементов """ return list(zip(*[iter(iterable)] * count)) def find_pos(symb, lst): if symb in lst: return lst.index[symb] def get_pos(symb, table): for i in range(len(table)): if symb in table[i]: return i, table[i].index(symb) def make_lst(table): for i in range(len(table)): table[i] = list(table[i]) return table def make_bigramms(phrs): bigramms = [] i = 0 while i < len(phrs): stop = i + 2 bigramms.append(phrase[i:stop]) i += 2 if len(bigramms[-1]) < 2: bigramms[-1].append('a') return bigramms def get_enc_symb(symb1, symb2, table1, table2): """ Шифрование элементов """ first_symb = get_pos(symb1, table1) second_symb = get_pos(symb2, table2) if first_symb[0] > second_symb[0]: first_enc_symb = table2[first_symb[0]][second_symb[1]] second_enc_symb = table1[second_symb[0]][first_symb[1]] elif first_symb[0] < second_symb[0]: first_enc_symb = table2[first_symb[0]][second_symb[1]] second_enc_symb = table1[second_symb[0]][first_symb[1]] elif first_symb[0] == second_symb[0]: first_enc_symb = table2[second_symb[0]][second_symb[1]] second_enc_symb = table1[first_symb[0]][first_symb[1]] return str(first_enc_symb + second_enc_symb) alphabet = string.ascii_lowercase chars_to_fill = list(alphabet) # список для заполнения таблиц phrase = 'People rarely succeed unless they have fun in what they are doing.'.lower() reserve = [' ', '-', ',', ':', ';', '.'] # список добавочных символов для заполнения таблиц for i in phrase.lower(): # формирование списка для заполнения if i not in alphabet: chars_to_fill.append(i) chars_to_fill = list(set(chars_to_fill)) for i in reserve: if len(chars_to_fill) == 30: break else: if i not in chars_to_fill: chars_to_fill.append(i) table1 = make_lst(group(chars_to_fill, 5)) # генерация таблиц random.shuffle(chars_to_fill) table2 = make_lst(group(chars_to_fill, 5)) bigramms = make_bigramms(phrase) res = '' for i in bigramms: res += str(get_enc_symb(i[0], i[1], table1, table2)) resfile = open('res.txt','w') resfile.write('Pharse for encryption: {}'.format(phrase)+'\n') for i in range(len(table1)): resfile.write(str(table1[i])+' '*5+str(table2[i])+'\n') resfile.write('Result: {}'.format(res)) resfile.close()
Офлайн