Форум сайта python.su
Прошу немного критики в сторону моего кода. В прошлый раз все учел и постарался писать в стиле Питона. Первые 4 импорта импортируют модули которые я сам написал - они шифруют и дешифруют шифрами Вижинера и Цезаря(думал лучше подойдет ROT32, но все равно уже). В будущем добавлю еще шифр одинарной перестановки, шифр блочной перестановки и одну модификацию шифра Вижинера(вроде бы она называется WA_EN - не помню).
# coding=utf-8 - Кодировка utf-8 """ КриптоБомба Автор: Damilkrose Версия: 2.0 Предыдущие версии и модификации версий: 1.0; 1.2; 1.5 (1.0, 1.2 утеряны) Дата: 18/11/2017 """ from cryptograph.cryptobomb.ceaser_for_cryptobomb import cipher as cc # Зашифровка шифром Цезаря from cryptograph.cryptobomb.vijiner_cipher_for_cryptobomb import cipher as vc # Зашифровка шифром Вижинера from cryptograph.cryptobomb.ceaser_decryptor_for_cryptobomb import cipher as ccd # Расшифровка шифра Цезаря from cryptograph.cryptobomb.vijiner_decryptor_for_cryptobomb import cipher as vcd # расшифровка шифром Вижинера from random import randrange, choice class cryptobomb: def __init__(self): self.nameismain = __name__ == "__main__" def encrypt(self, num, text): try: num = int(num) text = str(text) except ValueError: raise ValueError("NUM needs to be integral") # Проверка на тип аргумента "количества шифрований" ciphers = ["vijiner", "ceaser"] # Возможные шифры keys = [] # Список ключей en_text = text # Это для шифрования, чтобы было с чего начинать. dic = list("йцукенгшщзхъфывапролджэячсмитьбю") # Делаем словарь dic.append(" ") dic_range = len("йцукенгшщзхъфывапролджэячсмитьбю")+1 # длина словаря для шифра Цезаря for c in range(0, num): # Шифруем столько раз, сколько заказали key_for_vc = "".join([choice(dic) for v in range(4, randrange(10, 15))]) # Делаем ключ для шифра вижинера key_for_cc = randrange(-dic_range, dic_range) chosen_cipher = choice(ciphers) en_text = cc(en_text, key_for_cc) if chosen_cipher == "ceaser" else vc(en_text, key_for_vc) # Шифруем keys.append(key_for_cc if chosen_cipher == "ceaser" else key_for_vc) # Добавляем ключ в список ключей deformated_keys_list = "\n".join(str(key) for key in keys) # Переформатируем лист с ключами в текст with open(r"D:\danilka\Documents\PythonFiles\keys_from_cryptobomb.txt", "w") as write_keys: # TODO: сделать инпут для адреса на папку с ключами write_keys.write(deformated_keys_list) write_keys.close() return en_text # Возвращяем текст(зашифрованный) def decrypt(self, text, keys_path): de_text = text try: kp = open(keys_path, "r") # Открываем файл с ключами kp_text = kp.read() kp_text = kp_text.split() kp_text.reverse() kp.close() except FileNotFoundError as fnf: raise FileNotFoundError("File not exists, error: " + str(fnf)) for k in kp_text: # Перебираем ключи if str(k)[0] in ["-", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]: # Если ключ - число de_text = ccd(de_text, int(k)) # Шифруем # print("DECRYPTED WITH CEASER: " + de_text + "; KEY: " + str(k)) else: # print("DECRYPTED WITH VIJINER: " + de_text + "; KEY: " + str(k)) de_text = vcd(de_text, str(k)) # Шифруем return de_text # Возвращаем расшифрованный текст if __name__ == '__main__': test = input("TEST: ") if test: text = str(input("текст: ")) num_of_times = int(input("NUM OF TIMES: ")) a = cryptobomb().encrypt(num_of_times, text) print(a, " encrypted text") a = cryptobomb().decrypt(a, r"D:\danilka\Documents\PythonFiles\keys_from_cryptobomb.txt") print(a, " decrypted text") else: pass
Офлайн
except FileNotFoundError as fnf: raise FileNotFoundError("File not exists, error: " + str(fnf))
dic = list("йцукенгшщзхъфывапролджэячсмитьбю") # Делаем словарь dic.append(" ") dic_range = len("йцукенгшщзхъфывапролджэячсмитьбю")+1 # длина словаря для шифра Цезаря
def __init__(self): self.nameismain = __name__ == "__main__"
"".join([choice(dic) for v in range(4, randrange(10, 15))])
en_text = text
dic = list("йцукенгшщзхъфывапролджэячсмитьбю") # Делаем словарь dic.append(" ")
with open(r"D:\danilka\Documents\PythonFiles\keys_from_cryptobomb.txt", "w")
kp = open(keys_path, "r") # Открываем файл с ключами
if str(k)[0] in ["-", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]:
Отредактировано FishHook (Ноя. 18, 2017 17:14:19)
Офлайн