【发布时间】:2017-09-13 04:44:45
【问题描述】:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(PrivateKey);
string data = "SAMPLE TEXT.";
byte[] signedData = rsa.SignData(Encoding.UTF8.GetBytes(data), new
SHA1CryptoServiceProvider());
string signedString = Convert.ToBase64String(signedData);
上面的代码使用从 xml 加载的 PrivateKey 对字符串进行签名。
你能帮我用python重写吗?
我自己编写了这段代码,但它产生了不同的签名!
from Crypto.PublicKey import RSA
from Crypto.Util.number import bytes_to_long, long_to_bytes
from hashlib import sha1
import base64
msg = "SAMPLE TEXT."
hashed = sha1(msg.encode('utf-8')).digest()
pubkey = RSA.construct((m,e))
encrypted = pubkey.encrypt(hashed, b'X')[0]
print("Signature: {0}".format(base64.b64encode(encrypted)))
【问题讨论】:
-
我没有找到关于
SignData(byte[], object)所做工作的正确文档,并且查看 .Net 的参考源也没有回答这个问题。我怀疑这是一个简单的教科书 RSA 调用,但我不确定。它也可以是带有 PKCS#1 v1.5 填充或 PSS 填充的 RSA 签名。 -
RSACryptoServiceProvider 上不采用 RSASignaturePadding 的 SignData 方法执行 PKCS#1 v1.5 签名填充。 python 中的示例似乎是加密的,可能使用 PKCS#1 v1.5 加密填充(不同的野兽)或原始(不同的野兽);它使用公钥操作,而签名是私钥操作。
-
@bartonjs 非常感谢,这么有用的评论,让我了解到加密与签名不同,一些谷歌教我签名将使用私钥完成。但我仍然没有得到我可爱的输出,所以你能解释更多关于签名填充的信息吗?我怎样才能强制 pycrypto 以这种方式工作?
-
我写了一个新的 sn-p 你可以在这里看到pastebin.com/Gv2VY5Za,但它还不能正常工作(输出与 C#.NET 给我的不同)
标签: python rsa digital-signature pycrypto