Всіх вітаю! У цій статті ми розберемося як зашифрувати та дешифрувати текст за допомогою бібліотеки cryptography у Python та оглянемо код таких програм.
Встановлення
Windows:
pip install cryptographyMacOS:
pip3 install cryptographyLinux:
pip install cryptographyТеорія
Що таке ключ шифрування?
Ключ — це такий набір послідовностей, який має залишатися прихованим та може допомогти зашифрувати та дешифрувати дані. Насправді роль ключа у кожному виді шифрування різна.
Ввважаю доречним створити невеличку історію для пояснення теорії по ходу її вивчення. У нас є два друга — Джош та Патрік. Вони хочуть почати спілкуватися зашифрованими повідомленнями, але як їм зашифровувати та розшифровувати свої повідомлення? Ось тут на допомогу нашим друзям і приходить ключ. Якраз-таки за допомогою нього і можливе шифрування та розшифрування.
Принцип симетричного шифрування
Конкретно у першій частині статті ми будемо використовувати спеціальний алгоритм шифрування, який називається fernet. Даний алгоритм належить до симетричних алгоритмів шифрування, тобто це такі алгоритми, які для шифрування та дешифрування використовують один і той самий ключ. У підсумку виходить так, що будь-хто, знаючи ключ, зможе шифрувати та дешифрувати повідомлення.
Тепер продовжимо нашу історію для кращого розуміння матеріалу. Джош та Патрік обмінюються зашифрованими повідомленнями між собою, спілкуюючись на різні теми. Що Джош, що Патрік знають ключ, тому за допомогою нього вони легко шифрують та дешифрують свої повідомлення. При цьому слід зазначити, що ключ всього один. Тобто за допомогою всього одного ключа Джош може розшифровувати повідомлення від Патріка та зашифровувати свої — все те саме може й Патрік по відношенню до Джоша.
Використання алгоритму Fernet як прикладу симетричного шифрування
Шифрування даних
Отже, перейдемо від слів до справи. Почнімо нашу програму з рядка імпортування бібліотеки. Після загальної назви бібліотеки ми через крапку вказуємо пакет даної бібліотеки (fernet), який хочемо імпортувати:
from cryptography.fernet import FernetДалі генеруємо ключ, який повинен зберігатися у секреті, так як за допомогою нього можна легко дешифрувати повідомлення:
secret_key = Fernet.generate_key()Створюємо екземпляр класу Fernet():
fernet = Fernet(secret_key)Створюємо функцію encryptor(), яка приймає рядок у якості параметра:
def encryptor(string):У тілі функції спершу конвертуємо рядковий тип даних у так званий байт рядок, бо функція encrypt() приймає саме байт рядок. Обов’язково також треба закодувати його у utf-8:
byte_string = bytes(string, "utf-8")У змінній encrypted використовуємо метод encrypt() з переданим байт рядком щойноствореного об’єкту fernet для шифрування повідомлень:
encrypted = fernet.encrypt(byte_string)Повертаємо зашифроване повідомлення:
return encryptedУ кінці-кінців створюємо повідомлення, яке хочемо зашифрувати та виводимо результат функції:
message = "This message will be encrypted"
print(encryptor(message))Ось повний код програми:
from cryptography.fernet import Fernet
secret_key = Fernet.generate_key()
def encryptor(string):
byte_string = bytes(string, "utf-8")
fernet = Fernet(secret_key)
encrypted = fernet.encrypt(byte_string)
return encrypted
message = "This message will be encrypted"
print(encryptor(message))Результат нашої програми вийшов оcь таким:
b'gAAAAABpDb83zDfzoByRPDUib7pDkr4RPoPr8DwNcIm64pgQ2zXBX64BMkdsmeiTSBrLB-vRd_X8pzHyfWz1O73tIYErd2V3_YBpmpLvFKtQHGe9wUFiR5c='Дешифрування даних
Тепер перейдемо до частини із розшифруванням. У бібліотеці cryptography для розшифрування даних існує функція decrypt(), яка приймає зашифровані дані та дешифрує їх.
Зробимо декілька змін у нашому попередньому коді. Спершу запишемо результат роботи функції encryptor() у змінну:
message = "This message will be encrypted"
encrypted_message = encryptor(message)
print(f"Encrypted message:\n"
f"{encrypted_message}")Далі створимо функцію decrypter(), у якій не буде рядка з кновертуванням у байт рядок та буде застосовуватися функція decrypt():
def decrypter(byte_string):
fernet = Fernet(secret_key)
decrypted = fernet.decrypt(byte_string)
return decryptedДалі так само поміщаємо результат функції decrypter() у змінну та виводимо результат коду:
decrypted_message = decrypter(encrypted_message)
print(f"\n"
f"Decrypted message:\n"
f"{decrypted_message}")Таким чином, повний код вийшов наступним:
from cryptography.fernet import Fernet
secret_key = Fernet.generate_key()
fernet = Fernet(secret_key)
def encryptor(string):
byte_string = bytes(string, "utf-8")
encrypted = fernet.encrypt(byte_string)
return encrypted
message = "This message will be encrypted"
encrypted_message = encryptor(message)
print(f"Encrypted message:\n"
f"{encrypted_message}")
def decrypter(byte_string):
decrypted = fernet.decrypt(byte_string)
return decrypted
decrypted_message = decrypter(encrypted_message)
print(f"\n"
f"Decrypted message:\n"
f"{decrypted_message}")Маємо ось такий результат:
Encrypted message:
b'gAAAAABpDcXbrzYCdJj4aecxYsxEFgjruycSyNct7LcrwS9OgKOIFJpkzMlbeEfMY_sHOGP2okigXcSlFciq1ebkiKQ1NIdMqOqalDVGiRfKf-x927byDH4='
Decrypted message:
b'This message will be encrypted'Висновок
Отже, у цій статті ми познайомилися з деякими теоретичними поняттями у криптографії, та розглянули як зашифровувати та дешифровувати дані у Python за допомогою бібліотеки cryptography. До зустрічі у нових частинах! Дякую за увагу!