RSA – это система криптографии с открытым ключом, разработанная в 1979 году, которая широко используется для обеспечения безопасности передачи данных. Асимметричная криптография имеет два основных применения: аутентификация и конфиденциальность. В статье покажу, как генерировать подписи RSA с помощью PyCryptodome Python.
Еще по теме: Шифрование с помощью PyCryptodome Python
Генерация подписи RSA с помощью PyCryptodome Python
При использовании асимметричной криптографии сообщения можно подписать с помощью закрытого ключа, и затем любой, у кого есть публичный ключ, может проверить, что сообщение было создано кем-то, кто обладает соответствующим закрытым ключом. Это можно объединить с системой проверки подлинности личности, чтобы узнать, какое лицо обладает этим закрытым ключом.
Преимущество асимметричной или открытой криптографии заключается также в том, что она обеспечивает способ убедиться, что сообщение не изменено и остается подлинным. В случае подписей данных отправитель использует свой закрытый ключ для подписи данных, и получатель использует публичный ключ отправителя для его проверки.
В следующем примере мы шифруем и дешифруем с использованием алгоритма RSA через публичные и закрытые ключи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP from Crypto.Hash import SHA256 from Crypto.Signature import PKCS1_v1_5 def generate(bit_size): keys = RSA.generate(bit_size) return keys def encrypt(public_key, data): cipher = PKCS1_OAEP.new(public_key) return cipher.encrypt(data) def decrypt(private_key, data): cipher = PKCS1_OAEP.new(private_key) return cipher.decrypt(data) if __name__ == "__main__": keys = generate(2048) |
Первый шаг при использовании RSA – это генерация пары публичного и закрытого ключей. В приведенном выше коде мы генерируем эту пару ключей с помощью метода generate(), передавая размер ключа в качестве параметра.
Рекомендуется использовать длину ключа не менее 2048 бит.
Затем мы экспортируем публичный ключ с использованием метода publickey() и преобразуем его в формат UTF-8 с помощью метода decode(). PEM – это тип кодирования на основе текста, который часто используется, если нужно поделиться ключом, например, по электронной почте:
1 2 3 4 5 6 7 8 9 |
print("Публичный ключ:") print(keys.publickey().export_key('PEM').decode(), end='\n\n') with open("public.key", 'wb') as file: file.write(keys.publickey().export_key()) print("Закрытый ключ:") print(keys.export_key('PEM').decode()) with open("private.key", 'wb') as file: file.write(keys.export_key('PEM')) |
Мы можем использовать RSA для создания подписи сообщения. Действительная подпись может быть сгенерирована только при наличии закрытого ключа RSA, поэтому проверка возможна с использованием соответствующего публичного ключа:
1 2 3 4 5 6 7 8 9 |
text2cipher = "text2cipher".encode("utf8") hasher = SHA256.new(text2cipher) signer = PKCS1_v1_5.new(keys) signature = signer.sign(hasher) verifier = PKCS1_v1_5.new(keys) if verifier.verify(hasher, signature): print('Подпись действительна!') else: print('Сообщение было подписано неправильным закрытым ключом или изменено') |
Приведенные выше код выполняет проверку подписи, которая работает с публичным ключом.
Затем, мы используем публичный ключ для шифрования и закрытый ключ для дешифрования данных:
1 2 3 4 |
encrypted_data = encrypt(keys.publickey(), text2cipher) print("Зашифрованный текст:", encrypted_data) decrypted_data = decrypt(keys, encrypted_data) print("Расшифрованный текст:", decrypted_data.decode()) |
В следующем примере мы используем асимметричную криптографию для генерации публичных и закрытых ключей, а для шифрования и дешифрования – пакет PKCS1_OAEP из модуля Crypto.PublicKey.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
from Crypto.Cipher import PKCS1_OAEP from Crypto.PublicKey import RSA import sys bit_size = int(sys.argv[1]) key_format = sys.argv[2] message = sys.argv[3] key = RSA.generate(bit_size) print("Генерация публичного ключа....") publicKey = key.publickey().exportKey(key_format) print("Генерация закрытого ключа....") privateKey = key.exportKey(key_format) message = str.encode(message) RSApublicKey = RSA.importKey(publicKey) OAEP_cipher = PKCS1_OAEP.new(RSApublicKey) encryptedMsg = OAEP_cipher.encrypt(message) print('Зашифрованный текст:', encryptedMsg) RSAprivateKey = RSA.importKey(privateKey) OAEP_cipher = PKCS1_OAEP.new(RSAprivateKey) decryptedMsg = OAEP_cipher.decrypt(encryptedMsg) print('Оригинальный текст:', decryptedMsg.decode()) |
В приведенном коде мы применяем шифрование и дешифрование с использованием пакета PKCS1_OAEP Python, который представляет собой дополнение для асимметричного шифрования, опубликованную RSA и обеспечивающую большую безопасность, чем простой RSA.
Для выполнения схемы OAEP нужно сначала создать объект PKCS1OAEP_Cipher, а затем вызвать методы PKCS1OAEP_Cipher.encrypt() и PKCS1OAEP_Cipher.decrypt() для шифрования или дешифрования текста. Если входной текст имеет строковый тип, мы должны сначала преобразовать его в байтовую строку.
Для выполнения предыдущего скрипта нам нужно передать размер ключа в качестве первого параметра, например, 2 048 бит, и формат файла для публичных и закрытых ключей в качестве второго параметра. Третий параметр – сообщение для шифрования.
Заключение
Теперь, когда мы рассмотрели модуль PyCryptodome, давайте рассмотрим модуль Cryptography как альтернативу для шифрования и дешифрования данных.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Библиотеки для обфускации Python
- Асимметричное шифрование Python
- Шифрование и дешифрование в PowerShell