如何将 public 密钥与 pyOpenSSL 一起用于验证签名消息?
How use public key with pyOpenSSL for verify a signed message?
我尝试使用 pyOpenSSL 对数据进行签名,我创建密钥对(私有和公共)和证书。
我是这项技术的初学者,我使用 OpenSSL,但如果您有关于在 python 中使用私有和 public 密钥生成签名消息的建议,我接受!
我想使用 RSA 和 DSA 算法进行测试。
我找到了 m2Crypto
、pyCrypto
等。我不知道什么是最好的。
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
我尝试使用 pyOpenSSL 对数据进行签名,我创建密钥对(私有和公共)和证书。
我是这项技术的初学者,我使用 OpenSSL,但如果您有关于在 python 中使用私有和 public 密钥生成签名消息的建议,我接受! 我想使用 RSA 和 DSA 算法进行测试。
我找到了 m2Crypto
、pyCrypto
等。我不知道什么是最好的。
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