如何将原始散列输入获取到 RSA 数字签名?

Posted

技术标签:

【中文标题】如何将原始散列输入获取到 RSA 数字签名?【英文标题】:How to get the original hashed input to an RSA digital signature? 【发布时间】:2019-11-02 17:37:11 【问题描述】:

我收到一个网络数据包,其最后 64 个字节(128 个十六进制字符)是数据包的 SHA-256 哈希的 RSA-512 数字签名。我取了这个数据包的截断版本(除了最后 64 个字节之外的所有内容)并自己计算哈希,这工作正常,但是我需要一种方法来取回首先生成签名的哈希

我尝试在 Python 中执行此操作并遇到问题,因为我没有 RSA 私钥,只有公钥和数字签名。我需要的是一种获取公钥和签名并从中获取 SHA-256 哈希以将其与我生成的哈希进行比较的方法。有没有办法做到这一点?任何加密库都可以。我正在使用 hashlib 生成哈希

【问题讨论】:

我认为您应该阅读以下内容:crypto.stackexchange.com/questions/9896/… 我看到了 - 我不明白的是它说你可以:你可以使用公钥“加密”(或“解密”,这在“教科书”RSA中相同)签名并获得散列消息。如果散列消息等于散列消息,则您验证了消息已正确签名。这是否意味着只需 RSA 加密签名然后对其进行哈希处理,这将为您提供与哈希后的“消息”相同的信息? 更具体地说-该线程的答案中解释的过程:***.com/questions/18257185/… 我正在寻找如何使用 python 加密库来做到这一点。到目前为止,我还没有弄清楚如何 当您说“我需要的是一种获取公钥和签名并从中获取 SHA-256 哈希以将其与我生成的哈希进行比较的方法。”你通过“解密”去签名并将结果与​​你已经拥有的原始数据进行比较来做到这一点,如果你解密的内容与数据匹配,那么你可以确定数据来自私钥的持有者,这就是全部主意。以签名 jwt 的工作方式为例,标头告诉您它是如何签名的,主体是数据,最后一部分是您使用公钥验证的签名。 这里是python的一个例子。 gist.github.com/lkdocs/6519372. 【参考方案1】:

原始哈希是用私钥签名的。要获取原始哈希,您需要使用 public 密钥解密签名,而不是使用私钥。

【讨论】:

你如何在 python 中做到这一点是我的问题——我知道你需要用公钥解密。它只是简单的 rsa_pub_key.decrypt(digital_signature) 吗?我试过这样做,但我得到了这个错误:File "/usr/local/lib/python2.7/site-packages/Crypto/PublicKey/RSA.py", line 239, in _decrypt mp = self.key._decrypt(cp) TypeError: Private key not available in this object @ThomasM 请编辑您的问题以明确您的要求。现在,它仍然说“遇到问题,因为我没有 RSA 私钥”。如果您要验证签名,则根本不要解密,库有后者的额外代码,请参阅***.com/questions/39402792/… 并在年底前切换到 Python 3...pythonclock.org

以上是关于如何将原始散列输入获取到 RSA 数字签名?的主要内容,如果未能解决你的问题,请参考以下文章

什么是MD5

算法散列表

java的RSA签名验签怎么转化成c

oppo手机便签里数字如何自动加减?

crypto++RSA数字签名

Python - RSA解密不返回原始消息(非常简单,短程序)