Получить публичный ключ из сертификата - как?

Тема в разделе "WASM.CRYPTO", создана пользователем slow, 1 фев 2007.

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    сабж
     
  2. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Читать CryptoAPI, PKCS (12 вроде), ASN.1

    ЗЫ - Какой вопрос, такой ответ...
     
  3. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Да читаю я, читаю :) А PKCS нужен 7й :)
     
  4. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    hxxp://rsdn.ru/article/crypto/signature.xml
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Thx. У меня похоже проблема в чем-то другом :dntknw:
     
  6. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Код (Text):
    1. HCRYPTPROV hCertProv;
    2. //получаем дискриптор криптопровайдера
    3. if (!CryptAcquireContext(
    4.         &hCertProv,
    5.         NULL,
    6.         NULL,
    7.         75,
    8.         CRYPT_VERIFYCONTEXT))
    9. {
    10.         printf("Error CryptAcquireContext....");
    11.         getch();
    12.         return;
    13. }
    14. //открываем хранилище MY
    15. HCERTSTORE hStoreHandle;
    16. if ( !( hStoreHandle = CertOpenStore(
    17.         CERT_STORE_PROV_SYSTEM,
    18.         0,
    19.         NULL,
    20.         CERT_SYSTEM_STORE_CURRENT_USER,
    21.         //CERT_SYSTEM_STORE_LOCAL_MACHINE,
    22.         L"MY")))
    23. {
    24.         printf("Can't open store MY.");
    25. }
    26.  
    27. // получаем контекс сертификата
    28. PCCERT_CONTEXT pSignerCert;
    29. AnsiString Recepient="Имя_получателя";
    30. wchar_t buf[50];
    31. swprintf(buf,L"%S",Recepient);
    32. const void *signer = buf;
    33. pSignerCert = CertFindCertificateInStore(
    34.         hStoreHandle,
    35.         MY_ENCODING_TYPE,
    36.         0,
    37.         CERT_FIND_SUBJECT_STR,
    38.         signer,
    39.         NULL);
    40. if(!pSignerCert)
    41. {
    42.         ShowMessage( "Certificate isn't found");
    43.         return;
    44. }
    45. //получаем дескриптор открытого ключа
    46. HCRYPTKEY hPubKey;
    47. if(pSignerCert)
    48. {
    49.  
    50.         if (!CryptImportPublicKeyInfo(
    51.                 hCertProv,
    52.                 X509_ASN_ENCODING,
    53.                 &pSignerCert->pCertInfo->SubjectPublicKeyInfo,
    54.                 &hPubKey))
    55.         {
    56.                 printf("\nError CryptImportPublicKeyInfo...");
    57.                 getch();
    58.                 return;
    59.         }
    60.         CertFreeCertificateContext(pSignerCert);
    61. }
    62. else
    63. {
    64.         printf("\nCertContext not define...");
    65. }
    66.  
    67. //определение размера блоба открытого ключа
    68.  
    69. DWORD dwBlobLen;       
    70. if(!CryptExportKey(
    71.         hPubKey,
    72.         0,
    73.         PUBLICKEYBLOB,
    74.         0,
    75.         NULL,
    76.         &dwBlobLen))
    77. {
    78.      printf("Error computing BLOB length.");
    79. }
    80.  
    81.  
    82. BYTE *pbKeyBlob;       
    83. pbKeyBlob = (BYTE*)malloc(dwBlobLen);
    84.  
    85. if(!pbKeyBlob)
    86. {
    87.     printf("Out of memory. \n");
    88. }
    89. //--------------------------------------------------------------------
    90. // экспорт открытого ключа в блоб
    91. if(!CryptExportKey(
    92.    hPubKey,
    93.    0,
    94.    PUBLICKEYBLOB,
    95.    0,
    96.    pbKeyBlob,
    97.    &dwBlobLen))
    98. {
    99.     printf("Error during CryptExportKey.");
    100. }
    101.  
    102. //--------------------------------------------------------------------
    103. // открываем файл пишем в него блоб
    104. FILE *Public;
    105. Public = fopen("pub_test.bin", "w+b");
    106. if(!Public)
    107. {
    108.     ShowMessage( "Problem opening the file pub_test.bin\n" );
    109. }
    110.  
    111. if(!fwrite(pbKeyBlob,
    112.        1,
    113.        dwBlobLen,
    114.        Public))
    115. {
    116.     printf( "The public key can not be written to the 'pub_test.bin'\n" );
    117. }
    118. //--------------------------------------------------------------------
    119. //закрытие хэндлов и освобождение памяти
    120. fclose (Public);
    121. free(pbKeyBlob);
    122. if(hPubKey)
    123.      CryptDestroyKey(hPubKey);
    124. if(hCertProv)
    125.    CryptReleaseContext(hCertProv, 0);
    126. ShowMessage("The #CertPublicKey#ran to completion without error. \n");
    127. return;
    Но единственный касяк не находится сертификат если имя получателя на русском языке.
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Потому что юникод треба.
    Спасибо, я уже сделал все :)