簡體   English   中英

用C / C ++生成的RSA OpenSSL密鑰可以用PHP解密嗎?

[英]Can an RSA OpenSSL key generated with C/C++ be decrypted with PHP?

在許多情況下,安全軟件都涉及(桌面)應用程序和Web界面之間的交互。 對於(RSA)非對稱加密,我們使用OpenSSL的C庫 (當前為1.0.2d版),而我們使用openssl PHP庫

所有標准的東西:

  • 私有加密(C ++)數據和公共解密(PHP)
  • 公共加密(C ++)數據和私有解密(PHP)

作品。 還有另一種方法:PHP-> C ++和C ++-> PHP

此外,還可以使用PHP生成加密的私鑰,並使用C / C ++解密該私鑰。 但不是這樣:我想用PHP解密用C ++生成和加密的私鑰。 注意:這與使用密鑰加密/解密數據不同。

問題似乎是C OpenSSL加密私鑰的方式。 僅僅知道加密密鑰的算法是不夠的(在我們的例子中是aes-256-cbc)。 密碼也被拉伸。 隨着時間的流逝,OpenSSL加密密鑰的方式發生了變化。 我現在舉一個例子。

用OpenSSL C / C ++生成的私鑰標頭的一部分如下:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIISnzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQI/epYUO8+LygCAggA

而使用openssl PHP生成的經過pem編碼的私鑰的標頭的一部分如下所示:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,372DA3A61BEB36AA

bc9NsTtdfcMW9t9isDPgl86aME223ockk9pIGDduEyrTS7zh1gwHWSWnD2efbxLd

我試圖使用一些PHP擴展名,例如phpseclib ,但是我仍然不能在PHP程序中使用C OpenSSL生成的私鑰。 公鑰未加密,可以在兩種語言之間交換而不會出現任何問題。

為了使用C OpenSSL生成RSA密鑰,我們使用EVP_PKEY結構。

由作者於2015年8月12日編輯

為了回應neubert,我使用OpenSSL實用程序“ openssl genpkey”生成了一個加密的RSA專用私鑰:

OpenSSL> genpkey -algorithm RSA -out c:\temp\test512.pem -aes-256-cbc -pass pass:1234 -pkeyopt rsa_keygen_bits:512

因此,密鑰長度為512位,密碼為“ 1234”。

為了獲得密鑰的未加密形式,我使用了“ openssl pkey”:

OpenSSL> pkey -in c:\temp\test512.pem  -out c:\temp\test512naked.pem

注意在Windows上,openssl可執行文件稱為“ openssl.exe”。

這是關鍵:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIBrzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQITePvOJ8u8lECAggA
MB0GCWCGSAFlAwQBKgQQ9gg/UzRleUGcOGK9P18fiASCAWCIo5c7q/HT7IcdtpiJ
y1bTj+SsqAilQIPIf1wtN2VjuVDQMSN35neI2X9TL3H9dNd6BVwJnzkfKbEAKK1+
ipj2KjOIVipctul6QIh9TS+MkGO0ZI+TaMJX4TaoPanLkQ00bOhnFod9W5UHZvVU
EdVx1+9bvvEngFqqweKjAfSySQ6Y9JD3E/ZSg1Bja3c9uLTlYFuMSs6S9iVUimlw
BCJXlfeHL5o331qwpAPjzOFD4ztTsOpnpXIt3y9l53u6UThHMWiTon5NpJgeQGny
GXSWvfZ4mhOjpUixrgFC/VqLjAHNvG9mqC4xoufNK3/QPCMNBsGpJ2gUSoX4/SkA
edUaPFhKRja8f9cvBW6vs67/lvAYjQ2tZOR8l7Jgj5AL3mKi8wyD/QISrJqFDrq6
dYLqyofv+5OJRWtAE4KJEASTVIJktnvTaxTI7gB+cRp/BHdDLvrTmfZ7UbI9Zx+K
ZLia
-----END ENCRYPTED PRIVATE KEY-----

-----BEGIN PRIVATE KEY-----
MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqxGy/AXwTEvx+moN
eRMNO/bWYBE+dX7kNROzswC2SzO6+NgYqKKIkYb8+Iho2ssuoYVWc62Gk37gxEhi
QrIDRQIDAQABAkEAlsA1I0S0evfeGNfGYbC5U+N1DRmFGhOlVWS0UgVJn8BYIpQI
fjseZ3xXhtfZypzTzc9VZKUJedi3cv7Ju9gqYQIhANzE+XbiytUzBFTzKuRanMEn
o6noJDGiaVktWvbbZEkpAiEAxl5VedZ1PCU5Qpd+1u7agIZfSBwWnkI0nnxO5Slo
AL0CIEWc0rCbGKwbVx1WQ8sXi2AYmLHFokwIU0GsXIeEbF3pAiALvbOjdX0U5UMh
XOQmBpcqOknTc84m6dZBdywYRj4gpQIgfg/KLv7cv/mGoe8tvh3geYTpnZ2HRwDN
O9Kal0WOaiw=
-----END PRIVATE KEY-----

-----BEGIN ENCRYPTED PRIVATE KEY-----加密-----BEGIN ENCRYPTED PRIVATE KEY-----密鑰是PKCS8編碼的。 所使用的對稱密碼(和IV)嵌入在密鑰中。 phpseclib當前僅支持pbeWithMD5AndDES-CBC。 pbe部分表示它正在使用PBKDF1。 也許這就是您的密鑰所使用的,也很難說。

基本上,如果您可以生成另一個相同的密鑰並發布它(連同用於解鎖它的密碼),那將很有幫助。 我可以將對cipher / pbkdf的支持添加到phpseclib中。

如果您想嘗試修改phpseclib,請隨時進行修改。 檢查以下switch語句:

https://github.com/phpseclib/phpseclib/blob/1.0.0/phpseclib/Crypt/RSA.php#L1225

但是就像我說的那樣-我也可以做到-我只需要您提供密鑰(或格式完全相同的密鑰!)

暫無
暫無

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

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