Создай свой VPN. Безопасное использование интернета
Шрифт:
from cryptography.hazmat.primitives import padding
import os
def encrypt_message(message, key):
backend = default_backend
iv = os.urandom(16) # Инициализирующий вектор должен быть уникальным для каждого сообщения
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
encryptor = cipher.encryptor
padder = padding.PKCS7(128).padder # Для дополнения сообщения до кратности блоку
padded_data = padder.update(message) + padder.finalize
ciphertext = encryptor.update(padded_data) + encryptor.finalize
return iv + ciphertext
def decrypt_message(ciphertext, key):
backend = default_backend
iv = ciphertext[:16] #
ciphertext = ciphertext[16:] # Оставшаяся часть – собственно шифротекст
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
decryptor = cipher.decryptor
padded_plaintext = decryptor.update(ciphertext) + decryptor.finalize
unpadder = padding.PKCS7(128).unpadder
plaintext = unpadder.update(padded_plaintext) + unpadder.finalize
return plaintext
# Пример использования:
message = b"Hello, world!"
key = os.urandom(32) # Генерируем случайный 256-битный ключ
ciphertext = encrypt_message(message, key)
print("Зашифрованное сообщение:", ciphertext.hex)
plaintext = decrypt_message(ciphertext, key)
print("Расшифрованное сообщение:", plaintext.decode)
```
Этот код использует AES в режиме CBC (Cipher Block Chaining) для шифрования и дешифрования сообщения. Он также использует PKCS7 для дополнения сообщения до кратности размеру блока. Обратите внимание, что в этом примере используется генерация случайного ключа и инициализирующего вектора с помощью `os.urandom`.
Давайте разберем код пошагово:
1. Импорт необходимых модулей:
– Мы импортируем необходимые модули из библиотеки `cryptography`: `Cipher` для создания объекта шифра, `algorithms` для выбора алгоритма шифрования (в данном случае AES), `modes` для выбора режима шифрования (в данном случае CBC), `padding` для работы с дополнением сообщения, и `default_backend` для выбора бэкенда по умолчанию.
– Также мы импортируем модуль `os`, чтобы использовать функцию `urandom` для генерации случайных данных.
2. Функция `encrypt_message`:
– Функция принимает сообщение и ключ в качестве аргументов.
– Генерируется случайный инициализирующий вектор (IV) длиной 16 байт.
– Создается объект шифра AES в режиме CBC с заданным ключом и IV.
– Создается объект паддинга PKCS7 для дополнения сообщения до кратности размеру блока (128 бит).
– Сообщение дополняется и шифруется с помощью AES.
– Возвращается IV вместе с зашифрованным текстом.
3. Функция `decrypt_message`:
– Функция принимает зашифрованный текст и ключ в качестве аргументов.
– IV извлекается из шифротекста.
– Создается объект шифра AES в режиме CBC с заданным ключом и IV.
– Расшифровывается зашифрованный текст с помощью AES.
– Применяется обратное дополнение PKCS7 к расшифрованному тексту.
– Возвращается расшифрованный текст.
4. Пример использования:
– Создается случайное сообщение `b"Hello, world!"`.
– Генерируется случайный ключ длиной 32 байта (256 бит).
– Сообщение шифруется с использованием ключа.
– Зашифрованный текст выводится на экран в шестнадцатеричном формате.
– Зашифрованный текст дешифруется с использованием того же ключа.
– Расшифрованный текст выводится на экран.
Библиотека `cryptography` – это библиотека на языке Python, которая предоставляет высокоуровневые криптографические примитивы для обеспечения безопасности данных. Она предоставляет удобный интерфейс для шифрования, хеширования, генерации случайных чисел, а также других криптографических операций.
`cryptography` стремится предоставить простой и безопасный способ выполнения криптографических операций в Python, используя лучшие практики безопасности и алгоритмы шифрования. Она является одной из наиболее популярных библиотек криптографии для Python и широко используется для разработки безопасных приложений и систем.
Эта библиотека предоставляет высокоуровневые API для многих криптографических операций, что делает ее очень удобной в использовании даже для разработчиков без глубоких знаний криптографии. Она также обеспечивает нативную поддержку для многих алгоритмов шифрования и хеширования, что позволяет выбирать наиболее подходящий алгоритм для конкретной задачи.
Алгоритм RSA (Rivest–Shamir–Adleman) является одним из самых распространенных асимметричных алгоритмов шифрования. В отличие от симметричного шифрования, где для шифрования и дешифрования используется один и тот же ключ, в асимметричном шифровании используется пара ключей: публичный и приватный.
1. Публичный ключ:
– Публичный ключ используется для шифрования данных.
– Он может быть свободно распространен и доступен для всех.
– Публичный ключ обычно используется для шифрования секретной информации перед ее отправкой получателю.
2. Приватный ключ:
– Приватный ключ используется для дешифрования данных, зашифрованных с использованием соответствующего публичного ключа.
– Этот ключ должен храниться в тайне и быть известным только владельцу.
– Приватный ключ обеспечивает возможность дешифрования зашифрованных данных и доступ к оригинальной информации.
Процесс шифрования с использованием алгоритма RSA следующий:
1. Получатель генерирует пару ключей: публичный и приватный.
2. Он распространяет свой публичный ключ, а приватный ключ остается в секрете.