RSA Sha1 шифровать с помощью Python - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу зашифровать строку, используя шифрование Rsa Sha1 в python.У меня есть код C #, и я не знаю, как это в Python.Пожалуйста, помогите мне, если можете!

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(“<RSAKeyValue><Modulus>oQRshGhLf2Fh...”);
string data = "something";
 byte[] signMain = rsa.SignData(Encoding.UTF8.GetBytes(data), new
SHA1CryptoServiceProvider());
 sign = Convert.ToBase64String(signMain);

1 Ответ

0 голосов
/ 04 февраля 2019

Я бы использовал cryptography проект здесь.Он имеет полную поддержку подписи RSA .Обратитесь к разделу криптографии в Руководстве автостопом по Python для получения альтернативных опций.

.NET RSACryptoServiceProvider объект не позволяет устанавливать алгоритм заполнения , онвсегда будет использовать PKCS1v15, поэтому выберите этот отступ в вашем коде Python.

Во-первых, я бы преобразовал этот XML-документ в формат PEM , чтобы вы могли загрузить открытый ключ изэтот формат .Мне неизвестны какие-либо библиотеки Python, которые могут загружать .NET / XKMS 2.0 XML-формат напрямую:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

private_key_pem = b'-----BEGIN {format}-----\n...\n-----END {format}-----'
private_key = serialization.load_pem_private_key(
    private_key_pem,
    password=None,
    backend=default_backend()
)

В качестве альтернативы, с анализатором Python XML вы, вероятно, можете передать данные из этого XML-документа в пару RSAPublicNumbers() и RSAPrivateNumbers(), а затем использовать метод RSAPrivateNumbers.private_key() для создания RSAобъект закрытого ключа для подписи.Вам нужно будет выполнить base64-декодирование данных XML и преобразовать байты в целое число , используя порядок байтов с прямым порядком байтов .

Затем вы можете использовать закрытый ключ для выполненияподпись:

from base64 import b64encode

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

data = "something"
signature = private_key.sign(data.encode('utf8'), padding.PKCS1v15(), hashes.SHA1())
signature_base64 = b64encode(signature)
...