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

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Mystique Lord
Mystique Lord@nocturnal_reader

Нічний читач

227Прочитань
17Автори
8Читачі
На Друкарні з 14 липня

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

  • Комплексні числа у Python

    Всіх вітаю! У цій невеличкій статті ми дізнаємося як створювати комплексні числа та як працювати з ними. Ми роглянемо два способи створення комплексних чисел та оглянемо декілька функцій з модуля, котрий спеціалізується на роботі з ними.

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

    Програмування
  • Функції isinstance() та issubclass() у Python

    Всіх вітаю! У цьому матеріалі ми розберемо суть вбудованих функцій isinstance() та issubclass() та як ними користуватися у коді.

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

    Програмування
  • Обчислення похибок вимірювань у Python

    Всіх вітаю! У сьогоднішній статті ми створимо програму для обчислення похибок, а саме абсолютної та відносної. Також детально розглянемо код та протестуємо його.

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

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

Вам також сподобається

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

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

Вам також сподобається