在许多情况下,安全软件涉及(桌面)应用程序和web接口之间的交互。对于(RSA)非对称加密,我们使用C库 of OpenSSL (目前版本为1.0.2d ),并使用openssl 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“生成了一个加密的私密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-----发布于 2015-08-07 15:08:20
-----BEGIN ENCRYPTED PRIVATE KEY-----密钥是PKCS8编码的。所使用的对称密码(和IV)嵌入密钥中。phpseclib目前只支持pbeithMD5AndDES-CBC。pbe部分意味着它使用的是PBKDF1。也许你的钥匙也是这么用的,很难说。
基本上,如果您可以生成另一个相同的密钥并发布它-以及解锁它的密码-这将是有帮助的。我可以向phpseclib添加对密码/ pbkdf的支持。
如果您想自己修改phpseclib,可以随意修改。请检查以下开关语句:
https://github.com/phpseclib/phpseclib/blob/1.0.0/phpseclib/Crypt/RSA.php#L1225
但是就像我说的,我也能做到--我只需要你提供钥匙(或者一个格式相同的钥匙!)
https://stackoverflow.com/questions/31760532
复制相似问题