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

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

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

Нічний читач

432Прочитань
21Автори
11Читачі
Підтримати
На Друкарні з 14 липня

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

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

  • Початок вивчення веб-розробки: Нюанси, які важливо врахувати

    Початок вивчення веб-розробки може бути захоплюючим і вигідним переживанням, але важливо бути готовим до вивчення та розвитку на протязі всієї своєї кар'єри. Необхідно регулярно оновалювати свої знання та практикуватись, і лише так можна досягнути успіху у цій захоплюючій сфері.

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

    Програмування
  • Mash Script: Оголошення функцій

    Ця публікація охоплює основи роботи з функціями в мові програмування Mash Script: оголошення, використання опціональних параметрів, повернення значень, продвинуту типізацію та створення анонімних функцій.

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

    Mash Script
  • Найбільш оплачувані професії в Айті 2024

    Ринок IT в Україні динамічно розвивається, що призводить до зростання попиту на фахівців у цій галузі, а також до збільшення їхніх зарплат.

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

    It

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

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

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

  • Початок вивчення веб-розробки: Нюанси, які важливо врахувати

    Початок вивчення веб-розробки може бути захоплюючим і вигідним переживанням, але важливо бути готовим до вивчення та розвитку на протязі всієї своєї кар'єри. Необхідно регулярно оновалювати свої знання та практикуватись, і лише так можна досягнути успіху у цій захоплюючій сфері.

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

    Програмування
  • Mash Script: Оголошення функцій

    Ця публікація охоплює основи роботи з функціями в мові програмування Mash Script: оголошення, використання опціональних параметрів, повернення значень, продвинуту типізацію та створення анонімних функцій.

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

    Mash Script
  • Найбільш оплачувані професії в Айті 2024

    Ринок IT в Україні динамічно розвивається, що призводить до зростання попиту на фахівців у цій галузі, а також до збільшення їхніх зарплат.

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

    It