Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CryptExportKey не создает BLOB, MS Crypto API 
V
    Опции темы
Antropoid
Дата 9.12.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Привет. У меня проблемка.
Работаю с MS Crypto API
Код

    if (!CryptExportKey (hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, 
                         &dwKeyBlobLen)) 
    {
      wprintf (TEXT("Error %x during CryptExportKey!\n"), 
               GetLastError ());
      ::AfxMessageBox(L"Error during CryptExportKey!",MB_ICONERROR);
      showError(GetLastError ());
      goto exit;
    }

CryptExportKey отрабатывает неверно хоть ты тресни  smile 
GetLastError () возвращает 0.
Хендлы на ключики успешно созданы.

В чем может быть проблема?


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Alexandr87
Дата 11.12.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



по-возможности выложите сопутсвующий код. В частности, где вы вызываете AcquireContext, и где получаете дескрипторы на hKey и hXchgKey
PM Jabber   Вверх
NiJazz
Дата 11.12.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Может, с флагом намудрил? Попробуй использовать PRIVATEKEYBLOB или PUBLICKEYBLOB в зависимости от типа ключа.
PM MAIL   Вверх
Antropoid
Дата 12.12.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Цитата(NiJazz @  11.12.2007,  18:20 Найти цитируемый пост)
Может, с флагом намудрил? Попробуй использовать PRIVATEKEYBLOB или PUBLICKEYBLOB в зависимости от типа ключа.

Не проканало  smile 

Цитата(Alexandr87 @  11.12.2007,  16:40 Найти цитируемый пост)
по-возможности выложите сопутсвующий код. В частности, где вы вызываете AcquireContext, и где получаете дескрипторы на hKey и hXchgKey

Мой код взят из MSDN. Изменено только одно место:
Они делают так:
Код

if(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey)) 

а я достаю ключ из сертификата.. мож в этом лажа............
пример доставания взят с RSDN(сайт такой), да и код отрабатывает без ошибок. 
К тому же ключик достанный мною из сертификата шифрует данные на ура (но должен ли?).

Так что выкладывать?  smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
korbian
Дата 13.12.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 9
Всего: 14



все таки приведите весь код.

Это сообщение отредактировал(а) korbian - 13.12.2007, 09:34


--------------------
korbian ©
PM   Вверх
Antropoid
Дата 13.12.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Ну смотрите......сами напросились  smile 

Код

#include "stdafx.h"

#include <stdio.h>
#include <wincrypt.h>

#define BLOCK_SIZE            1000
#define BUFFER_SIZE           1008
#define CERT_STORE_NAME          L"MY"
#define SIGNER_NAME              L"st1"
#define MY_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

BOOL EncryptFile (LPTSTR lpszSource, LPTSTR lpszDestination, 
                  HCRYPTKEY &hXchgKey);
BOOL myGetKeyFromCert(HCRYPTKEY &hXchgKey);
void showError(DWORD d);
PCCERT_CONTEXT pSignerCert; 
HCERTSTORE hStoreHandle;
HCRYPTPROV hProv;

