Я пишу .Net Class, который читает cookie с нашего центрального сервера аутентификации.Он содержит идентификатор пользователя, некоторые временные метки и подпись, созданную openssl_sign () с использованием 2048-битного ключа RSA и хэша SHA1.
Текущий открытый ключ предоставляется на сервере в формате PEM openssl и время от времени изменяется.Я не могу прочитать Ключ, используя только управляемый код .Net, и разработал следующую процедуру, чтобы заставить его работать:
- Извлечение экспоненты и модуля из открытого ключа
- Проверка ключапо-прежнему 2048 бит
- Сохранение длины ключа, экспонента модуля в Source, компиляция и развертывание (удаление начальных нулей из модуля для его работы)
Затем класс создает new RSACryptoServiceProvider(2048)
и передает общедоступные компоненты, используя структуру RSAParameters
, в CSP.В этом случае проверка подписи будет успешной.
Я бы хотел, чтобы это работало без создания, компиляции и развертывания новой сборки каждый раз, когда изменяется ключ.Чтобы сделать вещи интересными, я хотел бы придерживаться только управляемого кода (исключая большинство примеров, которые я нашел).Что-то, что звучит идеально, это встроенный считыватель ASN.1 при создании экземпляра AsnEncodedData(oid, data)
, но единственный найденный мной oid, который мог бы соответствовать, RSA aka 1.2.840.113549.1.1.1, не работал и произвелнеобработанные байты только
1023 * Добавлено:. бывший открытый ключ
----- BEGIN PUBLIC KEY -----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMW90O6C17fapbS35auKolsy7kI0FOE1
C08y5HqgZ0rMXoocV4nHSHYBm2HVx2QSR5OLQtERgWDmxOu + vwU1GXUCAwEAAQ ==
----- КОНЕЦ ОБЩЕСТВЕННОГО КЛЮЧА -----
Я нашел pempublic.cs , который, кажется, решает эту проблему, используя (как кажется) исходный код из openSSL.Я оставлю вопрос открытым, чтобы посмотреть, есть ли другие решения.