Одним из основных средств обеспечения безопасности является криптография. В предыдущей статье я рассказывал про шифрование с помощью Cryptography Python. Сегодня рассмотрим применение библиотеки PyCryptodome Python.
Еще по теме: Обфускация Python используя Pyarmor
Шифрование с помощью PyCryptodome Python
Криптографическая библиотека PyCryptodome (https://pypi.org/project/pycryptodome) поддерживает функции блочного шифрования, поточного шифрования и вычисления хешей. Эта библиотека написан в основном на языке Python, но также, для производительности, содержит элементы на C .
Возможности PyCryptodome Python:
- Основные поддерживаемые блочные шифры (HASH, AES, DES, DES3, IDEA и RC5).
- Режимы аутентифицированного шифрования (GCM, CCM, EAX, SIV и OCB).
- Криптография на эллиптических кривых.
- Генерация ключей Rivest-Shamir-Adleman (RSA) и DSA.
- Улучшенные и более компактные API, включая атрибуты nonce и вектор инициализации (IV) для рандомизации генерации данных.
Nonce — термин, используемый в криптографии, который обозначает произвольное число, используемое только один раз в криптографической операции. Чтобы обеспечить однократное использование, nonce включает метку времени, что означает его действительность только в течение определенного времени.
Для использования библиотеки PyCryptodome с Python 3 выполните команду:
1 |
$ sudo apt-get install build-essential python3-dev |
Или установитe с помощью PIP:
1 |
$ sudo python3 -m pip install pycryptodome |
Для импорта конкретного типа шифра, можно использовать пакет Crypto.Cipher:
1 |
from Crypto.Cipher import [Тип_шифра] |
Пакет Crypto.Cipher содержит алгоритмы для защиты конфиденциальности данных и поддерживает следующие три типа алгоритмов шифрования:
- Симметричные шифры — Все стороны используют один и тот же ключ для шифрования и расшифровки данных. Симметричные шифры обычно очень быстры и могут обрабатывать большие объемы данных.
- Асимметричные шифры — Отправители и получатели используют разные ключи. Отправители шифруют с использованием публичных (несекретных) ключей, в то время как получатели расшифровывают с использованием приватных (секретных) ключей. Асимметричные шифры обычно очень медленные и могут обрабатывать только небольшие объемы данных.
- Гибридные шифры — Вышеперечисленные два типа шифрования могут быть объединены так, чтобы наследовать преимущества обоих. Асимметричное шифрование используется для защиты симметричного ключа с ограниченным сроком службы, и симметричное шифрование (под этим ключом) шифрует фактическое сообщение.
Для инициализации шифра, можем использовать конструктор new:
1 |
new([ключ], [режим], [Вектор IV]) |
В этом методе обязательным параметром является только ключ, и нам нужно учесть, требует ли метод шифрования определенного размера. Возможные режимы: MODE_ECB, MODE_CBC, MODE_CFB, MODE_PGP, MODE_OFB, MODE_CTR и MODE_OPENPGP. Более подробную информацию о режимах можно найти в документации.
Если используется режим MODE_CBC или MODE_CFB, третий параметр (Вектор IV) должен быть инициализирован, что позволяет шифру установить начальное значение. Некоторые шифры могут иметь дополнительные параметры, например AES может задать размер блока и ключа с помощью параметров block_size и key_size.
Библиотека также поддерживает хеш-функции с использованием Crypto.Hash. Вы можете импортировать конкретный тип хеша с помощью следующей инструкции, где hash_type — это значение, которое может быть одной из поддерживаемых хэш-функций: MD5, SHA-1 и SHA-256:
1 |
from Crypto.Hash import [hash_type] |
Для получения контрольной суммы файла, можно использовать хэш-функцию MD5.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from Crypto.Hash import MD5 def get_file_checksum(filename): hash = MD5.new() chunk_size = 8191 with open(filename, 'rb') as file: while True: chunk = file.read(chunk_size) if len(chunk) == 0: break hash.update(chunk) return hash.hexdigest() print('The MD5 checksum is:', get_file_checksum('checksSumFile.py')) |
В данном коде мы используем хеш MD5 для получения контрольной суммы файла. Метод update() устанавливает данные, необходимые для вычисления хэша, а метод hexdigest() генерирует сам хеш. Видно, как хеширование вычисляется блоками или фрагментами информации; мы используем чанки, что делает эту технику более эффективной с точки зрения использования памяти.
Вывод скрипта:
В следующей статье мы продолжим анализировать различные алгоритмы шифрования, а именно алгоритм DES, где блоки имеют длину восемь символов, что часто используется, когда требуется шифрование и дешифрование с одним ключом шифрования.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Библиотеки для обфускации Python
- Асимметричное шифрование Python
- Шифрование и дешифрование в PowerShell