01.06.2005 16:15:15Импорт заданного ключа в контейнер Ответов: 4
Олег
Есть необходимость импорта в контейнер заданного мной же (32 байта) секретного ключа.
Прочитал ветку "Загрузка plaintext ключа в контекст 29.10.2004 20:53:57"
Попытался сделать описанное:
CryptAcquireContext(&hProvCP, ...);
CryptGenKey(hProvCP, CALG_G28147, CRYPT_PREGEN, &hKeyCP));
// data - 32 байта ключа
CryptSetKeyParam(hKeyCP, KP_X, data, NULL);

При вызове этой функции получаю ошибку 0x8009000a "указан неправильный тип".
Возможно я не понял объяснений. Возможно ли привести здесь код по импорту заданного пользователем ключа?

 
Ответы:
01.06.2005 16:17:07Олег
Ошибся немного. Код такой:
CryptAcquireContext(&hProvCP, ...);
CryptGenKey(hProvCP, CALG_GR3410EL, CRYPT_PREGEN, &hKeyCP));
// data - 32 байта ключа
CryptSetKeyParam(hKeyCP, KP_X, data, NULL);

02.06.2005 10:25:17Василий
Значение ключа должно передаваться в ф-ю CryptSetKeyParam так:
(LPBYTE)&x_blob, где

CRYPT_DATA_BLOB x_blob;
x_blob.cbData=32;
x_blob.pbData=(LPBYTE)data;
02.06.2005 12:49:40Олег
HCRYPTPROV hProvCP;
HCRYPTKEY hKeyCP;
BYTE *data = NULL;
DWORD dwErr;
if (!CryptAcquireContext(&hProvCP, "TestCP container",
CP_GR3410_2001_PROV, 0x4B, 0)) {
if (!CryptAcquireContext(&hProvCP, "TestCP container",
CP_GR3410_2001_PROV, 0x4B, CRYPT_NEWKEYSET)) {
}
}
if (!CryptGenKey(hProvCP, CALG_GR3410EL, CRYPT_PREGEN, &hKeyCP))
{
}
data = new BYTE[32];
CryptGenRandom(hProvCP, 32, data);
CRYPT_DATA_BLOB x_blob;
x_blob.cbData=32;
x_blob.pbData=(LPBYTE)data;
if (!CryptSetKeyParam(hKeyCP, KP_X, (LPBYTE)&x_blob, NULL))
{
// Здесь вылезает все та же ошибка //0x8009000a (NTE_BAD_TYPE)
}
delete [] data;

Можно попросить пример работающего кода импорта секретного ключа, заданного пользователем?
02.06.2005 16:14:23Василий
HCRYPTPROV hProvCP;
HCRYPTKEY hKeyCP;
BYTE *data = NULL;
DWORD dwErr;
if (!CryptAcquireContext(&hProvCP, "TestCP container",
CP_GR3410_2001_PROV, 0x4B, 0)) {
if (!CryptAcquireContext(&hProvCP, "TestCP container",
CP_GR3410_2001_PROV, 0x4B, CRYPT_NEWKEYSET)) {
}
}
if (!CryptGenKey(hProvCP, CALG_DH_EL_EPHEM, CRYPT_PREGEN, &hKeyCP))
{
}
data = new BYTE[32];
CryptGenRandom(hProvCP, 32, data);
CRYPT_DATA_BLOB x_blob;
x_blob.cbData=32;
x_blob.pbData=(LPBYTE)data;
if (!CryptSetKeyParam(hKeyCP, KP_X, (LPBYTE)&x_blob, NULL))
{
//
}
delete [] data;

ALG_ID alg;
alg=AT_KEYEXCHANGE; //или AT_SIGNATURE
if (!CryptSetKeyParam(hKeyCP, KP_ALGID, (LPBYTE)&alg, 0))
{
}