如何使用XML格式的私钥使用RSA解密数据?

问题描述 投票:0回答:1

我有一个 XML 格式的私钥:

<RSAKeyValue>
<Modulus>...</Modulus>
<Exponent>...</Exponent>
<P>...</P>
<Q>...</Q>
<DP>...</DP>
<DQ>...</DQ>
<InverseQ>...</InverseQ>
<D>...</D>
</RSAKeyValue>

和数据(字符串):

TTg14X6YfQKJUG0keHzMqp-mvT52J0vkrvP_qwWQvdzzdnLxRXn7i5Aj6AWbO9CWsPw2VO5-fCsJt0pZM_4W2PIk-ThXbJEuOLZbisRI4_...

通过公钥进行base64加密。

如何使用上述 XML 形式的私钥解密此数据?

这适用于 C#:

public static byte[] DecryptRSAToByte(string dataDecrypt, string xmlPrivateKey)
{
  RSACryptoServiceProvider rsaCryptoServiceProvider =
  newRSACryptoServiceProvider(1024);
  rsaCryptoServiceProvider.FromXmlString(xmlPrivateKey);
  byte[] bytes = SafeBase64Url.DecodeBase64Url(dataDecrypt);
  byte[] decrypted = rsaCryptoServiceProvider.Decrypt(bytes, false);
  return decrypted;
}

我怎样才能在Python中做同样的事情?

python xml rsa private-key pycrypto
1个回答
0
投票
import base64

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.backends import default_backend
import xml.etree.ElementTree as ET

def convert_xml_to_pem(private_key_xml_content: str, public_key_xml_content: str):
    # Load private key from XML
    private_key_data = ET.fromstring(private_key_xml_content)
    public_key_data = ET.fromstring(public_key_xml_content)
    inverseQ = int.from_bytes(base64.b64decode(private_key_data.find('InverseQ').text), 'big')
    modulus = int.from_bytes(base64.b64decode(private_key_data.find('Modulus').text), 'big')
    p = int.from_bytes(base64.b64decode(private_key_data.find('P').text), 'big')
    inverseQmodP = inverseQ % p
    exponent = int.from_bytes(base64.b64decode(public_key_data.find('Exponent').text), 'big')
    public_numbers = rsa.RSAPublicNumbers(exponent, modulus)
    private_key = rsa.RSAPrivateNumbers(
        p,
        int.from_bytes(base64.b64decode(private_key_data.find('Q').text), 'big'),
        int.from_bytes(base64.b64decode(private_key_data.find('D').text), 'big'),
        int.from_bytes(base64.b64decode(private_key_data.find('DP').text), 'big'),
        int.from_bytes(base64.b64decode(private_key_data.find('DQ').text), 'big'),
        inverseQmodP,
        public_numbers,
        # int(private_key_data.find('InverseQ').text, 16)
    ).private_key(default_backend())

    private_key_pem = private_key.private_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PrivateFormat.TraditionalOpenSSL,
            encryption_algorithm=serialization.NoEncryption()
        )

    # Load public key from XML
    # public_key_data = ET.fromstring(public_key_xml_content)
    public_key = public_numbers.public_key(default_backend())

    public_key_pem = public_key.public_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PublicFormat.SubjectPublicKeyInfo
        )
    return private_key_pem, public_key_pem
© www.soinside.com 2019 - 2024. All rights reserved.