python - 如何在python中使用公钥验证私钥
问题描述
我想知道如何使用公钥来验证私钥。
我完全不知道我在做什么
我得到了一个公钥,格式为:
" <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 和消息是什么类型......请帮助我......我想学习
解决方案
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 程序员,所以我正在做的事情可能有捷径;随时编辑它们。
推荐阅读
- json - Json schema validating length of one field based on another field
- regex - grep 两位数的列
- python-3.x - 在kotlin中使用python的模型
- javascript - 如何从不断更新的外部 JSON 文件中提取数据?
- svg - 来自外部 SVG 文件的 ID 目标符号
- elasticsearch - 如何一起执行 Elastsearch multi_match AND BOOL?
- c# - HttpContext.Session 不维护状态
- php - 使用 php 检索 json 子项(在另一个 foreach 中)
- git - 如何配置 Jenkins 通过 git 忽略文件?
- c++ - “No-Const Pointer to Const”调用函数