M2Crypto:PKey是公钥还是私钥的引用?
在M2Crypto这个Python包的PKey类文档中(这是一个用于Python的OpenSSL封装),提到PKey是一个公钥的引用。
我个人认为,它其实是一个私钥的引用,因为PKey类的初始化方法调用了evp_pkey_new这个OpenSSL函数。根据这个链接:http://linux.die.net/man/3/evp_pkey_new,这个函数应该是用来分配一个新的私钥结构的引用!
这里只有两种可能的解释:要么M2Crypto的文档是错的,要么我提供的链接信息是错误的。
有没有人能帮我找到真相呢?
2 个回答
EVP_PKEY_new的说明书里直接说它是用来存储私钥的。就像原作者一样,我也搞不清楚,因为x509foo.get_pubkey()只返回一个EVP.PKey实例,而把这个实例存成pem格式时却显示为私钥。我不能假装知道M2Crypto团队的意图,因为很多使用PKey的函数都没有文档说明。例如,一个x509请求对象有一个verify(self,pkey)的方法,但它并没有告诉我pkey是什么类型的对象。类似的,文档也没有提供任何信息。我和原作者一样困惑,因为我至少把RSA想成是这样的: (e,n) # 公钥 (d,n) # 私钥
而在最好的情况下,我把私钥想成是这样的: (d,n,p,q,dp,dq,qinv,t),其中 p和q是大质数,dp和dq是额外的系数,用来加快解密速度,t是欧拉函数。
文档中应该更清楚地区分这些概念,因为有时候你想用私钥进行加密(在签名的情况下),这样其他人就可以通过公钥解密来验证。 h = hash(m) sig = h^d (mod n) 只有知道d(私钥)的人才能创建这个签名。 验证的过程是:
h = sig^e (mod n)
如果两个哈希值匹配,你就知道消息是可信的。
我遇到的问题是,EVP.Pkey声称代表公钥,但它的assign_rsa()方法却声明接受一个RSA密钥对(“我在这个时候假设这意味着私钥”)。到目前为止,我找到的所有示例都只是用来创建自签名证书(包括M2Crypto自己的单元测试)。我没有看到任何测试是用第三方的x509请求,并用自己的CA证书和密钥进行签名,这在现实中是很常见的。单元测试对我理解如何签署一般的CSR没有帮助,因为X509请求不会包含私钥。然而,单元测试的示例运行得很好,因为它是自签名的,签名者已经有了私钥的访问权限。实际上,test_mkcert测试就是这样,它使用mkreq方法返回的私钥来生成x509请求。
M2Crypto的文档让人困惑,因为它们把pk、pkey甚至pubkey这些术语混用。
OpenSSL的文档不太完整,使用EVP_PKEY_new()
创建的EVP_PKEY
结构体可以用来存储私钥或者公钥。具体存储哪种钥匙,取决于你之后放进去的内容。
比如,EVP_SealInit()
和EVP_OpenInit
这两个函数都需要用到EVP_PKEY
作为参数。