Криптография в Python - пошаговая реализация
Хотите попробовать криптографию на Python? В детстве я любил читать книги о том, как зашифровать и расшифровать секретные сообщения. Итак, я предлагаю вам несколько интересных реализаций криптографии на Python. Давайте начнем.
Что такое криптография?
Криптография защищает данные и переписку с помощью кодов. Таким образом, она может быть интерпретирована и доступна только определенным лицам, которым предназначена информация.
Механизмы шифрования знаний берут свое начало в математических принципах криптографии. И ряд основанных на правилах формул в качестве алгоритмов преобразования сообщений таким образом, чтобы их невозможно было расшифровать.
Эти алгоритмы генерируют криптографические ключи, цифровую подпись, аутентификацию для защиты данных, просмотр веб-страниц в Интернете и конфиденциальные транзакции, такие как транзакции по кредитным и дебетовым картам.
Каковы особенности хороших алгоритмов криптографии?
- Конфиденциальность: информация доступна только предполагаемому пользователю и никому другому.
- Полнота: информация не может быть изменена между отправителем и предполагаемым получателем при хранении или передаче без какого-либо дополнения к обнаруживаемой информации.
- Не отклонение: в более поздний момент создатель / отправитель данных не отклоняет свое намерение отправить информацию.
- Аутентификация: подтверждает личность отправителя и получателя. Детали проверяются, а также место назначения / происхождения.
Типы криптографии
- Симметричный ключ: это схема шифрования, в которой отправитель и получатель сообщений используют один универсальный ключ для шифрования и дешифрования сообщений. Схемы с симметричным ключом быстрее и проще, но проблема в том, что для безопасного использования отправитель и получатель должны где-то поменять местами ключ. Метод шифрования данных (DE) - наиболее распространенная система шифрования с симметричным ключом.
- Функции хеширования: в этом алгоритме не используются никакие ключи. Хеш-значение фиксированной длины вычисляется в соответствии с обычным текстом, что затрудняет получение текстового содержимого. Хеш-функции используются многими операционными системами для шифрования паролей.
- Асимметричный ключ: информация зашифровывается и дешифруется с помощью пары ключей. Для шифрования используется открытый ключ, а для дешифрования - закрытый. Закрытый ключ и открытый ключ разделены. И если кто-то знает открытый ключ, предполагаемый получатель расшифрует его только потому, что он сам знает закрытый ключ.
Реализация криптографии на Python с FERNET
Фреймворк, который я впервые представлю сегодня, называется Fernet. Это метод шифрования с симметричным ключом.
1. Установите FERNET
Мы можем просто использовать Python pip для установки модуля FERNET в нашей системе:
pip install cryptography
from cryptography.fernet import Fernet
2. Создайте ключи шифрования.
Мы можем использовать функцию Фернет напрямую:
key = Fernet.generate_key()
Мы также можем создать свой собственный ключ, используя функцию random
import base64
import os
base64.urlsafe_b64encode(os.urandom(32))
А затем мы вызовем функцию FERNET с нашим key:
f = Fernet(key)
3. Шифрование ваших данных
Теперь мы готовы зашифровать наши данные:
token = f.encrypt(b"Meet me at 9pm. The bus stop. Bring the case.")
print(token)
Как видно из полученного токена:
b'gAAAAABfw08v4HVeS3X4WzIEU3NcIfGUCoFQ82XTNPSipSj0UGlYK8mljcDHzubXPN4yhyF3gAANzB5829rQ955GX-t52pg97DLnfhofJKLWvuGIAnUFRVKOfvQggn7VQPbaaciVkS1R'
Без ключа приведенные выше данные полностью неразборчивы. Таким образом, злоумышленник, пытающийся получить информацию, застрянет без ключа.
4. Использование паролей для криптографии в Python
Мы также можем использовать определенные пароли вместо сохранения случайно сгенерированных токенов.
Итак, для этого нам нужно углубиться в примитивы, что немного опасно и может использоваться неправильно.
Они требуют принятия решений и глубокого знания действующих криптографических концепций.
Но следуйте приведенному ниже коду, и все будет в порядке:
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
Теперь мы указываем пароль и генерируем случайную последовательность байтов:
password = b"journaldev"
salt = os.urandom(16)
print(salt)
что дает нам:
b'\x12\x03\xb4\xeaN\xb0\x19\x98\x83\xb42\xe0\xa71\xfb\xd5'
Затем мы используем kdf для итерации 100k раз с использованием алгоритма хеширования, такого как SHA256, для получения ключа:
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=100000,
)
Нам нужно использовать этот ключ для шифрования и дешифрования.
key = base64.urlsafe_b64encode(kdf.derive(password))
print(key)
дает нам:
b'hjguwTLr2E2zIRHrI8a0dDXBSRel3YoKSx2uP5ruzX0='
5. Расшифровка текста
Как только получатель получит сообщение, расшифровать текст будет несложно. Итак, вы начинаете с ввода ключа в объект Fernet и используете функцию decrypt(), как показано ниже:
f = Fernet(#enter your key here)
f.decrypt(token)