Найти - Пользователи
Полная версия: Шифрование двойным квадратом Уитстона
Начало » Центр помощи » Шифрование двойным квадратом Уитстона
1
kozlo22
Собсна, захотелось мне автоматизировать процесс шифрования. Думал, что получится также просто как и системой Виженера, но нет.
Из-за того что решение не продумал, а сразу начал фигачить код, то все очень сумбурно и непотяно почему.
Сейчас при запуске выкидывает исключение в строке
if first_symb[0] > second_symb[0]:
:
TypeError: 'NoneType' object is not subscriptable
Сам не могу понять откуда появляется объект None.
Иногда код успешно выполняется - дает ожидаемый результат.
Сам код:
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)
terabayt
1. когда в
phrase = 'People rarely succeed unless they have fun in what they are doing.'.lower()
убрал точку вконце, эта ошибка на появляется
2. вместо
bigramms[-1].append('a')
я сменил на
bigramms[-1] = bigramms[-1] + 'a'
и выдало какой-то результат
terabayt
ага, проблема не в точке
неправильная таблица
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', '.']])
's' в таблице нету
теперь
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']]
'r' нету
kozlo22
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()
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