crypto/README.md

159 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

***
# Шифрование/дешифрование с использованием RSA ключей (закрытый и открытый ключи).
## Описание модулей:
### **1. Генерация и сохранение ключей**
Класс RSAKeyPair предназначен для генерации и сохранения пары ключей RSA (приватного и публичного). Вот подробное описание его работы и принципа функционирования:
▎Описание класса RSAKeyPair
1. Инициализация:
• Конструктор класса (__init__) принимает два параметра: имена файлов для сохранения приватного и публичного ключей.
• Он инициализирует атрибуты для хранения ключей и имен файлов.
2. Генерация приватного ключа:
• Метод generate_private_key создает приватный ключ RSA с использованием алгоритма RSA с длиной ключа 2048 бит и публичным экспонентом 65537.
• Этот метод использует библиотеку cryptography для генерации ключа.
3. Генерация публичного ключа:
• Метод generate_public_key извлекает публичный ключ из ранее сгенерированного приватного ключа.
• Если приватный ключ еще не был сгенерирован, метод вызывает исключение ValueError.
4. Сохранение приватного ключа:
• Метод save_private_key сохраняет приватный ключ в указанный файл в формате PEM без шифрования.
• Если приватный ключ не был сгенерирован, метод вызывает исключение ValueError.
5. Сохранение публичного ключа:
• Метод save_public_key сохраняет публичный ключ в указанный файл в формате PEM.
• Если публичный ключ не был сгенерирован, метод вызывает исключение ValueError.
6. Генерация и сохранение ключей:
• Метод generate_and_save_keys проверяет, существуют ли файлы для приватного и публичного ключей. Если оба файла отсутствуют, он генерирует приватный ключ, сохраняет его, затем генерирует публичный ключ и также сохраняет его.
• Если файлы уже существуют, метод просто выводит сообщение в консоль и не вызывает исключения.
▎Принцип работы
1. Создание экземпляра класса: Пользователь создает экземпляр класса RSAKeyPair, указывая файлы для сохранения ключей.
2. Генерация ключей: Пользователь вызывает метод generate_and_save_keys, который проверяет наличие файлов. Если они не существуют, вызываются методы для генерации и сохранения ключей.
3. Работа с файлами: Приватный и публичный ключи сохраняются в файлы в формате PEM, что позволяет легко использовать их в других приложениях или библиотеках.
4. Обработка ошибок: Класс обрабатывает случаи, когда попытка сохранить ключи осуществляется до их генерации, или когда файлы уже существуют, что делает его удобным для использования в различных сценариях.
Таким образом, класс RSAKeyPair предоставляет простой интерфейс для работы с RSA-ключами, включая их генерацию и сохранение в файлы.
### **2. Шифрование**
Класс RSAEncryptor предназначен для шифрования сообщений с использованием открытого ключа RSA. Он загружает открытый ключ из файла и предоставляет метод для шифрования сообщений. Шифрование выполняется с использованием схемы OAEP (Optimal Asymmetric Encryption Padding) с хешированием SHA-256.
▎Принцип работы
1. Инициализация:
• Класс RSAEncryptor инициализируется с именем файла, содержащим открытый ключ.
В методе init вызывается функция load_public_key, которая загружает открытый ключ из указанного файла.
2. Загрузка открытого ключа:
• Метод load_public_key открывает файл с открытым ключом, считывает его содержимое и десериализует его в объект открытого ключа RSA с помощью функции serialization.load_pem_public_key.
3. Шифрование сообщения:
• Метод encrypt_message принимает строку (сообщение) в качестве параметра.
• Сообщение кодируется в байты и затем шифруется с использованием открытого ключа и схемы OAEP.
• OAEP использует MGF1 (Mask Generation Function) с алгоритмом SHA-256 для обеспечения безопасности шифрования.
• Защищенное сообщение затем кодируется в Base64 для удобства передачи и хранения.
4. Возврат зашифрованного сообщения:
• Метод возвращает зашифрованное сообщение в виде строки, закодированной в Base64.
▎Пример использования
~~~ python
# Создание экземпляра RSAEncryptor
encryptor = RSAEncryptor('path/to/public_key.pem')
# Шифрование сообщения
encrypted_message = encryptor.encrypt_message('Hello, World!')
print(encrypted_message)
~~~
▎Замечания
• Для работы данного класса необходимо, чтобы файл с открытым ключом был доступен и содержал корректный PEM-формат.
• RSA обычно используется для шифрования небольших объемов данных, поэтому для больших сообщений может потребоваться использование симметричного шифрования (например, AES) в сочетании с RSA для безопасной передачи симметричного ключа.
### **3. Расшифрование**
Класс RSADecryptor предназначен для расшифровки сообщений, зашифрованных с использованием алгоритма RSA. Он загружает закрытый ключ из файла и предоставляет метод для расшифровки сообщений, которые были зашифрованы с использованием схемы OAEP (Optimal Asymmetric Encryption Padding) с хешированием SHA-256.
▎Принцип работы
1. Инициализация:
• Класс RSADecryptor инициализируется с именем файла, содержащим закрытый ключ.
В методе init вызывается функция load_private_key, которая загружает закрытый ключ из указанного файла.
2. Загрузка закрытого ключа:
• Метод load_private_key открывает файл с закрытым ключом, считывает его содержимое и десериализует его в объект закрытого ключа RSA с помощью функции serialization.load_pem_private_key.
• Важно, чтобы файл содержал закрытый ключ в формате PEM.
3. Расшифровка сообщения:
• Метод decrypt_message принимает строку (зашифрованное сообщение) в качестве параметра.
• Зашифрованное сообщение декодируется из Base64 в байты.
• Затем сообщение расшифровывается с использованием закрытого ключа и схемы OAEP.
• OAEP использует MGF1 (Mask Generation Function) с алгоритмом SHA-256 для обеспечения безопасности расшифровки.
• Расшифрованное сообщение возвращается в виде строки.
4. Возврат расшифрованного сообщения:
• Метод возвращает расшифрованное сообщение как строку.
▎Пример использования
~~~ python
# Создание экземпляра RSADecryptor
decryptor = RSADecryptor('path/to/private_key.pem')
# Расшифровка сообщения
decrypted_message = decryptor.decrypt_message(encrypted_message)
print(decrypted_message)
~~~
▎Замечания
• Для работы данного класса необходимо, чтобы файл с закрытым ключом был доступен и содержал корректный PEM-формат.
• При использовании закрытого ключа важно обеспечить его безопасность, чтобы предотвратить несанкционированный доступ к данным.
• RSA обычно используется для расшифровки небольших объемов данных, поэтому для больших сообщений может потребоваться использование симметричного шифрования (например, AES) в сочетании с RSA для безопасной передачи симметричного ключа.