Как импортировать открытый ключ для шифрования на C в Windows

У меня есть открытый ключ, и я хочу использовать его для шифрования части данных. Я пытаюсь импортировать открытый ключ, чтобы использовать его, но CryptImportKey выдает ошибку «не имеющий значения параметра».

В чем проблема?

Вот мой код:

if( !CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) )
{
    /*
     * Print error and return
     */
}
pblob->header->bType = PUBLICKEYBLOB;
pblob->header->aiKeyAlg = CALG_AES_128;
pblob->header->bVersion = CUR_BLOB_VERSION;
pblob->header->reserved = 0;
pblob->key_len = key_len;

memcpy(pblob->key, key , key_len);

if( !CryptImportKey( &hProv,
    (LPCBYTE)pblob,
    sizeof(*pblob),
    0,
    CRYPT_EXPORTABLE,
    &hKey ) )
{
    // Print error and return
}

person rimono    schedule 23.09.2010    source источник


Ответы (2)


Windows CryptoAPI не работает напрямую с текстовыми ключами; для этого вам нужно перепрыгнуть через обруч. Вот статья базы знаний, описывающая, как это сделать.

person Luke    schedule 24.09.2010
comment
Действительно обруч! Но я не уверен, что это то, что мне нужно. Прежде всего я понял, что на самом деле открытый ключ, который я хочу импортировать, используется для шифрования другого ключа и, следовательно, для обмена ключами, поэтому я изменил ALG_ID на CALG_RSA_KEYX, но все равно получаю ошибку. Что касается ключей сеанса открытого текста - я импортирую открытый ключ, и MSDN говорит, что такие ключи не зашифрованы, что я и хочу. Так что я не думаю, что мне нужен обруч ... - person rimono; 24.09.2010
comment
Вы уверены, что ваш ключевой BLOB-объект имеет правильный формат? См. msdn.microsoft.com/en-us/library/aa375601.aspx - person Luke; 24.09.2010
comment
Ну, прочитав ссылку, которую вы дали, я совсем не уверен! Фактически, это заставило меня понять, что здесь мне может не хватать даже большего. Дело в том, что открытый ключ, который я пытаюсь импортировать, взят из файла .pem. Теперь я понимаю, что недостаточно удалить верхний и нижний колонтитулы в файле .pem. Итак, я декодировал содержимое с помощью base64, но теперь я начинаю думать, что и этого недостаточно. Я понимаю, что содержимое находится в формате DER, и я не знаю, как преобразовать его во что-то, что я могу импортировать в CryptoApi. Любая идея? - person rimono; 26.09.2010
comment
Это решение действительно именно то, что мне нужно, и кажется, что это идеальный ответ. Тем не менее, по какой-то причине, когда я его реализую, последний CryptDecodeObjectEx, который должен быть из формата DER в структуру RSA, возвращает ошибку, указывающую, что встречено неверное значение тега ASN.1, и мне еще предстоит выяснить, что это означает. :-( - person rimono; 27.09.2010

Благодаря всему, что здесь было сказано, и продолжительному поиску, я нашел ответ в: http://www.ms-news.net/f2748/problem-importing-public-key-4052577.html

И использовал его для создания своей собственной программы, которую я разместил в другом потоке по адресу: Загрузить файл PEM X509 в Windows CryptoApi

person rimono    schedule 27.09.2010