在 python 中这相当于什么
what is the equivalent of this in python
对于银行交易实施,我有私钥和一些数据,我需要使用私钥签署该数据。
银行提供的示例代码是用 C# .NET 编写的,我在 python 中找不到任何等效代码。
密钥格式如下:
<RSAKeyValue>
<Modulus>...</Modulus>
<Exponent>...</Exponent>
<P>...</P>
<Q>...</Q>
<DP>...</DP>
<DQ>...</DQ>
<InverseQ>...</InverseQ>
<D>...</D>
</RSAKeyValue>
示例代码是这样的:
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);
现在我在 python 中没有找到任何好的等效项,我需要做正确的事情才能不引发任何异常。我曾经在另一篇文献中问过这个问题,但它被搁置了。我不知道他们为什么这样做,但我已经为此苦苦挣扎了数周,但我还没有找到任何解决方案。所以请尽你所能帮助我。提前致谢。
https://pypi.python.org/pypi/rsa is an RSA implementation. I don't know what the heck is happening in that rsa.FromXmlString (https://msdn.microsoft.com/en-us/library/vstudio/system.security.cryptography.rsa.fromxmlstring(v=vs.90) ),因此这需要您进行一些调查。
http://stuvel.eu/files/python-rsa-doc/reference.html#rsa.sign shows you how to sign a message in RSA, you'll want the SHA-1 hash method. Then base64 encode the results https://docs.python.org/2/library/base64.html
您需要将您的 .NET XML 格式密钥转换为 .PEM,以便任何 Python 模块可以处理它。 (参见 this question)
一旦你有了它,你就可以使用 RSA or PyCrypto 模块。
查看此 example code 使用 PyCrypto 签署数据:
def sign_data(private_key_loc, data):
'''
param: private_key_loc Path to your private key
param: package Data to be signed
return: base64 encoded signature
'''
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64encode, b64decode
key = open(private_key_loc, "r").read()
rsakey = RSA.importKey(key)
signer = PKCS1_v1_5.new(rsakey)
digest = SHA256.new()
# It's being assumed the data is base64 encoded, so it's decoded before updating the digest
digest.update(b64decode(data))
sign = signer.sign(digest)
return b64encode(sign)
显然,它需要根据您的需要进行调整(例如,如果您需要 SHA-1,请使用 import SHA
而不是 import SHA256
),但它应该会给您一个良好的头脑-开始。
请注意,示例代码使用的是 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'))
对于银行交易实施,我有私钥和一些数据,我需要使用私钥签署该数据。
银行提供的示例代码是用 C# .NET 编写的,我在 python 中找不到任何等效代码。
密钥格式如下:
<RSAKeyValue>
<Modulus>...</Modulus>
<Exponent>...</Exponent>
<P>...</P>
<Q>...</Q>
<DP>...</DP>
<DQ>...</DQ>
<InverseQ>...</InverseQ>
<D>...</D>
</RSAKeyValue>
示例代码是这样的:
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);
现在我在 python 中没有找到任何好的等效项,我需要做正确的事情才能不引发任何异常。我曾经在另一篇文献中问过这个问题,但它被搁置了。我不知道他们为什么这样做,但我已经为此苦苦挣扎了数周,但我还没有找到任何解决方案。所以请尽你所能帮助我。提前致谢。
https://pypi.python.org/pypi/rsa is an RSA implementation. I don't know what the heck is happening in that rsa.FromXmlString (https://msdn.microsoft.com/en-us/library/vstudio/system.security.cryptography.rsa.fromxmlstring(v=vs.90) ),因此这需要您进行一些调查。
http://stuvel.eu/files/python-rsa-doc/reference.html#rsa.sign shows you how to sign a message in RSA, you'll want the SHA-1 hash method. Then base64 encode the results https://docs.python.org/2/library/base64.html
您需要将您的 .NET XML 格式密钥转换为 .PEM,以便任何 Python 模块可以处理它。 (参见 this question)
一旦你有了它,你就可以使用 RSA or PyCrypto 模块。
查看此 example code 使用 PyCrypto 签署数据:
def sign_data(private_key_loc, data):
'''
param: private_key_loc Path to your private key
param: package Data to be signed
return: base64 encoded signature
'''
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64encode, b64decode
key = open(private_key_loc, "r").read()
rsakey = RSA.importKey(key)
signer = PKCS1_v1_5.new(rsakey)
digest = SHA256.new()
# It's being assumed the data is base64 encoded, so it's decoded before updating the digest
digest.update(b64decode(data))
sign = signer.sign(digest)
return b64encode(sign)
显然,它需要根据您的需要进行调整(例如,如果您需要 SHA-1,请使用 import SHA
而不是 import SHA256
),但它应该会给您一个良好的头脑-开始。
请注意,示例代码使用的是 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'))