turns-00068.parquet:39199
be91f387491e0f81ec850837
turn 6/8gpt-4o-mini-2024-07-18RussianRussia622 words
degenerate_repetitionAbsentFinal dense release
USER
добавь выбор файла для шифрования
ASSISTANT
В предыдущем коде уже добавлена функциональность для выбора файла для шифрования с помощью кнопки "Обзор". Однако, давайте я подробно опишу, как именно происходит процесс выбора файла и как можно дополнительно улучшить интерфейс для этого.
### Полный пример программы с графическим интерфейсом для шифрования и обфускации файлов
```python
import os
import tkinter as tk
from tkinter import filedialog, messagebox
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
import numpy as np
import random
def generate_substitution_map(obfuscation_key):
original = list(range(256))
random.seed(obfuscation_key)
shuffled = original[:]
random.shuffle(shuffled)
return dict(zip(original, shuffled))
def obfuscate(data, substitution_map):
substituted = bytes(substitution_map[byte] for byte in data)
byte_array = bytearray(substituted)
np.random.shuffle(byte_array)
return bytes(byte_array)
def deobfuscate(data, substitution_map):
reverse_map = {v: k for k, v in substitution_map.items()}
byte_array = bytearray(data)
byte_array = sorted(byte_array)
return bytes(reverse_map[byte] for byte in byte_array)
def pad(data):
padder = padding.PKCS7(algorithms.AES.block_size).padder()
return padder.update(data) + padder.finalize()
def unpad(data):
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
return unpadder.update(data) + unpadder.finalize()
def encrypt_file(file_path, encryption_key, obfuscation_key):
cipher = Cipher(algorithms.AES(encryption_key), modes.CBC(encryption_key[:16]), backend=default_backend())
encryptor = cipher.encryptor()
with open(file_path, 'rb') as file:
file_data = file.read()
substitution_map = generate_substitution_map(obfuscation_key)
obfuscated_data = obfuscate(file_data, substitution_map)
padded_data = pad(obfuscated_data)
encrypted_data = encryptor.update(padded_data) + encryptor.finalize()
with open(file_path, 'wb') as file:
file.write(encrypted_data)
def decrypt_file(file_path, encryption_key, obfuscation_key):
cipher = Cipher(algorithms.AES(encryption_key), modes.CBC(encryption_key[:16]), backend=default_backend())
decryptor = cipher.decryptor()
with open(file_path, 'rb') as file:
encrypted_data = file.read()
decrypted_data = decryptor.update(encrypted_data) + decryptor.finalize()
original_data = unpad(decrypted_data)
substitution_map = generate_substitution_map(obfuscation_key)
return deobfuscate(original_data, substitution_map)
def browse_file():
"""Выбор файла для шифрования/дешифрования."""
filename = filedialog.askopenfilename(title="Выберите файл", filetypes=[("Все файлы", "*.*")])
if filename:
file_entry.delete(0, tk.END) # Очистить текстовое поле
file_entry.insert(0, filename) # Вставить выбранный путь
def encrypt_action():
file_path = file_entry.get()
encryption_key = key_entry.get().encode()
obfuscation_key = obfuscation_key_entry.get().encode()
if len(encryption_key) not in [16, 24, 32]:
messagebox.showerror("Ошибка", "Ключ для шифрования должен быть 16, 24 или 32 байта.")
return
try:
encrypt_file(file_path, encryption_key, obfuscation_key)
messagebox.showinfo("Успех", f"Файл {file_path} успешно зашифрован и обфусцирован.")
except Exception as e:
messagebox.showerror("Ошибка", str(e))
def decrypt_action():
file_path = file_entry.get()
encryption_key = key_entry.get().encode()
obfuscation_key = obfuscation_key_entry.get().encode()
if len(encryption_key) not in [16, 24, 32]:
messagebox.showerror("Ошибка", "Ключ для шифрования должен быть 16, 24 или 32 байта.")
return
try:
original_data = decrypt_file(file_path, encryption_key, obfuscation_key)
with open(file_path, 'wb') as file:
file.write(original_data)
messagebox.showinfo("Успех", f"Файл {file_path} успешно дешифрован и деобфусцирован.")
except Exception as e:
messagebox.showerror("Ошибка", str(e))
# Создание GUI
root = tk.Tk()
root.title("Шифрование и обфускация файлов")
file_label = tk.Label(root, text="Выберите файл:")
file_label.pack(pady=10)
file_entry = tk.Entry(root, width=70) # Увеличен размер текстового поля
file_entry.pack(pady=5)
browse_button = tk.Button(root, text="Обзор", command=browse_file)
browse_button.pack(pady=5)
key_label = tk.Label(root, text="Введите ключ для шифрования (16, 24 или 32 байта):")
key_label.pack(pady=10)
key_entry = tk.Entry(root, show="*", width=70) # Увеличен размер текстового поля
key_entry.pack(pady=5)
obfuscation_key_label = tk.Label(root, text="Введите ключ для обфускации:")
obfuscation_key_label.pack(pady=10)
obfuscation_key_entry = tk.Entry(root, show="*", width=70) # Увеличен размер текстового поля
obfuscation_key_entry.pack(pady=5)
encrypt_button = tk.Button(root, text="Шифровать", command=encrypt_action)
encrypt_button.pack(pady=20)
decrypt_button = tk.Button(root, text="Дешифровать", command=decrypt_action)
decrypt_button.pack(pady=5)
# Запуск главного цикла Tkinter
root.mainloop()
```
### Объяснение кода
1. **Выбор файла**: Функция `browse_file()` открывает диалог выбора файла и вставляет путь к выбранному файлу в текстовое поле, чтобы пользователь мог видеть, какой файл он выбрал.
2. **Обработка шифрования и дешифрования**: После выбора файла пользователь вводит ключ для шифрования (который должен быть длиной 16, 24 или 32 байта) и ключ для обфускации. По нажатию кнопок "Шифровать" или "Дешифровать" выполняются соответствующие функции.
3. **Обработка ошибок**: Программа будет показывать сообщения об ошибках, если что-то пойдет не так, например, если длина ключа неверная или если произошла ошибка при чтении/записи файла.
4. **Графический интерфейс**: GUI реализован с использованием Tkinter и включает текстовые поля для ввода ключей, кнопки для шифрования/дешифрования и кнопку для выбора файла.
### Запуск программы
- Убедитесь, что у вас установлены нужные библиотеки.
- Запустите программу с помощью Python. Откроется окно, в котором вы можете выбрать файл и ввести ключи необходимой длины.
- Протестируйте шифрование и дешифрование на тестовых файлах перед использованием на важных данных.
Если у вас возникнут дополнительные вопросы или нужна помощь с реализацией, не стесняйтесь спрашивать!