Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 18, 2017 16:51:26

damilkrose
Зарегистрирован: 2017-11-10
Сообщения: 18
Репутация: +  -1  -
Профиль   Отправить e-mail  

Критика

Прошу немного критики в сторону моего кода. В прошлый раз все учел и постарался писать в стиле Питона. Первые 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

Офлайн

#2 Ноя. 18, 2017 17:12:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Критика

         except FileNotFoundError as fnf:
            raise FileNotFoundError("File not exists, error: " + str(fnf))
не понял смысла перерерайзить тот же самый эксепшен, пусть бы родной валился
         dic = list("йцукенгшщзхъфывапролджэячсмитьбю")  # Делаем словарь
        dic.append(" ")
        dic_range = len("йцукенгшщзхъфывапролджэячсмитьбю")+1  # длина словаря для шифра Цезаря
Комментарии нужны? Говнокоднее трудно придумать. Ну заведи ты константу! Да хер с ней с константой, ну у тебя же двумя строками выше уже есть dic, нельзя от него len взять?
     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")
Хардкод путей, really????
  kp = open(keys_path, "r")  # Открываем файл с ключами
только что мы знали про with, и внезапно забыли
 if str(k)[0] in ["-", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]:
Я бы тупо строкой сделал
И над всем этим толстым слоем намазаны Магические Числа


Ну это если говорить про код, в алгоритме разбираться в субботу - грех.





Отредактировано FishHook (Ноя. 18, 2017 17:14:19)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version