/***********************************************************************

  EncryptFile

***********************************************************************/
BOOL EncryptFile (LPTSTR lpszSource, LPTSTR lpszDestination, 
                  HCRYPTKEY &hXchgKey)
{
  FILE *hSrcFile = NULL, 
       *hDestFile = NULL;

  HCRYPTPROV hProv = 0;
  HCRYPTHASH hHash = 0;
  HCRYPTKEY hKey = 0;   
  //HCRYPTKEY hXchgKey = 0;

  PBYTE pbBuffer = NULL, 
        pbKeyBlob = NULL;

  BOOL bEOF = 0, 
       bReturn = FALSE;

  DWORD dwCount, 
        dwKeyBlobLen;


  // Open the source file.
  if ((hSrcFile = _wfopen (lpszSource, TEXT("rb"))) == NULL) 
  {
    wprintf (TEXT("Error opening Plaintext file!\n"));
    //::AfxMessageBox(L"Help!!",0,0);
    ::AfxMessageBox(L"Error opening Plaintext file!\n",MB_ICONERROR);

    goto exit;
  }

  // Open the destination file.
  if ((hDestFile = _wfopen (lpszDestination, TEXT("wb"))) == NULL) 
  {
    wprintf (TEXT("Error opening Ciphertext file!\n"));
    ::AfxMessageBox(L"Error opening Ciphertext file!\n",MB_ICONERROR);
    goto exit;
  }

  // Get the handle to the default provider.
  if(CryptAcquireContext(
     &hProv, 
     NULL, 
     NULL, 
     PROV_RSA_FULL, 
     0))
  {
      wprintf(TEXT("A crypto context has been acquired.\n\n"));
      ::AfxMessageBox(L"A crypto context has been acquired.");
  }
  else//else(1)
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  { 
  //--------------------------------------------------------------------
  // An error occurred in acquiring the context. This could mean
  // that the key container requested does not exist. In this case,
  // the function can be called again to attempt to create a new key 
  // container. Error codes are defined in winerror.h.

   if (GetLastError() == NTE_BAD_KEYSET)//if(2)
   {
     if(CryptAcquireContext(//if(3)
        &hProv, 
        NULL, 
        NULL, 
        PROV_RSA_FULL, 
        CRYPT_NEWKEYSET)) 
      {
        wprintf(TEXT("A new key container has been created.\n"));
        ::AfxMessageBox(L"A new key container has been created.\n");
      }
      else//else(3)
      {
        wprintf(TEXT("Could not create a new key container.\n"));
        ::AfxMessageBox(L"Could not create a new key container.\n",MB_ICONERROR);
        goto exit;
      }
   }
    else//else(2)
    {
        wprintf(TEXT("A cryptographic service handle could not be acquired.\n"));
        ::AfxMessageBox(L"A cryptographic service handle could not be acquired.\n",MB_ICONERROR);
        goto exit;
     }
    
  } // End of else.//else(1)
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++
    // Encrypt the file with a random session key.

  // Create a random session key.
    if (!CryptGenKey (hProv, CALG_RC2, CRYPT_EXPORTABLE, &hKey)) 
    {
      wprintf (TEXT("Error %x during CryptGenKey!\n"), 
               GetLastError ());
      goto exit;
    }
    // Get the handle to the key exchange public key.
             //Пробуем получить открытый ключ получателя из сертификата получателя
    if(!myGetKeyFromCert(hXchgKey))  {
          wprintf(TEXT("Error  during second myGetKeyFromCert!\n"), GetLastError());
          ::AfxMessageBox(L"Error during myGetKeyFromCert!",MB_ICONERROR);
          goto exit;
    }

    // Determine the size of the key BLOB and allocate memory.
    if (!CryptExportKey (hKey, hXchgKey, /*SIMPLEBLOB*/PUBLICKEYBLOB, 0, NULL, 
                         &dwKeyBlobLen)) 
    {
      //wprintf (TEXT("Error %x computing blob length!\n"), 
        //       GetLastError ());
      ::AfxMessageBox(L"Error computing blob length!",MB_ICONERROR);
      showError(GetLastError ());      
      goto exit;
    }

    if ((pbKeyBlob = (PBYTE)malloc(dwKeyBlobLen))==NULL) 
    {
      wprintf (TEXT("Out of memory!\n"));
      ::AfxMessageBox(L"Out of memory!",MB_ICONERROR);
      showError(GetLastError ());
      goto exit;
    }

    // Export the session key into a simple key BLOB.
    if (!CryptExportKey (hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, 
                         &dwKeyBlobLen)) 
    {
      wprintf (TEXT("Error %x during CryptExportKey!\n"), 
               GetLastError ());
      ::AfxMessageBox(L"Error during CryptExportKey!",MB_ICONERROR);
      showError(GetLastError ());
      goto exit;
    }

    // Write the size of key BLOB to the destination file.
    fwrite (&dwKeyBlobLen, sizeof (DWORD), 1, hDestFile);

    if (ferror (hDestFile)) 
    {
      wprintf (TEXT("Error writing header!\n"));
      goto exit;
    }

    // Write the key BLOB to the destination file.
    fwrite (pbKeyBlob, 1, dwKeyBlobLen, hDestFile);

    if (ferror (hDestFile)) 
    {
      wprintf (TEXT("Error writing header!\n"));
      goto exit;
    }

//++++++++++++++++++++++++++++++++++++++
   // Allocate memory.
  if ((pbBuffer=(PBYTE)malloc(dwKeyBlobLen))==NULL) 
  {
    wprintf (TEXT("Out of memory!\n"));    
    ::AfxMessageBox(L"Out of memory!\n",MB_ICONERROR);
    goto exit;
  }

  // Encrypt the source file and write to the destination file.
  do 
  {
    // Read up to BLOCK_SIZE bytes from the source file.
    dwCount = fread (pbBuffer, 1, BLOCK_SIZE, hSrcFile);

    if (ferror (hSrcFile)) 
    {
      wprintf (TEXT("Error reading Plaintext!\n"));
      ::AfxMessageBox(L"Error reading Plaintext!\n",MB_ICONERROR);
      goto exit;
    }

    bEOF = feof (hSrcFile);

    // Encrypt the data.
    if (!CryptEncrypt (hKey/*hXchgKey*/, 0, bEOF, 0, pbBuffer, &dwCount, 
                       BUFFER_SIZE)) 
    {
      wprintf (TEXT("bytes required:%d\n"), dwCount);
      wprintf (TEXT("Error %x during CryptEncrypt!\n"), 
               GetLastError ());
      showError(GetLastError ());
      ::AfxMessageBox(L"Error %x during CryptEncrypt!\n",MB_ICONERROR);
      goto exit;
    }

    // Write the data to the destination file.
    fwrite (pbBuffer, 1, dwCount, hDestFile);

    if (ferror (hDestFile)) 
    {
      wprintf (TEXT("Error writing Ciphertext!\n"));
      ::AfxMessageBox(L"Error writing Ciphertext!\n",MB_ICONERROR);
      goto exit;
    }
  } while (!bEOF);

  bReturn = TRUE;

  wprintf (TEXT("OK\n"));

exit:

   // Close the files.
  if (hSrcFile) 
    fclose (hSrcFile);

  if (hDestFile) 
    fclose (hDestFile);

  // Free memory.
  if (pbKeyBlob) 
    free (pbKeyBlob);

  if (pbBuffer) 
    free (pbBuffer);

  // Destroy the session key.
  if (hKey) 
    CryptDestroyKey (hKey);

  // Release the key exchange key handle.
  if (hXchgKey) 
    CryptDestroyKey (hXchgKey);

  // Destroy the hash object.
  if (hHash) 
    CryptDestroyHash (hHash);

  // Release the provider handle.
  if (hProv) 
    CryptReleaseContext (hProv, 0);

  return bReturn;
}


