0

多くの状況で、セキュリティ ソフトウェアは (デスクトップ) アプリケーションと Web インターフェイス間の相互作用を伴います。(RSA) 非対称暗号化には、OpenSSL のC ライブラリ(現在のバージョン 1.0.2d) を使用し、openssl PHP ライブラリを使用します。

すべての標準的なもの:

  • プライベート暗号化 (C++) データとパブリック復号化 (PHP)
  • 公開暗号化 (C++) データと非公開復号化 (PHP)

動作します。また、その逆: PHP -> C++ および C++ -> PHP

さらに、PHP で暗号化された秘密鍵を生成し、C/C++ でその鍵を復号化することもできます。しかし、その逆ではありません。C++ で生成および暗号化された秘密鍵を PHP で復号化したいのです。注: これは、キーを使用したデータの暗号化/復号化とは異なります。

問題は、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

phpseclibなどのいくつかの PHP 拡張機能を使用しようとしましたが、C OpenSSL で生成された秘密鍵を PHP プログラムでまだ使用できません。公開鍵は暗号化されていないため、2 つの言語間で問題なく交換できます。

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-----
4

1 に答える 1

1

-----BEGIN ENCRYPTED PRIVATE KEY-----キーは PKCS8 でエンコードされています。使用されている対称暗号 (および IV) は鍵に埋め込まれています。phpseclib は現在 pbeWithMD5AndDES-CBC のみをサポートしています。pbe の部分は、PBKDF1 を使用していることを意味します。多分それはあなたのキーも使用しているものです。言うのは難しいです。

基本的に、別の同一のキーを生成して、それをロック解除するためのパスワードとともに投稿できれば、それは役に立ちます。その暗号/pbkdf へのサポートを phpseclib に追加できます。

phpseclib を自分で変更してみたい場合は、お気軽に変更してください。次の switch ステートメントを確認します。

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

しかし、私が言ったように-私もそれを行うことができます-キー(または同じ形式のキー)を提供する必要があるだけです!

于 2015-08-07T15:08:20.650 に答える