【问题标题】:How to validate a private key using a public key in python如何在python中使用公钥验证私钥
【发布时间】:2020-01-20 23:37:09
【问题描述】:

我想知道如何使用公钥来验证私钥。

我完全不知道自己在做什么

我得到了一个公钥,格式如下:

<RSAKeyValue><Modulus>tuRctbsnB4OSsR7gqNy1ovYZ4vDTn543o4ldX8Wthfjk7dAQKPHQYUmB7EyC4qFQ2GY3/Q+mDjJBDCWbsb8gyFuyU3L93UJ/7szvO+2A/t520srjCN4Yv7HirgpAI0LaWlo1UUUixMU2+kYNv/kBeVUL47TvOIpm0JqstQVDHhJtNMwcbY+3Q0nN4D1jNkSrQitCF3Sdms1kwsIFcdHcUh3WcUBkIefcB97DZKVY915IFbhf1/xdpPBa/E0WjNgtF5q4FI5ClH2CxsDwy2mL6qzZMvRPNWUhaFKlX+CcGvFQOtuJ4K8PZ0P3Wsq55ccxafZp3BQrEcBbto5Cll/E0Q==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

这是一个字符串,我正在尝试使用 python 验证一个私钥(也作为字符串提供)。我知道发行人和受众需要是什么,但我不确定如何处理所有这些信息。

我看过一些人使用各种包的例子,但我似乎无法弄清楚 pub_key、private_key 和 message 是什么类型...请帮助我...我想学习

【问题讨论】:

  • Base 64 解码公钥的组成部分并创建公钥。然后使用私钥创建签名并使用公钥进行验证。如果验证,则密钥形成密钥对。
  • @KevinWelch 我没有在您共享的stackoverflow.com/questions/30056762/… 链接中找到实际验证公钥和私钥的答案。验证密钥对不同于加密或解密明文。
  • @MaartenBodewes 你能分享一个链接到做这个验证的函数/类的文档吗?

标签: python cryptography rsa pycrypto


【解决方案1】:

Base 64 从 XML 中解码公钥的组件 - 模数和公共指数 - 并从解码的无符号大端数字值创建公钥。

然后使用私钥在任何数据上创建签名,并使用相同的 RSA 签名算法(例如带有 PKCS#1 v1.5 填充的 RSA)使用公钥对其进行验证。如果验证,则密钥形成密钥对。


好的,因为一个用户似乎一直在挣扎,让我们实际提供一些代码供您使用(使用 Python3 使用 from_bytes 创建整数):

#!/bin/python
from Crypto.PublicKey import RSA
from xml.dom import minidom
from base64 import b64decode

document = """\
<RSAKeyValue>
  <Modulus>tuRctbsnB4OSsR7gqNy1ovYZ4vDTn543o4ldX8Wthfjk7dAQKPHQYUmB7EyC4qFQ2GY3/Q+mDjJBDCWbsb8gyFuyU3L93UJ/7szvO+2A/t520srjCN4Yv7HirgpAI0LaWlo1UUUixMU2+kYNv/kBeVUL47TvOIpm0JqstQVDHhJtNMwcbY+3Q0nN4D1jNkSrQitCF3Sdms1kwsIFcdHcUh3WcUBkIefcB97DZKVY915IFbhf1/xdpPBa/E0WjNgtF5q4FI5ClH2CxsDwy2mL6qzZMvRPNWUhaFKlX+CcGvFQOtuJ4K8PZ0P3Wsq55ccxafZp3BQrEcBbto5Cll/E0Q==</Modulus>
  <Exponent>AQAB</Exponent>
</RSAKeyValue>
"""

xmldoc = minidom.parseString(document)

modulusB64 = xmldoc.getElementsByTagName('Modulus')[0].firstChild.data
modulusBin = b64decode(modulusB64)
modulus = int.from_bytes(modulusBin, 'big', signed=False)

exponentB64 = xmldoc.getElementsByTagName('Exponent')[0].firstChild.data 
exponentBin = b64decode(exponentB64)
exponent = int.from_bytes(exponentBin, 'big', signed=False) 

public_key = RSA.construct((modulus, exponent))

很遗憾,我没有要验证的签名(或要解密的私钥),所以我无法帮助您验证公钥是否属于私钥。我想应该有代码示例显示基本的签名验证或使用公钥加密。请注意,模数也应该是唯一的,并且存在于 RSA 的两个密钥中,但这仅有助于识别密钥对中的密钥,而不是验证。

请注意,我不是专业的 Python 程序员,所以我正在做的事情可能有捷径;随意编辑它们。

【讨论】:

  • 请分享一些代码示例。我一直在寻找一个小时的 python 代码,它需要一个公钥和私钥并进行验证。什么都找不到。
  • 也许编程不仅仅是在网上找代码 sn-ps。
  • 也许发布对相关技术文档的引用可以提供帮助?我在这里:pycryptodome.org/en/latest/src/… 我无法在文档中找到“使用公钥验证私钥”的位置,正如原始问题所说的那样。
  • 这只是签名创建和验证,如答案中所述。如果签名验证它必须使用私钥创建。
  • @NikhilVJ 我已经用代码更新了我的答案..
猜你喜欢
  • 2018-08-31
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 2018-11-14
  • 1970-01-01
相关资源
最近更新 更多