Всем привет.
Никто не хочет присоединиться к проекту?
На текущий момент все вроде хорошо, но есть еще порядка 20-30 уязвимостей, которые хочется победить.
Целью было разработать простой и эффективный скрипт на Python для шифрования и расшифровки файлов в определённой директории. При создании инструмента были учтены следующие аспекты:
Перейдём к подробному описанию функций, используемых в скрипте.
Никто не хочет присоединиться к проекту?
На текущий момент все вроде хорошо, но есть еще порядка 20-30 уязвимостей, которые хочется победить.
Целью было разработать простой и эффективный скрипт на Python для шифрования и расшифровки файлов в определённой директории. При создании инструмента были учтены следующие аспекты:
- Надёжное симметричное шифрование: Выбран алгоритм AES (Advanced Encryption Standard) с 256-битным ключом в режиме EAX. Режим EAX обеспечивает одновременно конфиденциальность и целостность данных благодаря встроенной аутентификации.
- Безопасное управление ключами: Для шифрования сеансового ключа AES используется асимметричный алгоритм RSA с длиной ключа 4096 бит. Это позволяет безопасно передавать и хранить сеансовые ключи.
- Защита приватного ключа: Приватный ключ RSA шифруется с помощью пароля пользователя, используя Argon2 — один из самых надёжных алгоритмов для хеширования паролей, устойчивый к атаке методом перебора.
- Безопасное удаление исходных файлов: Для предотвращения восстановления удалённых файлов используется утилита srm, которая перезаписывает данные несколькими проходами.
- Удобство использования: Скрипт автоматически создаёт необходимые директории и ключи, предоставляет меню для выбора действий и работает с директориями рекурсивно.
Перейдём к подробному описанию функций, используемых в скрипте.
- secure_delete(file_path):
- Назначение: Безопасное удаление файла по заданному пути с использованием утилиты srm.
- Как работает:
- Проверяет наличие srm в системе.
- Вызывает команду srm с параметрами -v (verbose), -s (secure mode) для удаления файла.
- Обрабатывает возможные ошибки и выводит сообщения о результате операции.
- encrypt_private_key(private_key, password):
- Назначение: Шифрование приватного ключа RSA с использованием пароля пользователя.
- Как работает:
- Генерирует случайную соль размером 16 байт.
- Преобразует пароль в байты.
- Использует Argon2 для получения производного ключа из пароля и соли.
- Шифрует приватный ключ с помощью AES в режиме EAX.
- Возвращает объединённые данные: соль, nonce, тег аутентификации и шифртекст.
- decrypt_private_key(encrypted_data, password):
- Назначение: Расшифровка приватного ключа RSA с использованием пароля пользователя.
- Как работает:
- Извлекает соль, nonce, тег и шифртекст из зашифрованных данных.
- Преобразует пароль в байты.
- Использует Argon2 для восстановления производного ключа.
- Расшифровывает приватный ключ с помощью AES в режиме EAX.
- Обрабатывает возможные ошибки, связанные с неверным паролем или повреждёнными данными.
- generate_keys():
- Назначение: Генерация новой пары ключей RSA.
- Как работает:
- Использует функцию RSA.generate с длиной ключа 4096 бит для создания приватного ключа.
- Получает соответствующий публичный ключ с помощью метода publickey().
- save_keys(encrypted_private_key, public_key):
- Назначение: Сохранение зашифрованного приватного ключа и публичного ключа в файлы.
- Как работает:
- Определяет пути для сохранения ключей.
- Записывает зашифрованный приватный ключ в файл private_key.bin.
- Записывает публичный ключ в файл public_key.pem.
- Устанавливает права доступа на файлы ключей.
- load_public_key():
- Назначение: Загрузка публичного ключа из файла.
- Как работает:
- Читает содержимое файла public_key.pem.
- Импортирует ключ с помощью RSA.import_key.
- encrypt_file(file_path, public_key):
- Назначение: Шифрование файла с использованием публичного ключа RSA.
- Как работает:
- Читает данные из файла.
- Генерирует случайный сеансовый ключ AES.
- Шифрует данные файла с помощью AES в режиме EAX.
- Шифрует сеансовый ключ с помощью публичного ключа RSA.
- Сохраняет зашифрованные данные и метаданные в новый файл с расширением .enc.
- Безопасно удаляет исходный файл.
- decrypt_file(file_path, private_key):
- Назначение: Расшифровка зашифрованного файла с использованием приватного ключа RSA.
- Как работает:
- Читает зашифрованный сеансовый ключ, nonce, тег и шифртекст из файла.
- Расшифровывает сеансовый ключ с помощью приватного ключа RSA.
- Расшифровывает данные файла с помощью AES в режиме EAX.
- Сохраняет расшифрованные данные в исходный файл (убирая расширение .enc).
- Безопасно удаляет зашифрованный файл.
- decrypt_by_path(path, private_key):
- Назначение: Расшифровка всех зашифрованных файлов по заданному пути.
- Как работает:
- Проверяет, является ли путь файлом или директорией.
- Если файл имеет расширение .enc, вызывает decrypt_file.
- Если директория, рекурсивно обходит все файлы и расшифровывает соответствующие.
- secure_delete_private_key():
- Назначение: Безопасное удаление приватного ключа из системы.
- Как работает:
- Проверяет наличие файла приватного ключа.
- Вызывает secure_delete для удаления файла.
- Выводит сообщение о результате операции.
- main():
- Назначение: Основная функция, управляющая логикой программы.
- Как работает:
- Проверяет наличие ключей. Если их нет, предлагает создать мастер-пароль и генерирует ключи.
- Если ключи существуют, предлагает пользователю выбрать действие: шифрование, расшифровка или удаление приватного ключа.
- В зависимости от выбора, вызывает соответствующие функции и обрабатывает ввод пользователя.