我有一个 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中做同样的事情?
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