在python中相当于什么

Ash*_*zme 4 c# python xml-parsing private-key

对于银行交易实现,我有一个私钥和一些数据,我需要用私钥对这些数据进行签名。

银行给出的示例代码是用 C# .NET 编写的,我在 python 中找不到任何等效的代码。

密钥采用以下格式:

<RSAKeyValue>
  <Modulus>...</Modulus>
  <Exponent>...</Exponent>
  <P>...</P>
  <Q>...</Q>
  <DP>...</DP>
  <DQ>...</DQ>
  <InverseQ>...</InverseQ>
  <D>...</D>
</RSAKeyValue>
Run Code Online (Sandbox Code Playgroud)

示例代码是这样的:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(“ <RSAKeyValue><Modulus>oQRshGhLf2Fh... ”);
string data = "#" + merchantCode + "#" + terminalCode + "#"
+invoiceNumber + "#" + invoiceDate + "#" + amount + "#" +redirectAddress
+ "#" + action + "#" + timeStamp + "#";
byte[] signMain = rsa.SignData(Encoding.UTF8.GetBytes(data), new
SHA1CryptoServiceProvider());
sign = Convert.ToBase64String(signMain);
Run Code Online (Sandbox Code Playgroud)

现在我还没有在 python 中找到任何好的等价物,我需要做确切的事情以免引发任何异常。我曾经在另一篇文献中问过这个问题,但它被搁置了。我不知道他们为什么这样做,但我已经为此苦苦挣扎了几个星期,但我还没有找到任何解决方案。所以请以任何方式帮助我。提前致谢。

Moj*_*vin 6

请注意,示例代码使用 SHA1,而不是 SHA256。

如果您想一次性完成,也可以使用在线 RSA 密钥转换器工具将 RSA xml 格式转换为 .pem 格式。

您可以使用此方法:

   import json
   from Crypto.PublicKey import RSA
   from Crypto.Signature import PKCS1_v1_5
   from Crypto.Hash import SHA1
   import base64 import       

   def get_sign(data, private_key):
        rsa_key = RSA.importKey(base64.b64decode(private_key.encode("utf-8")))
        signer = PKCS1_v1_5.new(rsa_key)
        digest = SHA1.new()
        digest.update(data)
        sign = signer.sign(digest)
        return base64.b64encode(sign).decode('utf-8')

   # usage example 
   pem_private_key= """
       izfrNTmQLnfsLzi2Wb9xPz2Qj9fQYGgeug3N2MkDuVHwpPcgkhHkJgCQuuvT+qZI
       ...
       eM1tfdFZ6wMTLkxRhBkBK4JiMiUMvpERyPib6a2L6iXTfH+3RUDS6A==
       """
   payload_json = json.dumps({"is_example":True})
   sign = get_sign(pem_private_key, payload_json.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)