void showError(DWORD d) {
    switch(d) {
        case ERROR_INVALID_HANDLE:
            ::AfxMessageBox(L"ERROR_INVALID_HANDLE",MB_ICONERROR);
            break;
        case ERROR_INVALID_PARAMETER:
            ::AfxMessageBox(L"ERROR_INVALID_PARAMETER",MB_ICONERROR);
            break;
        case NTE_BAD_ALGID:
            ::AfxMessageBox(L"NTE_BAD_ALGID",MB_ICONERROR);
            break;            
        case NTE_BAD_DATA:
            ::AfxMessageBox(L"NTE_BAD_DATA ",MB_ICONERROR);
            break;
        case NTE_BAD_FLAGS:
            ::AfxMessageBox(L"NTE_BAD_FLAGS ",MB_ICONERROR);
            break;
        case NTE_BAD_HASH:
            ::AfxMessageBox(L"NTE_BAD_HASH",MB_ICONERROR);
            break;
        case NTE_BAD_HASH_STATE: 
            ::AfxMessageBox(L"NTE_BAD_HASH_STATE ",MB_ICONERROR);
            break;
        case NTE_BAD_KEY: 
            ::AfxMessageBox(L"NTE_BAD_KEY",MB_ICONERROR);
            break;
        case NTE_BAD_LEN:  
            ::AfxMessageBox(L"NTE_BAD_LEN ",MB_ICONERROR);
            break;
        case NTE_BAD_UID:
            ::AfxMessageBox(L"NTE_BAD_UID",MB_ICONERROR);
            break;
        case NTE_DOUBLE_ENCRYPT:
            ::AfxMessageBox(L"NTE_DOUBLE_ENCRYPT",MB_ICONERROR);
            break;
        case NTE_FAIL:
            ::AfxMessageBox(L"NTE_FAIL",MB_ICONERROR);
            break;
        case NTE_NO_MEMORY:
            ::AfxMessageBox(L"NTE_NO_MEMORY ",MB_ICONERROR);
            break;
        case NTE_BAD_PUBLIC_KEY:
            ::AfxMessageBox(L"NTE_BAD_PUBLIC_KEY",MB_ICONERROR);
            break;            
        default:
            ::AfxMessageBox(L"Unknown Error",MB_ICONERROR);
    }
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BOOL myGetKeyFromCert(HCRYPTKEY &hXchgKey) {
  // Открываем хранилище сертификатов
  //HCERTSTORE hStoreHandle;
  BOOL bReturn = FALSE;  

  if ( !( hStoreHandle = CertOpenStore(
    CERT_STORE_PROV_SYSTEM,
    0,
    NULL,
    CERT_SYSTEM_STORE_CURRENT_USER,
    //CERT_SYSTEM_STORE_LOCAL_MACHINE,
    CERT_STORE_NAME)))
  {
    ::AfxMessageBox(L"Cant open store",MB_ICONERROR);
    goto exit;
    //HandleError("Нельзя открыть хранилище MY.");
  }

// Получаем указатель на наш сертификат
  //PCCERT_CONTEXT pSignerCert; 

  if(pSignerCert = CertFindCertificateInStore(
    hStoreHandle,
    MY_TYPE,
    0,
    CERT_FIND_SUBJECT_STR,
    SIGNER_NAME,
    NULL))
  {
    ::AfxMessageBox(L"Certificate found!",MB_OK);
    //printf("Сертификат найден.\n");
  }
  else
  {
    ::AfxMessageBox(L"Cant find certificate",MB_ICONERROR);
    goto exit;
    //HandleError( "Сертификат не найден.");
  }


// через функцию CryptAcquireCertificatePrivateKey получаем доступ к CSP
// одна из самых интересных и полезных функций в CryptoAPI
  //HCRYPTPROV hProv;
  DWORD dwKeySpec; 
  BOOL fCallerFreeProv; 

  if(CryptAcquireCertificatePrivateKey(
    pSignerCert, 
    CRYPT_ACQUIRE_COMPARE_KEY_FLAG, 
    NULL, 
    &hProv, 
    &dwKeySpec, 
    &fCallerFreeProv
  ))
  {
     ::AfxMessageBox(L"CryptAcquireCertificatePrivateKey success executed",MB_OK);
     /*switch(fCallerFreeProv) {
     case AT_KEYEXCHANGE:
         ::AfxMessageBox(L"AT_KEYEXCHANGE",MB_OK);
         break;
     case AT_SIGNATURE:
         ::AfxMessageBox(L"AT_SIGNATURE",MB_OK);
         break;
     }*/
   // printf("CryptAcquireCertificatePrivateKey выполнилась успешно!\n");
  }
  else
  {
      ::AfxMessageBox(L"CryptAcquireCertificatePrivateKey ERROR",MB_ICONERROR);
      showError( GetLastError ());
      goto exit; 
      //HandleError(" Ошибка CryptAcquireCertificatePrivateKey.\n");
  }

  DWORD dwUserNameLen = 100;    
  CHAR szUserName[100];
  
  if(CryptGetProvParam(
    hProv,              // Дескриптор на CSP
    PP_NAME,            // параметр для получения имени CSP
    (BYTE *)szUserName, // Указатель на буфер, содержащий имя CSP
    &dwUserNameLen,     // длина буфера 
    0)) 
  {
   // printf("Имя CSP: %s\n",szUserName);
  }
  else
  {
    ::AfxMessageBox(L"Error CryptGetProvParam",MB_ICONERROR);
    goto exit; 
    //HandleError("Ошибка CryptGetProvParam.\n");
  }

  if(CryptGetProvParam(
    hProv,              // Дескриптор на CSP
    PP_CONTAINER,       // параметр для получения имени key container  
    (BYTE *)szUserName, // Указатель на буфер, содержащий имя key container
    &dwUserNameLen,     // длина буфера
    0)) 
  {
   // printf("Имя key container: %s\n",szUserName);
  }
  else
  {
    ::AfxMessageBox(L"Error CryptGetProvParam.",MB_ICONERROR);
    goto exit; 
    //HandleError("Ошибка CryptGetProvParam.\n");
  }

// Импортируем public key для последующей верификации
  HCRYPTKEY hPubKey;

  if(CryptImportPublicKeyInfo(
    hProv, 
    MY_TYPE, 
    &(pSignerCert->pCertInfo->SubjectPublicKeyInfo),
    &hPubKey
  ))
  {
    ::AfxMessageBox(L"Public Key Imported successfully",MB_OK);
    hXchgKey = hPubKey;
    //printf("Импортирован public key.\n");
  }
  else
  {
    ::AfxMessageBox(L"CryptAcquireContext ERROR",MB_ICONERROR);
    goto exit; 
    //HandleError("Ошибка CryptAcquireContext.");
  }

  bReturn = TRUE;  
exit:
   /**if(hProv) 
    CryptReleaseContext(hProv, 0);

  if(pSignerCert)
    CertFreeCertificateContext(pSignerCert);

  if(CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG))
  {
    //printf("Хранилище закрыто. \n");
    ::AfxMessageBox(L"Store closed succusfully",MB_OK);
  }
  else
  {
    //printf("Ошибка!");
    ::AfxMessageBox(L"Error during closing store",MB_ICONERROR);
  }*/
  return bReturn;
}



--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
korbian
Дата 14.12.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 9
Всего: 14



Откуда уверенность, что оба ключа (експортируемый и тот, на котором он будет шифроватся из одного CSP)? в OID ключа из сертификата точно есть упоминание о RSA?
Код

  if(CryptGetProvParam(
    hProv,              // Дескриптор на CSP
    PP_NAME,            // параметр для получения имени CSP
    (BYTE *)szUserName, // Указатель на буфер, содержащий имя CSP
    &dwUserNameLen,     // длина буфера 
    0)) 
  {
      printf("Имя CSP: %s\n",szUserName);   //что выводится???????????????????????????????
  }


Добавлено через 3 минуты и 53 секунды
А почему не так?
Код

  if(CryptImportPublicKeyInfo(
    hProv, 
    MY_TYPE, 
    &(pSignerCert->pCertInfo->SubjectPublicKeyInfo),
    &hXchgKey
  ))
  {
    ::AfxMessageBox(L"Public Key Imported successfully",MB_OK);
    //hXchgKey = hPubKey;
    //printf("Импортирован public key.\n");
  }



--------------------
korbian ©
PM   Вверх
Antropoid
Дата 15.12.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Цитата(korbian @  14.12.2007,  09:08 Найти цитируемый пост)
Откуда уверенность, что оба ключа (експортируемый и тот, на котором он будет шифроватся из одного CSP)?

А разве это нужно?

Цитата(korbian @  14.12.2007,  09:08 Найти цитируемый пост)
в OID ключа из сертификата точно есть упоминание о RSA?

Что такое OID ? И в программе PROV_RSA_FULL - это флаг для создания CSP по умолчанию.
Цитата(korbian @  14.12.2007,  09:08 Найти цитируемый пост)
А почему не так?

ньюансы  smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
korbian
Дата 15.12.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 9
Всего: 14



Цитата(Antropoid @  15.12.2007,  01:52 Найти цитируемый пост)
А разве это нужно?

помоему, это обязательное условие для экспорта.

простите, конечно же AID(OID более широкое понятие) - algoritm id. то есть иденификатор алгоритма. если ваш сертификат содержит ключ RSA (в сертификате указан AID RSA), то он должен был хранится в хранилице смертификатов csp для RSA по умолчанию. и все тогда должно быть ок.

Что выводится на экран????
Код

if(CryptGetProvParam(
    hProv,              // Дескриптор на CSP
    PP_NAME,            // параметр для получения имени CSP
    (BYTE *)szUserName, // Указатель на буфер, содержащий имя CSP
    &dwUserNameLen,     // длина буфера 
    0)) 
  {
      printf("Имя CSP: %s\n",szUserName);   //что выводится???????????????????????????????
  }



--------------------
korbian ©
PM   Вверх
Antropoid
Дата 15.12.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Цитата(korbian @  15.12.2007,  11:06 Найти цитируемый пост)
помоему, это обязательное условие для экспорта.


Цитата(korbian @  15.12.2007,  11:06 Найти цитируемый пост)
 если ваш сертификат содержит ключ RSA (в сертификате указан AID RSA), то он должен был хранится в хранилице смертификатов csp для RSA по умолчанию.

Нет. Он у меня хранится в Хранилище Сертификатов "Личные" (оно же "MY").

Цитата(korbian @  15.12.2007,  11:06 Найти цитируемый пост)
Что выводится на экран????

Microsoft Enhanced Cryptographic Provider v1.0
но даже написав так:
Код

if(CryptAcquireContext(
     &hProv, 
     NULL,
     MS_ENHANCED_PROV,
     PROV_RSA_FULL, 
     0))
  {

ошибка не ушла  smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
korbian
Дата 15.12.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 9
Всего: 14



я вам говорил, что оба ключа должны находится в одном криптовайдере и в одном контейнере. я думаю, проблему можно решить так:
здесь запомнить имя контейнера
Код

if(CryptGetProvParam(
    hProv,              // Дескриптор на CSP
    PP_CONTAINER,       // параметр для получения имени key container  
    (BYTE *)szUserName, // Указатель на буфер, содержащий имя key container
    &dwUserNameLen,     // длина буфера
    0)) 
  {
   // printf("Имя key container: %s\n",szUserName);
  }
  else
  {
    ::AfxMessageBox(L"Error CryptGetProvParam.",MB_ICONERROR);
    goto exit; 
    //HandleError("Ошибка CryptGetProvParam.\n");
  }

szUserName отдать на верх. 
после этого подставить его вторым аргументом в CryptAcquireContext()
 


--------------------
korbian ©
PM   Вверх
Antropoid
Дата 18.12.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



szUserName не проканало.....а вот, если сохранить дескриптор на CSP (hProv) при открытии сертификата, а затем его же использовать при шифровании, то все получается  smile 
+1  !!!

Это сообщение отредактировал(а) Antropoid - 18.12.2007, 10:51


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Arty007
Дата 4.12.2010, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ГоЛоВа



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.11.2010
Где: Odessa, Ukraine

Репутация: нет
Всего: нет



вижу, что тема старая, но мне необходимая. мне вот например надо сессионный ключ создать алгоритмом CALG_AES_256 используя криптопровайдер MS_ENH_RSA_AES_PROV. но у меня сертификат вроде создан на стандартном криптопровайдере, и получается, что когда я буду шифровать и разшифровывать сессионный ключ, то попутаются криптопровайдеры и будет ошибка. так как шифровать я буду используя CryptExportKey , а разшифровывать - CryptImportKey. но когда я воспользуюсь функцией CryptAcquireCertificatePrivateKey то она мне вернет криптопровайдер и контейнер для данного сертефиката, т.е. отличный от того на котором я шифровал (MS_ENH_RSA_AES_PROV) и будет ошибка. т.е. чтобы мне нормально работать то мне уже до шифрования сессионного ключа надо вызвать CryptAcquireCertificatePrivateKey, чтобы получить ссылку на правильный криптопровайдер и чтобы небыло ошибок в дальнейшем?
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1230 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.