python 字符串格式 pkcs8 RSA 签名
python string format pkcs8 RSA signature
我需要在我的项目中使用 pkcs8 私钥,如下例所示,我找不到任何与 pkcs8 签名相关的库或方法,只有 pkcs1 可用于 Crypto.Signature
。
我的 python 代码示例:
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 系统中的 public 密钥不匹配。
对于 PHP 方,我可以正确签名。 PHP 的工作代码如下:
$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 格式私钥签名的建议。
哈希算法
当然肯定是不一样的,因为你用的是不同的哈希算法。
您的 Python 代码使用 SHA-1,您的 PHP 代码使用 MD5。 PHP 中的默认哈希算法是 OPENSSL_ALGO_SHA1
作为 documentation describes:
if (!openssl_sign($signStr, $sign_info, $private_key)) {
echo "Failed to sign";
}
密钥编码
私钥的编码方式有很多种。两种最常见的方式是 PKCS#1 和 PKCS#8 编码。查看有关 here.
的更多信息
密钥编码在这里不是问题,因为 pycrypto 和 openssl 在这里都使用正确的。
填充
有两种常见的 padding schemes 用于签名:PKCS#1 v1.5 填充和 RSA-PSS(技术上 RSASSA-PKCS1-V1_5 和 RSASSA-PSS)。两者在PKCS#1中都有定义,但后者是在PKCS#1中引入的v2.x.
Pycrypto 支持两种填充方案,但 openssl 仅支持 PHP.
中的 PKCS#1 v1.5
兼容性
如果要检查同一算法在不同语言之间的兼容性,您需要使用私钥登录一种并使用 public 密钥验证另一种的签名。完成后,如果您还需要另一个方向,可以尝试另一个方向。
这仅与 RSA-PSS 相关,因为它是随机的。
如果您使用的是非随机的 PKCS#1 v1.5 填充,您应该能够在 Python 和 PHP 中创建签名并直接比较它们以检查兼容性。
我需要在我的项目中使用 pkcs8 私钥,如下例所示,我找不到任何与 pkcs8 签名相关的库或方法,只有 pkcs1 可用于 Crypto.Signature
。
我的 python 代码示例:
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 系统中的 public 密钥不匹配。
对于 PHP 方,我可以正确签名。 PHP 的工作代码如下:
$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 格式私钥签名的建议。
哈希算法
当然肯定是不一样的,因为你用的是不同的哈希算法。
您的 Python 代码使用 SHA-1,您的 PHP 代码使用 MD5。 PHP 中的默认哈希算法是 OPENSSL_ALGO_SHA1
作为 documentation describes:
if (!openssl_sign($signStr, $sign_info, $private_key)) {
echo "Failed to sign";
}
密钥编码
私钥的编码方式有很多种。两种最常见的方式是 PKCS#1 和 PKCS#8 编码。查看有关 here.
的更多信息密钥编码在这里不是问题,因为 pycrypto 和 openssl 在这里都使用正确的。
填充
有两种常见的 padding schemes 用于签名:PKCS#1 v1.5 填充和 RSA-PSS(技术上 RSASSA-PKCS1-V1_5 和 RSASSA-PSS)。两者在PKCS#1中都有定义,但后者是在PKCS#1中引入的v2.x.
Pycrypto 支持两种填充方案,但 openssl 仅支持 PHP.
中的 PKCS#1 v1.5兼容性
如果要检查同一算法在不同语言之间的兼容性,您需要使用私钥登录一种并使用 public 密钥验证另一种的签名。完成后,如果您还需要另一个方向,可以尝试另一个方向。
这仅与 RSA-PSS 相关,因为它是随机的。
如果您使用的是非随机的 PKCS#1 v1.5 填充,您应该能够在 Python 和 PHP 中创建签名并直接比较它们以检查兼容性。