【问题标题】:How use public key with pyOpenSSL for verify a signed message?如何使用带有 pyOpenSSL 的公钥来验证签名消息?
【发布时间】:2017-10-14 17:45:01
【问题描述】:

我尝试使用 pyOpenSSL 签署数据,创建密钥对(私有和公共)和证书。

我是这项技术的初学者,我使用 OpenSSl,但如果您有建议在 python 中使用私钥和公钥生成签名消息,我接受! 我想在我的测试中使用 RSA 和 DSA 算法。

我找到m2CryptopyCrypto 等。我不知道什么是最好的。 gnupg for python 和 pyOpenSSl 明显是最近的。

我使用函数用我的私钥签署了一条消息,并验证了数据。 但是当我看到验证签名的功能时,在参数中我需要: 私钥、签名、数据和摘要类型。

我不知道我在这段代码中哪里错了,我找到了一些例子,但我不明白这是如何工作的,因为验证函数的第一个参数是一个 X509 对象“证书是一个 X509 实例对应于生成签名的私钥。”第二个是用私钥生成的签名..

此代码与私钥完美配合:

from OpenSSL import crypto

_k = crypto.PKey()
_cert = crypto.X509()

# Create keys
_k.generate_key(crypto.TYPE_RSA, 2048)

# Add argument for create certificate
_cert.gmtime_adj_notBefore(0)
_cert.gmtime_adj_notAfter(0*365*24*60*60) #10 years expiry date
_cert.set_pubkey(_k)
_cert.sign(_k, 'sha256')

# Create key's file
with open("public_key.pem",'w') as f:
    f.write(crypto.dump_publickey(crypto.FILETYPE_PEM, _k))

with open("private_key.pem",'w') as f:
    f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, _k))

with open("certificate.pem",'w') as f:
    f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, _cert))

#-------------------------------------------------------------------------------

# Open key and load in var
with open("private_key.pem",'r') as f:
    priv_key = crypto.load_privatekey(crypto.FILETYPE_PEM, f.read())

with open("public_key.pem",'r') as f:
    pub_key = crypto.load_publickey(crypto.FILETYPE_PEM, f.read())

with open("certificate.pem",'r') as f:
    cert = crypto.load_certificate(crypto.FILETYPE_PEM, f.read())

# sign message 'hello world' with private key and certificate
sign = crypto.sign(priv_key, "hello world", 'sha256')
print crypto.verify(cert, sign, "hello world", 'sha256')

那么,我的问题是,如何使用公钥来验证数据? 如果 Bob 给 alice 一个公钥,它如何用这个公钥检查消息?

你有想法吗?

非常感谢, 罗曼

【问题讨论】:

  • 你试过crypto.verify(pub_key, sign, "hello world", 'sha256')吗?
  • 是的,我试试这个,公钥和私钥不是同一个实例,pyopenssl.org/en/stable/api/…

标签: python cryptography rsa pyopenssl dsa


【解决方案1】:

我在这个post找到了答案。

from OpenSSL.crypto import load_publickey, FILETYPE_PEM, verify, X509
# ... code ...
x509 = X509()
x509.set_pubkey(pub_key)
# ... code ...
print verify(x509, sign, sha, 'sha256')

我想知道..当我收到消息时,我使用公钥来验证发送者,但为什么我必须使用签名来进行验证?要生成签名,我需要私钥.. 库的使用中是否有我不明白的地方?

【讨论】:

    【解决方案2】:

    好的,我理解我的错误:Cryptography Digital signatures

    source

    【讨论】:

      猜你喜欢
      • 2012-08-22
      • 2013-08-17
      • 2012-07-26
      • 2020-07-02
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      相关资源
      最近更新 更多