簡體   English   中英

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系統中的公鑰不匹配。

對於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

if (!openssl_sign($signStr, $sign_info, $private_key)) {
    echo "Failed to sign";
}

密鑰編碼

有很多編碼私鑰的方法。 兩種最常見的方式是PKCS#1和PKCS#8編碼。 這里查看更多信息。

這里不需要擔心密鑰編碼,因為pycrypto和openssl都在這里使用正確的密鑰。

填充

有兩種常見的用於簽名的填充方案 :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。

兼容性

如果要檢查同一算法在不同語言之間的兼容性,則需要使用私鑰登錄一種,並使用公鑰驗證另一種簽名。 完成此操作后,如果您還需要其他方向,則可以嘗試其他方法。
這僅與RSA-PSS有關,因為它是隨機的。

如果您使用的PKCS#1 v1.5填充不是隨機的,那么您應該能夠在Python和PHP中創建一個簽名,然后直接比較它們以檢查兼容性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM