/
DannyFLS
/
HASH
Обзор
Документация
Войти
/
DannyFLS
/
HASH
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
132 строки
5 KB
DannyGolds
Old works
15 май 2026, 07:12
15 май 2026, 07:12
0c2c90c
Код
Авторство
О чём код?
import dearpygui.dearpygui as dpg import os ALPHABETS = { "Русский (32)": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "English (25)": "ABCDEFGHIKLMNOPQRSTUVWXYZ" } def validate_input(sender, app_data): choice = dpg.get_value("sel_alpha") alphabet = ALPHABETS[choice] # Извлекаем только буквы из ввода пользователя input_text = dpg.get_value(sender).upper() letters_only = "".join([c for c in input_text if c.isalpha()]) # Проверяем, все ли буквы входят в выбранный алфавит invalid_chars = [c for c in letters_only if c not in alphabet] if invalid_chars: error_msg = f"Ошибка: Символ '{invalid_chars[0]}' не входит в {choice.split()[0]} алфавит!" dpg.set_value("status_msg", error_msg) dpg.configure_item("status_msg", color=[255, 100, 100]) # Красный цвет else: dpg.set_value("status_msg", "Статус: OK") dpg.configure_item("status_msg", color=[100, 255, 100]) # Зеленый цвет def process_logic(sender, app_data, user_data): alphabet = ALPHABETS[dpg.get_value("sel_alpha")] k1 = dpg.get_value("k1").upper().strip() k2 = dpg.get_value("k2").upper().strip() raw_text = dpg.get_value("in_txt").upper().replace(" ", "").replace("Ё", "Е").replace("J", "I") # Очистка текста для алгоритма (игнорируем все, кроме букв алфавита) raw_text = "".join([c for c in raw_text if c in alphabet]) is_encrypt = (user_data == "enc") size = len(alphabet) cols = 8 if size == 32 else 5 rows = size // cols # 1. Генерация матриц m_list = [] for key in [k1, k2]: combined = "" for char in (key + alphabet): if char not in combined and char in alphabet: combined += char m_list.append([list(combined[i:i+cols]) for i in range(0, size, cols)]) m1, m2 = m_list[0], m_list[1] # 2. Отрисовка матриц for idx, m in enumerate([m1, m2]): t_id = f"table_{idx}" dpg.delete_item(t_id, children_only=True) for _ in range(cols): dpg.add_table_column(parent=t_id) for row in m: with dpg.table_row(parent=t_id): for char in row: dpg.add_text(char, color=[200, 200, 255]) # 3. Шифрование/Дешифрование if not raw_text: return if len(raw_text) % 2 != 0: raw_text += "Х" if size == 32 else "X" res = "" s1, s2 = (m1, m2) if is_encrypt else (m2, m1) r1_mat, r2_mat = (m2, m1) if is_encrypt else (m1, m2) for i in range(0, len(raw_text), 2): c1, c2 = raw_text[i], raw_text[i+1] pos1, pos2 = None, None for r in range(rows): if c1 in s1[r]: pos1 = (r, s1[r].index(c1)) if c2 in s2[r]: pos2 = (r, s2[r].index(c2)) if pos1 and pos2: res += r1_mat[pos1[0]][pos2[1]] res += r2_mat[pos2[0]][pos1[1]] dpg.set_value("out_txt", res) # --- Настройка UI --- dpg.create_context() # Шрифт с поддержкой кириллицы with dpg.font_registry(): for path in ["C:\\Windows\\Fonts\\arial.ttf", "NotoSans-Regular.ttf"]: if os.path.exists(path): with dpg.font(path, 18) as f: dpg.add_font_range_hint(dpg.mvFontRangeHint_Cyrillic) dpg.bind_font(f) break with dpg.window(label="Шифр Уиттстона (Двойной квадрат)", width=600, height=600): with dpg.group(horizontal=True): dpg.add_combo(list(ALPHABETS.keys()), tag="sel_alpha", default_value="Русский (32)", width=150) dpg.add_input_text(hint="Ключ 1", tag="k1", width=150, callback=validate_input) dpg.add_input_text(hint="Ключ 2", tag="k2", width=150, callback=validate_input) # Поле статуса (ошибки) dpg.add_text("Статус: OK", tag="status_msg", color=[100, 255, 100]) dpg.add_spacer(height=5) with dpg.group(horizontal=True): with dpg.child_window(width=285, height=200): dpg.add_text("Левая матрица") with dpg.table(tag="table_0", header_row=False, borders_innerH=True, borders_innerV=True): for _ in range(8): dpg.add_table_column() with dpg.child_window(width=285, height=200): dpg.add_text("Правая матрица") with dpg.table(tag="table_1", header_row=False, borders_innerH=True, borders_innerV=True): for _ in range(8): dpg.add_table_column() dpg.add_spacer(height=10) dpg.add_text("Текст для обработки:") dpg.add_input_text(tag="in_txt", width=-1, callback=validate_input) with dpg.group(horizontal=True): dpg.add_button(label="Зашифровать", callback=process_logic, user_data="enc", width=140) dpg.add_button(label="Дешифровать", callback=process_logic, user_data="dec", width=140) dpg.add_spacer(height=10) dpg.add_text("Результат:") dpg.add_input_text(tag="out_txt", width=-1, readonly=True) dpg.create_viewport(title="Double Wheatstone Square", width=620, height=620) dpg.setup_dearpygui() dpg.show_viewport() dpg.start_dearpygui() dpg.destroy_context()