如何将 public 密钥与 pyOpenSSL 一起用于验证签名消息?

How use public key with pyOpenSSL for verify a signed message?

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

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

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

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

我不知道这段代码哪里错了,我找到了一些例子,但我不明白这是如何工作的,因为验证函数的第一个参数是一个 X509 对象 "certificate is a X509 instance corresponding to the private key which generated the signature." 并且其次是用私钥生成的签名..

此代码与私钥完美配合:

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')

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

你有想法吗?

非常感谢, 罗曼

我在这个 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')

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

好的,我明白我的错误了:Cryptography Digital signatures

source