В ряде случаев программное обеспечение безопасности включает взаимодействие между (настольными) приложениями и веб-интерфейсами. Для (RSA) асимметричного шифрования мы используем C библиотека 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
Принимая во внимание, что часть заголовка закрытого ключа в кодировке pem, сгенерированного с помощью openssl PHP, выглядит следующим образом:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,372DA3A61BEB36AA
bc9NsTtdfcMW9t9isDPgl86aME223ockk9pIGDduEyrTS7zh1gwHWSWnD2efbxLd
Я пытался использовать некоторые расширения PHP, такие как phpseclib, но я все еще не могу использовать закрытый ключ, сгенерированный с C OpenSSL в программах PHP. Открытые ключи не зашифрованы, и их можно без проблем обменять между двумя языками.
Для генерации ключей RSA с C OpenSSL мы используем структуру EVP_PKEY.
Отредактировано автором 12 августа 2015 г.
В ответ Нейберту я сгенерировал зашифрованный закрытый ключ RSA с помощью утилиты OpenSSL «openssl genpkey»:
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-----
ключ в кодировке PKCS8. Используемый симметричный шифр (и IV) встроен в ключ. В настоящее время phpseclib поддерживает только pbeWithMD5AndDES-CBC. Часть pbe означает, что она использует PBKDF1. Может быть, это то, что использует ваш ключ, тоже трудно сказать.
В принципе, если вы сможете сгенерировать другой идентичный ключ и опубликовать его — вместе с паролем для разблокировки — это было бы полезно. Я могу добавить поддержку этого шифра / pbkdf в phpseclib.
Если вы хотите попробовать модифицировать phpseclib, не стесняйтесь делать это. Проверьте следующую инструкцию переключения:
https://github.com/phpseclib/phpseclib/blob/1.0.0/phpseclib/Crypt/RSA.php#L1225
Но, как я уже сказал, я тоже могу это сделать — мне просто нужно, чтобы вы предоставили ключ (или идентично отформатированный!)
Других решений пока нет …