Пример Pycrypto: шифрование и дешифрование в Python

Pycrypto — это модуль Python, который предоставляет криптографические службы. Полная форма Pycrypto — это Python Cryptography Toolkit. Модуль Pycrypto представляет собой набор как безопасных хэш-функций, таких как RIPEMD160 , SHA256, так и различных алгоритмов шифрования, таких как AES , DES , RSA , ElGamal и т. Д. AES очень быстрый и надежный, и это де-факто стандарт симметричного шифрования.

Шифрование AES

Расширенный стандарт шифрования (AES) — это симметричный блочный шифр.

AES включает три блочных шифра:

  1. AES-128
  2. AES-192
  3. AES-256

AES-128 использует 128-битный ключ для шифрования и дешифрования блока сообщений, в то время как AES- 192 использует длину ключа 192 бит, а AES-256 — длину ключа 256 бит для шифрования и дешифрования сообщений.

Каждый шифр шифрует и дешифрует данные блоками по 128 бит с использованием криптографических ключей 128, 192 и 256 бит. .

Симметричные, или секретные ключи, шифры используют один и тот же ключ для шифрования и дешифрования, поэтому отправитель и получатель должны знать и использовать один и тот же секретный ключ.

Для защиты конфиденциального и секретного уровней можно использовать ключи любой длины. Для совершенно секретной информации требуется длина ключа 192 или 256 бит.

В этом примере мы увидим шифрование AES и дешифрование 16-байтового текста.

Шаги по созданию шифрования и дешифрования в Python

Чтобы использовать шифрование и дешифрование AES в Python, мы должны выполнить следующие шаги.

  1. Создание секретного ключа.
  2. Создание вектора инициализации.
  3. Создание шифра AES.
  4. Зашифровать сообщение с помощью AES
  5. Расшифровать сообщение

Создание секретного ключа

Шифрование 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) 

В приведенном выше коде мы сгенерировали два импортированных модуля.

  1. urandom
  2. AES

Чтобы сгенерировать объект шифра AES, мы должны использовать метод AES.new ().

Теперь метод AES.new () принимает три параметра.

  1. secret_key
  2. AES.MODE.CBC
  3. 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

Оцените статью
nanomode.ru
Добавить комментарий