Pycrypto — это модуль Python, который предоставляет криптографические службы. Полная форма Pycrypto — это Python Cryptography Toolkit. Модуль Pycrypto представляет собой набор как безопасных хэш-функций, таких как RIPEMD160 , SHA256, так и различных алгоритмов шифрования, таких как AES , DES , RSA , ElGamal и т. Д. AES очень быстрый и надежный, и это де-факто стандарт симметричного шифрования.
Шифрование AES
Расширенный стандарт шифрования (AES) — это симметричный блочный шифр.
AES включает три блочных шифра:
- AES-128
- AES-192
- AES-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.
Функция Python os.urandom () используется для генерации строки размера случайных байтов, подходящей для криптографического использования, или мы можем сказать, что этот метод генерирует строку, содержащую случайные символы.
из os import urandomsecret_key = urandom (16) print (secret_key)
Вывод
b'I xff xd5 xbb3 xae xd7 xd8 x9c xf1 xc3} x8d xd0 * x1a '
Итак, наш secret_key был сгенерирован. Вам необходимо создать надежный ключ для шифрования AES.
Перейдем к следующему шагу..
Создание вектора инициализации
Основная цель вектора инициализации — создать различные зашифрованные данные, чтобы злоумышленник не мог использовать криптоанализ для вывода ключевых данных или данных сообщения.
Мы сгенерируем вектор инициализации, используя функцию os.urandom ().
from os import urandomiv = urandom (16) print (iv)
Вывод
b "NU x95c'pfc xe9 xc0X x81 xd8 x13 x18 ("
Итак, наш iv был сгенерирован.
Вектор инициализации должен быть передан получателю для правильного дешифрования, но его не нужно держать в секрете. Он упаковывается в выходной файл в начале (после 8 байтов от исходного размера файла), поэтому получатель может прочитать его перед расшифровкой фактических данных.
Создайте AES шифр
Теперь мы создаем шифр AES и используем его для шифрования строки (или набора байтов; данные не должны быть только текстом).
Шифр AES создается с помощью th Режим CBC, в котором каждый блок «привязан» к предыдущему блоку в потоке. (Вам не обязательно знать точные данные, если вы не заинтересованы. Все, что вам нужно знать, это — использовать режим CBC).
Кроме того, для шифрования AES с использованием pycrypto вы должны убедиться, что длина данных кратна 16 байтам. Заполните буфер, если это не так, и укажите размер данных в начале вывода, чтобы получатель мог адекватно расшифровать.
См. Следующий код.
from os import urandomfrom Crypto.Cipher import AES # Для генерации шифра AES textsecret_key = urandom (16) iv = urandom (16) obj = AES.new (secret_key, AES.MODE_CBC, iv)
В приведенном выше коде мы сгенерировали два импортированных модуля.
- urandom
- AES
Чтобы сгенерировать объект шифра 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 ().
from os import urandomfrom Crypto.Cipher import AES # Для генерации шифра textsecret_key = urandom (16) iv = urandom (16) obj = AES.new (secret_key, AES.MODE_CBC, iv) # Зашифровать сообщение messagemessage = 'Lorem Ipsum text'print (' Исходное сообщение: ', message) encrypted_text = obj.encrypt (message) print ('Зашифрованный текст', encrypted_text)
Вывод
Исходное сообщение это: Lorem Ipsum text Зашифрованный текст b'a xc4 + ( xb2 x15 x92 x93 x17 x8c x01 x8a xba xe6 xff5 '
Вот и все. Мы зашифровали сообщение с помощью AES в Python.
Расшифровать сообщение в Python
Для дешифрования требуется ключ, которым были зашифрованы данные с. Вам необходимо отправить ключ получателю по защищенному каналу.
Мы будем использовать метод decrypt () AES, чтобы расшифровать зашифрованное сообщение и получить обратно наш исходный текст.
from os import urandomfrom Crypto.Cipher import AES # Для генерации шифра textsecret_key = urandom (16) iv = urandom (16) obj = AES.new (secret_key, AES.MODE_CBC, iv) # Зашифровать сообщениеmessage = 'Lorem Ipsum text'print ('Исходное сообщение:', message) encrypted_text = obj.encrypt (message) print ('Зашифрованный текст', encrypted_text) # Расшифровать сообщениеrev_obj = AES.new (secret_key, AES.MODE_CBC, iv) decrypted_text = rev_obj.decrypt (encrypted_text) print ('Расшифрованный текст', decrypted_text.decode ('utf-8'))
Вывод
Исходное сообщение: Lorem Ipsum text Зашифрованный текст b ' xc8 x01 x14y xeb xb9 xa4 # xd5bQ xeb xe0 x00 " t'Зашифрованный текст Lorem Ipsum text
Вот и все. Мы получаем исходный текст.
Итак, вот как вы шифруете и расшифровываете строку в Python.
См. Также
Python hash ()
Python uuid
Генерировать случайное число в Python