【问题标题】:python equivalent for RSA.SignData in .NET.NET 中 RSA.SignData 的 python 等效项
【发布时间】: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


【解决方案1】:

据我所知,Python 中没有内置的 RSA 库,但请查看支持 signingthis one (just named rsa)

# importing rsa
import rsa

# generating a key
(pubkey, privkey) = rsa.newkeys(512)

# message
message = 'Go left at the blue tree'

# signing
signature = rsa.sign(message, privkey, 'SHA-1')

# verifying
rsa.verify(message, signature, pubkey) # True

【讨论】:

  • 感谢您的帮助,我可以使用外部库,例如 PyCryto
  • 不是一个仅链接的答案,但您可以提供更多信息。考虑描述图书馆,这样,如果链接失效,用户可以使用您的描述进行谷歌搜索并找到图书馆的新位置。
  • 你最好告诉我们更多关于那个库的信息。放链接是不够的!操作员还询问了如何在 python 中重写代码,例如进行一些数学运算来生成!无论如何,您提到的图书馆并没有做太多!
猜你喜欢
  • 2017-06-17
  • 2010-09-20
  • 2010-10-19
  • 2011-12-22
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多