Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Карен  
#1 Оставлено : 3 февраля 2016 г. 13:14:59(UTC)
Карен

Статус: Участник

Группы: Участники
Зарегистрирован: 01.02.2016(UTC)
Сообщений: 15
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 3 раз
Вообще, у меня задача научиться шифровать и расшифровывать данные на устройстве (iPad).
Но для начала я хочу просто научиться генерировать ключи. Любые.
Начал с AT_KEYEXCHANGE и AT_SIGNATURE.

Ничего не получается: при вызове функции CryptGenKey приложение останавливается.
Никаких ошибок или эксепшнов (ставил брейкпоинт на все исключения). Просто выполнение дальше этого вызова не идет.
Подскажите, пожалуйста, в чем тут проблема.

Мой код получения ключей для цифровой подписи:


Код:
#import "EncryptionDecryption.h"

#import <CPROCSP/CPROCSP.h>



static HCRYPTPROV hCryptProv = 0;        // Дескриптор контекста  критографического провайдера.
static HCRYPTKEY hKey = 0;               // Дескриптор открытого/закрытого ключа.

static void CleanUp(void);
static void HandleError(char *s);


extern bool USE_CACHE_DIR;
bool USE_CACHE_DIR = false;

@implementation EncryptionDecryption

void CleanUp(void){
 
}


void HandleError(char *s){
    
}

+(void)encryptStuff{
    NSString *message = @"encrypt me!";
    
    // Объявление и инициализация переменных.
    LPSTR pszUserName;            // Буфер для хранения имени  ключевого контейнера.
    DWORD dwUserNameLen;          // Длина буфера.
    LPCSTR UserName = "ContainerName";              // Добавленное по выбору имя пользователя
    // здесь будет использовано как имя
    // ключевого контейнера (ограничение на 100 символов).
    if(CryptAcquireContext(
                           &hCryptProv,               // Дескриптор CSP
                           UserName,                  // Имя контейнера
                           NULL,                      // Использование провайдера по умолчанию
                           PROV_GOST_2001_DH,         // Тип провайдера
                           0))                        // Значения флагов
    {
        printf("A cryptcontext with the %s key container has been acquired.\n", UserName);
    }
    else
    {
        // Создание нового контейнера.
        if(!CryptAcquireContext(
                                &hCryptProv,
                                UserName,
                                NULL,
                                PROV_GOST_2001_DH,
                                CRYPT_NEWKEYSET))
        {
            //HandleError("Could not create a new key container.\n");
        }
        printf("A new key container has been created.\n");
    }
    
//    // Криптографический контекст с ключевым контейнером доступен. Получение
//    // имени ключевого контейнера.

    
    
    // Лучше использовать auto_ptr:
    //std::auto_ptr<char> aptrUserName(new char[dwUserNameLen+1]);
    //szUserName = aptrUserName.get();
    pszUserName=(char *)malloc((dwUserNameLen+1));
    
    if(!CryptGetProvParam(
                          hCryptProv,               // Дескриптор CSP
                          PP_CONTAINER,             // Получение имени ключевого контейнера
                          (LPBYTE)pszUserName,      // Указатель на имя ключевого контейнера
                          &dwUserNameLen,           // Длина имени
                          0))
    {
        // Ошибка получении имени ключевого контейнера
        free(pszUserName);
        printf("error occurred getting the key container name.");
    }
    
    printf("A crypto context has been acquired and \n");
    printf("The name on the key container is %s\n\n", pszUserName);
    free(pszUserName);
    
    

    
   // Контекст с ключевым контейнером доступен,
    // попытка получения дескриптора ключа подписи

    if(CryptGetUserKey(
                       hCryptProv,
                       AT_SIGNATURE,
                       &hKey))
    {
        printf("An signature key exists. \n");
    }
    else
    {
        printf("No signature key is available.\n");
        
        // Ошибка в том, что контейнер не содержит ключа.
        if(!(CSP_GetLastError() == (DWORD)NTE_NO_KEY))
            printf("An error other than NTE_NO_KEY getting signature key.\n");
        
        
        
        // Создание подписанной ключевой пары.
        printf("The signature key does not exist.\n");
        printf("Creating a signature key pair...\n");
        
        if(!CryptGenKey(              //<——————————————————ЗДЕСЬ ВСЕ ОСТАНАВЛИВАЕТСЯ
                        hCryptProv,
                        AT_SIGNATURE,
                        0,
                        &hKey))
        {
            printf("Error occurred creating a signature key.\n");
        }
        printf("Created a signature key pair.\n");
        
    




    }
    
    CleanUp();
    
    //printf("Everything is okay. An exchange key exists in\n");
   
    printf("the %s key container.\n", UserName);
    
 
    
}


@end



Вот что выводится в консоли:

Код:
cpcsp: 0x35dfd9dc: :946 read_keyset code==RDR_ERR_FILE_NOT_FOUND fail
cpcsp: 0x35dfd9dc: :751 OpenContainer OpenContainer key_carrier_open fail (0x80090019)
cpcsp: 0x35dfd9dc: :523 CPCAcquireContext (pszContainer=ContainerName, dwFlags=0x0). Result=0, Err=0x80090019. hProv=0.
cpcsp: 0x35dfd9dc: :523 CPCAcquireContext (pszContainer=ContainerName, dwFlags=0x8). Result=1, Err=0x0. hProv=1222246570.
A new key container has been created.
A crypto context has been acquired and 
The name on the key container is ContainerName

No signature key is available.
The signature key does not exist.
Creating a signature key pair...
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.