首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python格式pkcs8 RSA签名

python格式pkcs8 RSA签名
EN

Stack Overflow用户
提问于 2017-06-20 08:06:04
回答 1查看 2K关注 0票数 0

我需要在我的项目中使用pkcs8私钥,如下所示,我找不到任何与pkcs8签名相关的库或方法,只有pkcs1可以用于Crypto.Signature

我的python代码示例:

代码语言:javascript
复制
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA
from Crypto.PublicKey import RSA

privatekey='''-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOuxJs5RD6s2ECEV
C38Jfj6xBBrcX6W1Qy+GLiXhh+wKj650BPSerQNQI+XPx/+uUemk/dJM3RMm75Di
mXJlp7/5LY11VyKSqS+x6ELIvWz8lo2OhHW6/wU4jiQ1MlburYbn/pRRClGGA8i4
FjHMvMu9/QCNPlNTlf7qJDO6lDVlAgMBAAECgYB0iP76/DGXIgAPm2w3v+Xf8X5q
GZRhRqKVmO6wZDbkisRIKa1ZlitNfA6DzpzA2tw9fgrSNJcKpTHGnYPpgEHUQrcw
t471yuAvzAOBffaqVjIt7vKyL3QnkNfxWenliasacX3olwBpKPrkvG75H2KBe9S0
WKpju1Cm6MebAJ3z8QJBAP8gSx3l9nNTqJcBBmP+TGDcTL9Sif2nBZrU/pWnzzop
HolaFIQTYXPIj8rMoVT/c0gLo1gcdHoSUJTbB0WO7V8CQQDsf9FAWCI3fkWgS/fW
21ApO6B07/388CpNHOTjvfsdlent4yXLL+Guh5apMH4Oq0tkGkEij5YPG1EZSYXi
48+7AkEAiX3m3ZMMMXTZe5/CyOrIUL8I4WbjFP8JJzs4hICuTmLQoScZvWAQeeyR
ibKkE4GjqCUVf6u+Hfd20/ICRjtTswJANCjEh8JoWYDZ7k6S7KoV9eIWs3OyurRl
P/idarUdyxqjKzorvbJjvdBdpBbz1lxlFkDMGMk+OTq3GjKi+rVvvQJAGhBieR2Q
69JNeoOg7J8Xk7evNBJHwtJfRDQXKJpN5YZsKclf6oRaYFEQOM6ThuNoYHISfGKw
UbDoUsPZoQFPtQ==
-----END PRIVATE KEY-----'''

signstr = testdata123

key = RSA.importKey(privatekey) 
h = SHA.new(signstr) 
signer = PKCS1_v1_5.new(key) 
signature = signer.sign(h) 
sign = base64.b64encode(signature) 

上面的代码生成的签名与我正在使用的api系统中的公钥不匹配。

对于PHP端,我能够正确地签名。PHP的工作代码如下:

代码语言:javascript
复制
$private_key= openssl_get_privatekey($private_key);
openssl_sign($signStr,$sign_info,$private_key,OPENSSL_ALGO_MD5);
$sign = base64_encode($sign_info);

任何关于如何使用python签署RSA pkcs8格式私钥的建议都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-20 20:25:25

哈希算法

当然,它肯定是不同的,因为您使用的是不同的哈希算法。

Python代码使用SHA-1,PHP代码使用MD5。PHP中默认的哈希算法是OPENSSL_ALGO_SHA1作为文档描述

代码语言:javascript
复制
if (!openssl_sign($signStr, $sign_info, $private_key)) {
    echo "Failed to sign";
}

密钥编码

私钥的编码方法有很多种。最常见的两种方法是PKCS#1和PKCS#8编码。请参阅有关该这里的更多信息。

这里并不关心密钥编码,因为pycrypto和openssl都在这里使用正确的编码。

填充

有两种常用的填充方案用于签名: PKCS#1 v1.5填充和RSASSA(技术上讲,RSASSA-PKCS1-V1_5和RSASSA)。这两种方法都是在PKCS#1中定义的,但后者是在PKCS#1 v2.x中引入的。

Pycrypto支持这两种填充方案,但是openssl只支持PHPv1.5。

兼容性

如果要检查不同语言之间相同算法的兼容性,需要使用私钥登录其中一种,并使用公钥在另一种语言中验证签名。在你做完之后,如果你也需要另一个方向的话,你可以尝试另一种方法。

这只与RSA-PSS相关,因为这是随机的。

如果您使用的是PKCS#1 v1.5填充(这不是随机的),您应该能够在Pythonv1.5和PHP中创建一个签名,并直接比较它们以检查兼容性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44647321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档