Время прочтения: 4 мин.

К сожалению, наши с вами реалии заставляют нас заботится о защите наших данных. И как раз для того, чтобы никакой лишний человек не получил доступ к вашей информации и используется крипто шифрование. В этой статье я расскажу симметричном и асимметричном методах шифрования данных и сравню две библиотеки, использующие эти методы.

Существует множество видов шифрования, но в этой статье мы поговорим о двух — это симметричное и асимметричное шифрование. Сначала рассмотрим симметричное шифрование.

Симметричное шифрование — это всем нам известное шифрование по одному ключу или если можно так выразится — по «паролю». В нём используется всего один сгенерированный ключ как для шифрования, так и для расшифровки. В этом и заключается главная проблема, из-за того, что используется один ключ, его приходится передавать и в процессе его передачи ключ могут перехватить злоумышленники, в этом случае им не составит труда расшифровать отправленное сообщение. Но у данного способа есть и плюс, это его скорость. Поэтому он подойдёт для шифровки не очень важных данных.

Перейдём к рассмотрению Асимметричного шифрования.

Что такое алгоритм Асимметричного шифрования? Как говорит нам википедия – это криптографический алгоритм с открытым ключом.

Как это всё работает в жизни?

Предположим, Вася хочет передать Пете зашифрованное сообщение. Вася создаёт пару ключей — приватный и публичный. Сначала генерируется приватный, а после, из него уже создаётся публичный ключ. Далее, Вася передаёт Пете публичный ключ, с помощью которого Петя шифрует сообщение. Особенность публичного ключа в том, что зашифрованное с помощью него сообщение невозможно расшифровать, используя тот же публичный ключ, для этого требуется приватный ключ, который в свою очередь имеет только получатель сообщения, в нашем случае Вася. Таким образом, даже если злоумышленники перехватят публичный ключ и зашифрованное с помощью него сообщение, они всё равно не смогут его расшифровать, не имея приватного ключа, который всё это время лежал в защищённом месте и никому не передавался.

Существуют несколько библиотек позволяющих шифровать данные при помощи асимметричного шифрования, рассмотрим парочку из них.

Сначала рассмотрим библиотеку RSA. Для начала загрузим библиотеку:

pip install rsa

Далее перейдём к генерации ключей:

import rsa

	(public_key, privat_key) = rsa.newkeys(512, poolsize=4)

	with open('privat_key.txt', "w") as priv_key:
   		priv_key.write(str(privkey))

	with open('public_key.txt', "w") as priv_key:
   		priv_key.write(str(public_key))

Тут всё очень просто, при помощи функции newkeys (нужное кол-во бит) генерируем пару ключей устанавливая нужное количество бит, их количество переделает стойкость ключа, также нужно учитывать, что чем большее количество бит используется, тем большее время занимает их генерация (у меня генерация ключей на 4096 бит занимает примерно 82 секунды). Для оптимизации процесса генерации можно использовать несколько процессов одновременно установив значение poolsize равное количеству потоков процессора. И записываем ключи в файлы, после чего можем передать публичный ключ вашему собеседнику.

И наконец зашифруем, и расшифруем сообщение:

import rsa

	data = 'Это зашифрованное сообщение'.encode('utf8')

	with open("public_key.txt") as public_key:
		pubkey = public_key.read()
	encrypt_data = rsa.encrypt(data, pubkey)

	with open("privat_key.txt") as privat_key:
		privkey = privat_key.read()
	decrypt_data = rsa.decrypt(encrypt_data, privkey)

	print(decrypt_data.decode('utf8'))

Сначала мы кодируем наше сообщение в UTF-8, так как модуль rsa работает только с байтами.

После, используя уже сгенерированный публичный ключ, шифруем наше сообщение при помощи функции encrypt(). Далее это сообщение отправляется и получатель может расшифровать его при помощи приватного ключа и функции decrypt(). Также не забудем декодировать сообщение.

Теперь рассмотрим библиотеку Сryptography. Она имеет практически идентичный синтаксис:

from cryptography.fernet import Fernet

cipher_key = Fernet.generate_key()

cipher = Fernet(cipher_key)

text = b'My super secret message'

encrypted_text = cipher.encrypt(text)

decrypted_text = cipher.decrypt(encrypted_text)
print(decrypt_text)

Я не стану расписывать как работает данный код, так как он очень схож на синтаксис библиотеки RSA.Лучше давайте сразу перейдём к сравнению данных библиотек.

Эти библиотеки очень схожи, но есть и существенные отличия. Первое — это возможность защиты данных, в RSA, как вы помните, есть возможность настраивать битность сгенерированных ключей от 128 до 4096, но в cryptography нет такой возможности и ключи по умолчанию имеют биность равную 128, что позволит быстрее взломать установленный шифр.

Второе — это скорость, шифровка и расшифровка сообщения «My super secret message» у  RSA заняло 0.02894 сек., а у cryptography 0.07991 сек.

Третье — это функциональность. Тут бесспорно выигрывает cryptography. Она имеет в своём функционале не только методы асимметричного шифрования, но описанного выше симметричного. Так что скудный функционал библиотеки RSA не идёт ни в какое сравнение.

В итоге можно сказать, что выбор библиотеки зависит лишь от ваших потребностей. RSA быстра и позволяет надёжно зашифровать данные, но мало функциональна, а cryptography в сою очередь медленней, но в разы функциональней. Так или иначе обе эти библиотеки помогут зашифровать и защитить ваши данные от глаз нежелательных личностей, а в нужный вам момент открыть их.

Если этот материал вам понравился и был полезен, ставьте лайки, а также буду рад обратной связи в комментариях.

https://github.com/ZizaGrand1/crypto/tree/main