【发布时间】:2017-10-14 17:45:01
【问题描述】:
我尝试使用 pyOpenSSL 签署数据,创建密钥对(私有和公共)和证书。
我是这项技术的初学者,我使用 OpenSSl,但如果您有建议在 python 中使用私钥和公钥生成签名消息,我接受! 我想在我的测试中使用 RSA 和 DSA 算法。
我找到m2Crypto、pyCrypto 等。我不知道什么是最好的。
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