Статус: Участник
Группы: Участники
Зарегистрирован: 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...
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close