Друкарня від WE.UA

Криптографія у Python. Частина 1. Що таке симетричне шифрування та як його реалізувати у коді?

Всіх вітаю! У цій статті ми розберемося як зашифрувати та дешифрувати текст за допомогою бібліотеки cryptography у Python та оглянемо код таких програм.

Встановлення

Windows:

pip install cryptography

MacOS:

pip3 install cryptography

Linux:

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. До зустрічі у нових частинах! Дякую за увагу!

Статті про вітчизняний бізнес та цікавих людей:

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Magnifique numérique
Magnifique numérique@nocturnal_reader we.ua/nocturnal_reader

Нічний читач

54Довгочити
655Прочитання
18Підписники
Підтримати
На Друкарні з 14 липня

Більше від автора

  • Клас itemgetter() у модулі operator

    Всіх вітаю! У даній статті ми продовжимо тему спеціальних властивостей словників у Python. На цей раз ми поговоримо про модуль operator та його клас itemgetter(), яка дозволяє працювати зі списками та словниками у Python.

    Теми цього довгочиту:

    Програмування
  • Метод split() у Python

    Всіх вітаю! Сьогодні ми розглянемо метод split() у Python та побачимо, як використовувати її на прикладах.

    Теми цього довгочиту:

    Програмування
  • Створюємо стовпчикові графіки за допомогою plotly

    Всіх вітаю! У цій статті пропоную вам зануритися у графіки та візуалізацію на Python за допомогою plotly. На цей раз ми втілимо графік прослуховувань різних реп виконавців за місяць та графік з оцінками деяких альбомів за сайтом AOTY.

    Теми цього довгочиту:

    Програмування

Це також може зацікавити:

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити: