Pycrypto — это модуль Python, предоставляющий криптографические услуги. Модуль Pycrypto представляет собой набор безопасных хэш-функций, таких как RIPEMD160 и SHA256, и различных алгоритмов шифрования, таких как AES, DES, RSA, ElGamal и т. д. Например, AES является быстрым, надежным и фактическим стандартом для симметричного шифрования.
AES-шифрование
Advanced Encryption Standard(AES) — это симметричный блочный шифр.
AES включает в себя три блочных шифра:
- АЭС-128
- АЭС-192
- АЭС-256
AES-128 использует 128-битный ключ для шифрования и дешифрования блока сообщений, AES-192 использует 192-битный ключ, а AES-256 использует 256-битный ключ для шифрования и дешифрования сообщений.
Каждый шифр шифрует и дешифрует данные блоками по 128 бит, используя криптографические ключи на 128, 192 и 256 бит.
Симметричные, также известные как секретный ключ, шифры используют один и тот же ключ для шифрования и дешифрования, поэтому отправитель и получатель должны знать и использовать один и тот же секретный ключ.
Ключи любой длины могут использоваться для защиты конфиденциального и секретного уровней. Для совершенно секретной информации требуются 192-битные или 256-битные ключи.
В этом примере мы увидим шифрование AES и дешифрование 16-байтового текста.
Шаги для создания шифрования и дешифрования в Python
Чтобы использовать шифрование и дешифрование AES в Python, мы должны выполнить следующие шаги.
- Генерация секретного ключа.
- Генерация вектора инициализации.
- Создание шифра AES.
- Зашифровать сообщение с помощью AES.
- Расшифровать сообщение.
Генерация секретного ключа
Шифрование AES требует надежного ключа. Чем сильнее ключ, тем сильнее ваше шифрование. Это, пожалуй, самое слабое звено в цепи. Чтобы сгенерировать секретный ключ, мы будем использовать метод urandom() модуля os.
Функция Python os.urandom() используется для генерации строки случайного размера в байтах, подходящей для криптографического использования, или, можно сказать, этот метод генерирует строку, содержащую случайные символы.
|
1 2 3 4 |
from os import urandom secret_key = urandom(16) print(secret_key) |
Выход
|
1 |
b'I\xff\xd5\xbb3\xae\xd7\xd8\x9c\xf1\xc3}\x8d\xd0*\x1a' |
Итак, наш secret_key сгенерирован. Вы должны сгенерировать надежный ключ для шифрования AES.
Переходим к следующему шагу.
Создание вектора инициализации
Основная цель вектора инициализации — создавать различные зашифрованные данные, чтобы злоумышленник не мог использовать криптоанализ для вывода данных ключа или данных сообщения.
Мы сгенерируем вектор инициализации с помощью функции os.urandom().
|
1 2 3 4 |
from os import urandom iv = urandom(16) print(iv) |
Выход
|
1 |
b"NU\x95c'pfc\xe9\xc0X\x81\xd8\x13\x18(" |
Итак, наш iv сгенерирован.
Вектор инициализации должен быть передан получателю для правильного расшифрования, но его не обязательно держать в секрете. Вместо этого он упаковывается в выходной файл в начале(через 8 байт исходного размера файла), поэтому получатель может прочитать его перед расшифровкой данных.
Создайте шифр AES
Мы создадим шифр AES и будем использовать его для шифрования строки(или набора байтов; данные не обязательно должны быть только текстовыми).
Шифр AES создается в режиме CBC, в котором каждый блок «привязан» к предыдущему блоку в потоке.(Вам не обязательно знать точные детали, если не заинтересованы. Все, что вам нужно знать, это — использовать режим CBC).
Кроме того, для шифрования AES с использованием pycrypto необходимо убедиться, что данные кратны 16 байтам. Заполните буфер, если это не так, и включите размер данных в начале вывода, чтобы получатель мог адекватно расшифровать.
|
1 2 3 4 5 6 7 |
from os import urandom from Crypto.Cipher import AES # For Generating AES Cipher text secret_key = urandom(16) iv = urandom(16) obj = AES.new(secret_key, AES.MODE_CBC, iv) |
В приведенном выше коде мы создали два импортированных модуля.
- urandom
- АЕС
Чтобы сгенерировать объект шифрования AES, мы должны использовать метод AES.new().
Теперь метод AES.new() принимает три параметра.
- secret_key
- AES.MODE.CBC
- iv
AES.MODE.CBC — один из классических режимов работы симметричных блочных шифров.
Классические режимы работы симметричных блочных шифров
Константы модуля для режимов работы, поддерживаемых AES:
- MODE_ECB: Электронная кодовая книга(ECB)
- MODE_CBC: Цепочка шифровальных блоков(CBC)
- MODE_CFB: Шифрование обратной связи(CFB)
- MODE_OFB: Выходная обратная связь(OFB)
- MODE_CTR: режим счетчика(CTR)
- MODE_OPENPGP: режим OpenPGP
- MODE_CCM: счетчик с режимом CBC-MAC(CCM)
- MODE_EAX: режим EAX
- MODE_GCM: режим счетчика Галуа(GCM)
- MODE_SIV: синтетический вектор инициализации(SIV)
- MODE_OCB: Смещенная кодовая книга(OCB)
Зашифровать сообщение с помощью AES
Это последний шаг шифрования AES.
Сначала мы определим сообщение, которое необходимо зашифровать, а затем воспользуемся функцией AES.encrypt().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from os import urandom from Crypto.Cipher import AES # For Generating cipher text secret_key = urandom(16) iv = urandom(16) obj = AES.new(secret_key, AES.MODE_CBC, iv) # Encrypt the message message = 'Lorem Ipsum text' print('Original message is: ', message) encrypted_text = obj.encrypt(message) print('The encrypted text', encrypted_text) |
Выход
|
1 2 |
Original message is: Lorem Ipsum text The encrypted text b'a\xc4+(\xb2\x15\x92\x93\x17\x8c\x01\x8a\xba\xe6\xff5' |
Вот и все. Мы зашифровали сообщение с помощью AES в Python.
Расшифровать сообщение в Python
Для расшифровки требуется ключ, которым были зашифрованы данные. Затем вы должны отправить ключ получателю по защищенному каналу.
Мы будем использовать метод AES decrypt(), чтобы расшифровать зашифрованное сообщение и получить исходный текст.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from os import urandom from Crypto.Cipher import AES # For Generating cipher text secret_key = urandom(16) iv = urandom(16) obj = AES.new(secret_key, AES.MODE_CBC, iv) # Encrypt the message message = 'Lorem Ipsum text' print('Original message is: ', message) encrypted_text = obj.encrypt(message) print('The encrypted text', encrypted_text) # Decrypt the message rev_obj = AES.new(secret_key, AES.MODE_CBC, iv) decrypted_text = rev_obj.decrypt(encrypted_text) print('The decrypted text', decrypted_text.decode('utf-8')) |
Выход
|
1 2 3 |
Original message is: Lorem Ipsum text The encrypted text b'\xc8\x01\x14y\xeb\xb9\xa4#\xd5bQ\xeb\xe0\x00"\t' The decrypted text Lorem Ipsum text |
Вот и все. Получаем исходный текст.
