Я бы использовал 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)