def best_key(key, pos, mx, w_func, alf, crypt): best_char = 0 for i in range(len(alf)): key = change_key(key, pos, i, alf) text = vigenere.vigenere_decryption(crypt, key, alf) current_mx = matrix.get_reference_matrix(text, alf) new_w_func = objective_function(mx, current_mx) if new_w_func <= w_func: w_func = new_w_func best_char = i key = change_key(key, pos, best_char, alf) return key, w_func
def simpson_mode(): with open('crypt.txt', 'r') as fin: text = fin.read() l = int(input('длина ключа: ')) with open('ot_alf.txt', 'r') as fina: alf_ot = fina.read() alf = open('alphabet.txt', 'r').read().strip() deltas = simpson.get_deltas(l, text, alf, alf_ot) keys = simpson.get_keys(deltas, alf) with open('answers.txt', 'w') as fout2: for item in keys: fout2.write(item + '\n') fout2.write(vigenere.vigenere_decryption(text, item, alf) + '\n\n\n')
def main(): op = input('1. шифрование\n2. расшифровка\n3. h0\n4. hd\n> ') if op == '1': textname = input('введите название файла\n> ') alph = open('alphabet.txt').read() key = open('key.txt').read() text = vigenere.del_not_alf(open(textname).read(), alph) crypt = vigenere.vigenere_encryption(text, key, alph) open('crypt.txt', 'w').write(crypt) print('сохранен файл: crypt.txt') elif op == '2': text = open('crypt.txt', 'r').read() key = open('key.txt').read().strip() alf = open('alphabet.txt', 'r').read() decrypt = vigenere.vigenere_decryption(text, key, alf) open('decrypt.txt', 'w').write(str(decrypt)) print('сохранен файл: decrypt.txt') elif op == '3': textname = input('название файла\n> ') text = open(textname).read().lower() alph = open('alphabet.txt', 'r').read() freqs, h0 = get_h0(text, alph) with open('f.txt', 'w') as fout: for k, v in freqs: fout.write('{} {}\n'.format(k, v)) with open('h0.txt', 'w') as fout: for k, v in h0: fout.write('{} {}\n'.format(k, v)) elif op == '4': enc = open('crypt.txt', 'r').read() h0 = [] with open('h0.txt') as f: for line in f: char, value = line[0], line[2:] h0.append((char, float(value))) alph = ''.join(map(lambda h0i: h0i[0], h0)) n1 = int(input('введите n1\n> ')) n2 = int(input('введите n2\n> ')) hds = [get_hd(enc, alph, d) for d in range(n1, n2 + 1)] n_min, dist_min = None, 1 for idx, hd in enumerate(hds): dist = get_distance(list(map(lambda xi: float(xi[1]), h0)), list(map(lambda yi: yi[1], hd))) if dist < dist_min: n_min, dist_min = n1 + idx, dist print(n1 + idx, ':', dist) print('Наименьшее расстояние до H0 при d =', n_min)
def finding(d, alf, crypt, mx): key = get_random_key(d, alf) text = vigenere.vigenere_decryption(crypt, key, alf) current_mx = matrix.get_reference_matrix(text, alf) w_func = objective_function(mx, current_mx) new_key = key print(new_key) new_key, w_func = finding_best_key(d, mx, w_func, alf, crypt, new_key) while new_key != key: print(new_key) key = new_key new_key, w_func = finding_best_key(d, mx, w_func, alf, crypt, new_key) return key
def encrypt(): modv = int(input('1 - зашифровать\n2 - дешифровать\n> ')) if modv == 1: name = input('файл: ') with open(name + '.txt', 'r') as fin: text = fin.read() alf = open('alphabet.txt', 'r').read().strip() key = open('key.txt', 'r').read().strip() open('key_len.txt', 'w').write(str(len(key))) text = vigenere.del_not_alf(text, alf) crypt = vigenere.vigenere_encryption(text, key, alf) open('crypt.txt', 'w').write(crypt) if modv == 2: with open('crypt.txt', 'r') as fin: text = fin.read() key = open('key.txt').read().strip() alf = open('alphabet.txt', 'r').read().strip() decrypt = vigenere.vigenere_decryption(text, key, alf) open('decrypt.txt', 'w').write(str(decrypt))
def main(): mod = int(input('1 - подсчет индекса совпадений \n2 - шифр Виженера' '\n')) if mod == 1: mod_rand = int(input('1 - генерация случайных последовательностей' '\n2 - использование готовых текстов\n' '3 - готовые тексты со сдвигом\n')) mod_alf = int(input('1 - английский алфавит\n' '2 - русский алфавит\n')) if mod_alf == 1: with open('english.txt', 'r') as fin: alf = fin.read() else: with open('russian.txt', 'r') as fin: alf = fin.read() if mod_rand == 1: l = int(input('введите длину текста: ')) a = modify_text.gen_text(alf, l) with open('rand_a.txt', 'w') as finra: finra.write(a) b = modify_text.gen_text(alf, l) with open('rand_b.txt', 'w') as finrb: finrb.write(b) print('индекс совпадения: ' + str(round(index.overlap_index(a, b), 5) * 100)) # if mod2 == 2: print('средний индекс совпадения: ' + str(round(index.average_overlap_index(a, b, alf), 5) * 100)) if mod_rand == 3: name_a = input('файл 1: ') for i in range(1, 15+1): with open(name_a + '.txt', 'r') as fin_a: a = fin_a.read() with open(name_a + '+' + str(i) + '.txt', 'r') as fin_b: b = fin_b.read() a = modify_text.del_not_alf(a, alf) b = modify_text.del_not_alf(b, alf) if len(a) > len(b): l = len(b) else: l = len(a) if len(a) != len(b): if modify_text.cut_text(a, l) != -1: a = modify_text.cut_text(a, l) if modify_text.cut_text(b, l) != -1: b = modify_text.cut_text(b, l) # print(len(a)) # print(len(b)) print('индекс совпадения ' + name_a + ' и ' + name_a + '+' + str(i) + ': ' + str(round(index.overlap_index(a, b), 5) * 100)) if mod_rand == 2: # l = int(input('введите длину текста: ')) name_a = input('файл 1: ') name_b = input('файл 2: ') with open(name_a + '.txt', 'r') as fin_a: a = fin_a.read() with open(name_b + '.txt', 'r') as fin_b: b = fin_b.read() a = modify_text.del_not_alf(a, alf) b = modify_text.del_not_alf(b, alf) # может быть сделать длину равную длине меньшего текста? if len(a) > len(b): l = len(b) else: l = len(a) if len(a) != len(b): if modify_text.cut_text(a, l) != -1: a = modify_text.cut_text(a, l) else: print('длина первого текста не соответствует требованию') exit() if modify_text.cut_text(b, l) != -1: b = modify_text.cut_text(b, l) else: print('длина второго текста не соответствует требованию') exit() # with open(name_a + '_remade.txt', 'w') as fouta: # fouta.write(str(a)) # with open(name_b + '_remade.txt', 'w') as foutb: # foutb.write(str(b)) print(len(a)) print(len(b)) # mod2 = int(input('1 - индекс совпадения\n' # '2 - средний индекс совпадения\n3')) # # if mod2 == 1: print('индекс совпадения: ' + str(round(index.overlap_index(a, b), 5) * 100)) # if mod2 == 2: print('средний индекс совпадения: ' + str(index.average_overlap_index(a, b, alf) * 100)) if mod == 2: mod_alf = int(input('1 - английский алфавит\n' '2 - русский алфавит\n')) if mod_alf == 1: with open('english.txt', 'r') as fin: alf = fin.read() else: with open('russian.txt', 'r') as fin: alf = fin.read() mod_vigenere = int(input('1 - зашифровать\n2 - дешифровать\n' '3 - сдвинуть текст\n4 - сдвинуть в интервале\n')) if mod_vigenere == 1: name = input('введите название файла: ') with open(name + '.txt', 'r') as fin: text = fin.read() key = open('key.txt').read().strip() # key = input('ключ: ').strip() # open('key.txt', 'w').write(str(key)) text = modify_text.del_not_alf(text, alf) crypt = vigenere.vigenere_encryption(text, key, alf) open(name + 'cr.txt', 'w').write(str(crypt)) if mod_vigenere == 2: name = input('введите название файла: ') text = open(name + '.txt', 'r').read().strip() key = open('key.txt').read().strip() decrypt = vigenere.vigenere_decryption(text, key, alf) open('decrypt.txt', 'w').write(str(decrypt)) if mod_vigenere == 3: name = input('введите название файла: ') with open(name + '.txt', 'r') as fin: text = fin.read() # l = int(open('l_shift.txt', 'r').read().strip()) l = int(input('введите сдвиг l: ')) text = vigenere.shift(text, l) open(name + '+' + str(l) + '.txt', 'w').write(str(text)) if mod_vigenere == 4: name = input('введите название файла: ') with open(name + '.txt', 'r') as fin: text = fin.read() # l = int(open('l_shift.txt', 'r').read().strip()) l1 = int(input('введите минимальный сдвиг l min: ')) l2 = int(input('введите максимальный сдвиг l max: ')) for i in range(l1, l2+1): ans = vigenere.shift(text, i) open(name + '+' + str(i) + '.txt', 'w').write(str(ans))