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

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

  • Вітаємо з Різдвом Христовим!

    Друкарня та платформа WE.UA вітають всіх наших читачів та авторів зі світлим святом Різдва! Зичимо всім українцям довгожданого миру, міцного здоровʼя, злагоди, родинного затишку та втілення всього доброго і прекрасного, чого вам побажали колядники!

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

    Різдво
  • Каблучки – прикраси, які варто купувати

    Ювелірні вироби – це не тільки спосіб витратити гроші, але і зробити вигідні інвестиції. Бо вартість ювелірних виробів з кожним роком тільки зростає. Тому купуючи стильні прикраси, ви вигідно вкладаєте кошти.

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

    Як Вибрати Каблучку
  • П'ять помилок у виборі домашнього текстилю, які псують комфорт сну

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

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

    Домашній Текстиль
  • Як знайти житло в Києві

    Переїжджаєте до Києва і шукаєте житло? Дізнайтеся, як орендувати чи купити квартиру, перевірити власника та знайти варіанти, про які зазвичай не говорять.

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

    Агентство Нерухомості
  • Як заохотити дитину до читання?

    Як залучити до читання сучасну молодь - поради та факти. Користь читання для дітей - основні переваги. Розвиток дітей - це наше майбутнє.

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

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

Нічний читач

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

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

  • Як перекладати текст на різні мови завдяки deep-translator?

    У цьому матеріалі ми будемо говорити про бібліотеку deep-translator, яка дозволяє перекладати текст на різні мови завдяки різним сервісам перекладу, наприклад, Google перекладач.

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

    Програмування
  • Комплексні числа у Python

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

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

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

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

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

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

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

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

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

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