Добрый день.
Существует следующая проблема:
необходимо получить закрытый ключ подписи в расшифрованном виде.
Для этого применяется следующая схема:
1) AcquireContext( &hProv, CONT_NAME, CRYPT_MACHINE_KEYSET, &VTableProv );
2) GetUserKey( hProv, AT_SIGNATURE, &hSignKey );
3) GenKey( hProv, CALG_G28147, 0, &hCryptKey );
4) dparam = CRYPT_MODE_ECB;
SetKeyParam( hProv, hCryptKey, KP_MODE, pdparam, 0 ); // pdparam == &dparam
5) DuplicateKey( hProv, hCryptKey, NULL, 0, &hDecryptKey );
6) dparam = CALG_PRO_EXPORT;
SetKeyParam( hProv, hCryptKey, KP_ALGID, pdparam, 0 ); // pdparam == &dparam
7) ExportKey( hProv, hSignKey, hCryptKey, PRIVATEKEYBLOB, 0, &pucDataBuf[ 0 ], &uiDataBufLen );
8) SetKeyParam( hProv, hDecryptKey, KP_IV, pucCont1IV, 0 ); // pucCont1IV - IV ключа
9) Decrypt( hProv, hDecryptKey, 0, 0, 0, pucCont1PrivKey, &uiDataBufLen ); // pucCont1PrivKey - тело ключа
Правилен ли такой подход? Особенно интересны п.7 и п.9, в которых используются
по сути разные ключи (с разными параметрами) для симметричных действий
(зашифрование/расшифрование).