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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline al  
#1 Оставлено : 12 мая 2015 г. 20:27:16(UTC)
al

Статус: Активный участник

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Есть система Клиент-Сервер.
Клиент - это карта.
Сервер - это программа, использующая CryptoPro CSP (CryptoPro CSP version=3.6.7491 на Debian 7.8 x64).
Клиент формирует криптограмму на неком ключе.
Этот ключ на Сервере - суть ключ, диверсифицированный по п.7 Secret Key Diversification rfc4357.
Пытаюсь на Сервере импортировать криптограмму.
Выдает: 0x80090010.
Делаю "танцы с бубнами" на Сервере:
Назовем наш диверсифицированный ключ - "Б".
Ключ на основе которого он получен - "А".
1) Экспортирую "Б" на "А" в блоб
2) Тут же импортирую этот блоб на "А", получая новый хендл, скажем, "С".
3) Выставляю атрибуты на "С" (алгоритм, режим, паддинг, вектор).
4) Импортирую криптограмму на "С"- криптограмма импортируется.

Вопрос: действительно ли нельзя импортировать криптограммы на диверсифицированных ключах. Если можно, то скажите как.

Спасибо.

Отредактировано пользователем 12 мая 2015 г. 20:48:29(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#2 Оставлено : 13 мая 2015 г. 8:24:43(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
А сможете привести код?
Знания в базе знаний, поддержка в техподдержке
Offline al  
#3 Оставлено : 13 мая 2015 г. 9:06:19(UTC)
al

Статус: Активный участник

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Удалил громоздкий пост. Он только запутывал всё дело.

Отредактировано пользователем 13 мая 2015 г. 13:51:46(UTC)  | Причина: удалил громоздкий запутывающий дело пост

Offline al  
#4 Оставлено : 13 мая 2015 г. 9:16:39(UTC)
al

Статус: Активный участник

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Удалил ненужный пост.

Отредактировано пользователем 13 мая 2015 г. 13:53:01(UTC)  | Причина: Удалил ненужный пост.

Offline al  
#5 Оставлено : 13 мая 2015 г. 10:22:58(UTC)
al

Статус: Активный участник

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Удалил ненужный пост.

Отредактировано пользователем 13 мая 2015 г. 13:53:19(UTC)  | Причина: Удалил ненужный пост.

Offline al  
#6 Оставлено : 13 мая 2015 г. 12:01:50(UTC)
al

Статус: Активный участник

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
На самом деле не работает также и экспорт ключа на дивключе. Только ошибка другая (0x8009000b)
Выкладываю тестовый пример на экспорт (импорт ведет себя аналогично, только завершается с 0x80090010).

Цитата:

// Настоящий файл может использоваться только в целях обучения
//
#include <stdio.h>
#ifdef _WIN32
# include <windows.h>
# include <wincrypt.h>
# include <WinCryptEx.h>
#else
# include <string.h>
# include <stdlib.h>
# include <ctype.h>
# include <unistd.h>
# include <CSP_WinDef.h>
# include <CSP_WinCrypt.h>
# include <WinCryptEx.h>
#endif

#ifdef _WIN32
#pragma warning( push )
#pragma warning( disable : 4996 )
#endif

#ifdef _WIN32
#define TEMP_CONTAINER_NAME "\\\\.\\REGISTRY\\tmp_cont"
#else
#define TEMP_CONTAINER_NAME "\\\\.\\hdimage\\tmp_cont"
#endif

#define DIV_DATA_SZ 32

int main(int argc, char *argv[]) {

BYTE PIN_TO_CONT[]={'1','1','1','1','1','1','1','1','\0'};

HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hDivKey = 0;
HCRYPTKEY hSessionKey = 0;

BYTE blob[sizeof(CRYPT_DIVERSBLOB)+DIV_DATA_SZ];
CRYPT_DIVERSBLOB * Blob = (CRYPT_DIVERSBLOB*)blob;
DWORD dwTmp;
BYTE div_data[DIV_DATA_SZ]={
0,1,2,3,4,5,6,7,
0,1,2,3,4,5,6,7,
0,1,2,3,4,5,6,7,
0,1,2,3,4,5,6,7};

BYTE *pbKeyBlobSimple = NULL;
DWORD dwBlobLenSimple;
BYTE iv[SEANCE_VECTOR_LEN];

//создаем ключ (hKey), на основе которого впоследствии получим дивключ
if(CryptAcquireContext(
&hProv,
TEMP_CONTAINER_NAME,
NULL,
PROV_GOST_2001_DH,
0)
) {
CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, PIN_TO_CONT, 0);
} else {
if(!CryptAcquireContext(
&hProv,
TEMP_CONTAINER_NAME,
NULL,
PROV_GOST_2001_DH,
CRYPT_NEWKEYSET)
) {
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, PIN_TO_CONT, 0);
}

if(!CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hKey)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}

//диверсифицируем hKey, получаем hDivKey
Blob->DiversBlobHeader.BlobHeader.bType = DIVERSKEYBLOB;
Blob->DiversBlobHeader.BlobHeader.bVersion = BLOB_VERSION;
Blob->DiversBlobHeader.BlobHeader.aiKeyAlg = CALG_G28147;
Blob->DiversBlobHeader.aiDiversAlgId = CALG_PRO_DIVERS;
Blob->DiversBlobHeader.dwDiversMagic = DIVERS_MAGIC;
Blob->DiversBlobHeader.cbDiversData = DIV_DATA_SZ;
CopyMemory((LPBYTE)Blob->bDiversData,div_data,DIV_DATA_SZ);
if(!CryptImportKey(hProv, blob, sizeof(CRYPT_DIVERSBLOB)+DIV_DATA_SZ,
hKey, CRYPT_EXPORTABLE, &hDivKey))
{
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}

//генерим сессионный
if(!CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}

#if 1
//экспорт сессионного на дивключе (hDivKey)
dwTmp = CALG_SIMPLE_EXPORT;
if(!CryptSetKeyParam(hDivKey, KP_ALGID, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = CRYPT_MODE_ECB;
if(!CryptSetKeyParam(hDivKey, KP_MODE, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = ZERO_PADDING;
if(!CryptSetKeyParam(hDivKey, KP_PADDING, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memset(iv,0,SEANCE_VECTOR_LEN);
if(!CryptSetKeyParam(hDivKey, KP_IV, iv, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptExportKey(hSessionKey, hDivKey, SIMPLEBLOB, 0, NULL, &dwBlobLenSimple)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
pbKeyBlobSimple = (BYTE*)malloc(dwBlobLenSimple);
if(!pbKeyBlobSimple){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptExportKey(hSessionKey, hDivKey, SIMPLEBLOB, 0, pbKeyBlobSimple, &dwBlobLenSimple)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
free(pbKeyBlobSimple);
#else
//экспорт сессионного на ключе, который диверсифицировали (hKey)
dwTmp = CALG_SIMPLE_EXPORT;
if(!CryptSetKeyParam(hKey, KP_ALGID, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = CRYPT_MODE_ECB;
if(!CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = ZERO_PADDING;
if(!CryptSetKeyParam(hKey, KP_PADDING, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memset(iv,0,SEANCE_VECTOR_LEN);
if(!CryptSetKeyParam(hKey, KP_IV, iv, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptExportKey(hSessionKey, hKey, SIMPLEBLOB, 0, NULL, &dwBlobLenSimple)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
pbKeyBlobSimple = (BYTE*)malloc(dwBlobLenSimple);
if(!pbKeyBlobSimple){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptExportKey(hSessionKey, hKey, SIMPLEBLOB, 0, pbKeyBlobSimple, &dwBlobLenSimple)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
free(pbKeyBlobSimple);
#endif

}
#ifdef _WIN32
#pragma warning( pop )
#endif


При '#if 1' производится экспорт криптограммы на дивключе. (не работает)
При '#if 0' производится экспорт криптограммы на ключе, который диверсифицировали. (работает)

makefile:
Цитата:

CFLAGS=-DUNIX -DHAVE_LIMITS_H $(ARCH_FLAGS) $(add_CPPFLAGS) -I$(CSP_INCLUDE) -I$(CSP_INCLUDE)/cpcsp -I$(CSP_INCLUDE)/asn1c/rtsrc -I$(CSP_INCLUDE)/asn1data -DSIZEOF_VOID_P=$(SIZEOF_VOID_P) -g
LDFLAGS= $(ARCH_FLAGS) -L$(CSP_LIB) -lasn1data -lssp -lcapi10 -lcapi20 $(CSP_EXTRA_LIBS) $(add_ldflags) -g

test: test.o
gcc test.o $(LDFLAGS) -o $@ $(add_libs)

test.o: test.c
gcc $(CFLAGS) -c -o $@ test.c

clean:
rm test test.o



В терминале запускаю окружение для сборки:
Цитата:

eval `/opt/cprocsp/src/doxygen/setenv.sh`

Отредактировано пользователем 13 мая 2015 г. 12:21:48(UTC)  | Причина: Не указана

Offline al  
#7 Оставлено : 13 мая 2015 г. 13:35:59(UTC)
al

Статус: Активный участник

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Для полноты, привожу также готовый пример на импорт.
Здесь, если '#if 1', то импортируем сессионный ключ (hSessionkey) на ключе, который подлежал диверсификации (hKey), если '#if 0', то импортируем сессионный ключ (hSessionkey) на дивключе (hDivKey).

Цитата:

// Настоящий файл может использоваться только в целях обучения
//
#include <stdio.h>
#ifdef _WIN32
# include <windows.h>
# include <wincrypt.h>
# include <WinCryptEx.h>
#else
# include <string.h>
# include <stdlib.h>
# include <ctype.h>
# include <unistd.h>
# include <CSP_WinDef.h>
# include <CSP_WinCrypt.h>
# include <WinCryptEx.h>
#endif

#ifdef _WIN32
#pragma warning( push )
#pragma warning( disable : 4996 )
#endif

#ifdef _WIN32
#define TEMP_CONTAINER_NAME "\\\\.\\REGISTRY\\tmp_cont"
#else
#define TEMP_CONTAINER_NAME "\\\\.\\hdimage\\tmp_cont"
#endif

#define DIV_DATA_SZ 32

int main(int argc, char *argv[]) {

BYTE PIN_TO_CONT[]={'1','1','1','1','1','1','1','1','\0'};

HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hDivKey = 0;
HCRYPTKEY hSessionKey = 0;

BYTE blob[sizeof(CRYPT_DIVERSBLOB)+DIV_DATA_SZ];
CRYPT_DIVERSBLOB * Blob = (CRYPT_DIVERSBLOB*)blob;
DWORD dwTmp;
BYTE div_data[DIV_DATA_SZ]={
0,1,2,3,4,5,6,7,
0,1,2,3,4,5,6,7,
0,1,2,3,4,5,6,7,
0,1,2,3,4,5,6,7};

BYTE *pbKeyBlobSimple = NULL;
DWORD dwBlobLenSimple;
BYTE iv[SEANCE_VECTOR_LEN];
BYTE dt[G28147_KEYLEN];
BYTE im[EXPORT_IMIT_SIZE];
BYTE im2[EXPORT_IMIT_SIZE];
HCRYPTHASH hHash = 0;
BYTE data[G28147_KEYLEN];
DWORD datasz=G28147_KEYLEN;
BYTE pbSessionKeyEncrypted[G28147_KEYLEN]; //зашифрованный на мастере сессионный ключ
BYTE pbSessionKeyImit[EXPORT_IMIT_SIZE]; //имитовскавка по незашифрованному сессионному ключу

BYTE ASNstrSmpl[11] = {0x30,0x09,0x06,0x07,0x2A,0x85,0x03,0x02,0x02,0x1F,0x01};
BYTE blob2[sizeof(CRYPT_SIMPLEBLOB)+sizeof(ASNstrSmpl)];
CRYPT_SIMPLEBLOB *Blob2 = (CRYPT_SIMPLEBLOB*)blob2;

//создаем ключ (hKey), на основе которого впоследствии получим дивключ
if(CryptAcquireContext(
&hProv,
TEMP_CONTAINER_NAME,
NULL,
PROV_GOST_2001_DH,
0)
) {
CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, PIN_TO_CONT, 0);
} else {
if(!CryptAcquireContext(
&hProv,
TEMP_CONTAINER_NAME,
NULL,
PROV_GOST_2001_DH,
CRYPT_NEWKEYSET)
) {
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, PIN_TO_CONT, 0);
}

if(!CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hKey)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}

//диверсифицируем hKey, получаем hDivKey
Blob->DiversBlobHeader.BlobHeader.bType = DIVERSKEYBLOB;
Blob->DiversBlobHeader.BlobHeader.bVersion = BLOB_VERSION;
Blob->DiversBlobHeader.BlobHeader.aiKeyAlg = CALG_G28147;
Blob->DiversBlobHeader.aiDiversAlgId = CALG_PRO_DIVERS;
Blob->DiversBlobHeader.dwDiversMagic = DIVERS_MAGIC;
Blob->DiversBlobHeader.cbDiversData = DIV_DATA_SZ;
CopyMemory((LPBYTE)Blob->bDiversData,div_data,DIV_DATA_SZ);
if(!CryptImportKey(hProv, blob, sizeof(CRYPT_DIVERSBLOB)+DIV_DATA_SZ,
hKey, CRYPT_EXPORTABLE, &hDivKey))
{
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}

//генерим сессионный
if(!CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}

//экспорт сессионного на ключе, который диверсифицировали (hKey)
dwTmp = CALG_SIMPLE_EXPORT;
if(!CryptSetKeyParam(hKey, KP_ALGID, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = CRYPT_MODE_ECB;
if(!CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = ZERO_PADDING;
if(!CryptSetKeyParam(hKey, KP_PADDING, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memset(iv,0,SEANCE_VECTOR_LEN);
if(!CryptSetKeyParam(hKey, KP_IV, iv, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptExportKey(hSessionKey, hKey, SIMPLEBLOB, 0, NULL, &dwBlobLenSimple)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
pbKeyBlobSimple = (BYTE*)malloc(dwBlobLenSimple);
if(!pbKeyBlobSimple){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptExportKey(hSessionKey, hKey, SIMPLEBLOB, 0, pbKeyBlobSimple, &dwBlobLenSimple)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memcpy(dt,&pbKeyBlobSimple[sizeof(CRYPT_SIMPLEBLOB_HEADER)+SEANCE_VECTOR_LEN],G28147_KEYLEN);
memcpy(im,&pbKeyBlobSimple[sizeof(CRYPT_SIMPLEBLOB_HEADER)+SEANCE_VECTOR_LEN+G28147_KEYLEN],EXPORT_IMIT_SIZE);
free(pbKeyBlobSimple);
//и сразу расшифровываем на том же ключе (нам нужно будет значение сессионного в открытом виде, когда мы будем руками формировать криптограмму по нему)
dwTmp = CALG_G28147;
if(!CryptSetKeyParam(hKey , KP_ALGID, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = G28147_KEYLEN;
if(!CryptDecrypt(hKey, 0, TRUE, 0, dt, &dwTmp)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
//проверяем, правильно ли расшифровался сессионный
if(!CryptCreateHash(hProv, CALG_G28147_IMIT, hKey, 0, &hHash)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = G28147_KEYLEN;
if(!CryptHashData(hHash, dt, dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = EXPORT_IMIT_SIZE;
if(!CryptGetHashParam(hHash, HP_HASHVAL, NULL, &dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(dwTmp != EXPORT_IMIT_SIZE){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptGetHashParam(hHash, HP_HASHVAL, im2, &dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(memcmp(im,im2,EXPORT_IMIT_SIZE)!=0){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(hHash)CryptDestroyHash(hHash);
#if 1
//сформируем (руками) криптограмму сессионного на hKey
//копируем, нам еще пригодится сессионный в открытолм виде
memcpy(data,dt,G28147_KEYLEN);
memset(iv,0,SEANCE_VECTOR_LEN);
if(!CryptSetKeyParam(hKey, KP_IV, iv, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = CRYPT_SIMPLEMIX_MODE;
if(!CryptSetKeyParam(hKey, KP_MIXMODE, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptEncrypt(hKey, 0, TRUE, 0, data, &datasz, datasz)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memcpy(pbSessionKeyEncrypted,data,datasz);
memcpy(data,dt,G28147_KEYLEN);
if(!CryptCreateHash(hProv, CALG_G28147_IMIT, hKey, 0, &hHash)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = G28147_KEYLEN;
if(!CryptHashData(hHash, data, dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = EXPORT_IMIT_SIZE;
if(!CryptGetHashParam(hHash, HP_HASHVAL, NULL, &dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(dwTmp != EXPORT_IMIT_SIZE){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptGetHashParam(hHash, HP_HASHVAL, data, &dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memcpy(pbSessionKeyImit,data,dwTmp);
if(hHash)CryptDestroyHash(hHash);
//импортируем криптограмму сессиолнного
dwTmp = CALG_SIMPLE_EXPORT;
if(!CryptSetKeyParam(hKey, KP_ALGID, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
Blob2->tSimpleBlobHeader.BlobHeader.aiKeyAlg = CALG_G28147;
Blob2->tSimpleBlobHeader.BlobHeader.bType = SIMPLEBLOB;
Blob2->tSimpleBlobHeader.BlobHeader.bVersion = BLOB_VERSION;
Blob2->tSimpleBlobHeader.BlobHeader.reserved = 0;
Blob2->tSimpleBlobHeader.EncryptKeyAlgId = CALG_G28147;
Blob2->tSimpleBlobHeader.Magic = G28147_MAGIC;
memset(Blob2->bSV, 0, SEANCE_VECTOR_LEN);
memcpy(Blob2->bEncryptionParamSet, ASNstrSmpl, sizeof(ASNstrSmpl));
memcpy(Blob2->bEncryptedKey, pbSessionKeyEncrypted, G28147_KEYLEN);
memcpy(Blob2->bMacKey, pbSessionKeyImit, EXPORT_IMIT_SIZE);
if(!CryptImportKey(
hProv,
blob2,
sizeof(CRYPT_SIMPLEBLOB)+sizeof(ASNstrSmpl),
hKey,
0,//CRYPT_EXPORTABLE,
&hSessionKey)
) {
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
#else
//сформируем (руками) криптограмму сессионного на hDivKey
//копируем, нам еще пригодится сессионный в открытолм виде
memcpy(data,dt,G28147_KEYLEN);
dwTmp = CALG_G28147;
if(!CryptSetKeyParam(hDivKey , KP_ALGID, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = CRYPT_MODE_ECB;
if(!CryptSetKeyParam(hDivKey, KP_MODE, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = ZERO_PADDING;
if(!CryptSetKeyParam(hDivKey, KP_PADDING, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memset(iv,0,SEANCE_VECTOR_LEN);
if(!CryptSetKeyParam(hDivKey, KP_IV, iv, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = CRYPT_SIMPLEMIX_MODE;
if(!CryptSetKeyParam(hDivKey, KP_MIXMODE, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptEncrypt(hDivKey, 0, TRUE, 0, data, &datasz, datasz)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memcpy(pbSessionKeyEncrypted,data,datasz);
memcpy(data,dt,G28147_KEYLEN);
if(!CryptCreateHash(hProv, CALG_G28147_IMIT, hDivKey, 0, &hHash)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = G28147_KEYLEN;
if(!CryptHashData(hHash, data, dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
dwTmp = EXPORT_IMIT_SIZE;
if(!CryptGetHashParam(hHash, HP_HASHVAL, NULL, &dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(dwTmp != EXPORT_IMIT_SIZE){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
if(!CryptGetHashParam(hHash, HP_HASHVAL, data, &dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
memcpy(pbSessionKeyImit,data,dwTmp);
if(hHash)CryptDestroyHash(hHash);
//импортируем криптограмму сессиолнного
dwTmp = CALG_SIMPLE_EXPORT;
if(!CryptSetKeyParam(hDivKey, KP_ALGID, (BYTE*)&dwTmp, 0)){
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
Blob2->tSimpleBlobHeader.BlobHeader.aiKeyAlg = CALG_G28147;
Blob2->tSimpleBlobHeader.BlobHeader.bType = SIMPLEBLOB;
Blob2->tSimpleBlobHeader.BlobHeader.bVersion = BLOB_VERSION;
Blob2->tSimpleBlobHeader.BlobHeader.reserved = 0;
Blob2->tSimpleBlobHeader.EncryptKeyAlgId = CALG_G28147;
Blob2->tSimpleBlobHeader.Magic = G28147_MAGIC;
memset(Blob2->bSV, 0, SEANCE_VECTOR_LEN);
memcpy(Blob2->bEncryptionParamSet, ASNstrSmpl, sizeof(ASNstrSmpl));
memcpy(Blob2->bEncryptedKey, pbSessionKeyEncrypted, G28147_KEYLEN);
memcpy(Blob2->bMacKey, pbSessionKeyImit, EXPORT_IMIT_SIZE);
if(!CryptImportKey(
hProv,
blob2,
sizeof(CRYPT_SIMPLEBLOB)+sizeof(ASNstrSmpl),
hDivKey,
0,//CRYPT_EXPORTABLE,
&hSessionKey)
) {
printf("[%s, %s, %d] : error 0x%x\n",__FILE__,__FUNCTION__,__LINE__,GetLastError());
exit(1);
}
#endif
}

#ifdef _WIN32
#pragma warning( pop )
#endif


При '#if 1' - работает
При '#if 0' - нет.

Отредактировано пользователем 13 мая 2015 г. 13:41:58(UTC)  | Причина: Не указана

Offline al  
#8 Оставлено : 13 мая 2015 г. 13:54:54(UTC)
al

Статус: Активный участник

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Прошу прощения, но всё же поудалял запутывающие дело посты.
Оставил только тестовые примеры, готовые к сборке и запуску.
Offline Станислав Смышляев  
#9 Оставлено : 13 мая 2015 г. 14:41:58(UTC)
Станислав Смышляев

Статус: Сотрудник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 81 раз в 62 постах
Добрый день!

Действительно, права на ключи, полученные диверсификацией, ограничены возможностью шифрования/расшифрования, а также имитозащиты, но не экспорта/импорта. Это связано с тем, что роль диверсифицированного ключа в ключевых системах, как правило, состоит в одноразовой операции шифрования/расшифрования с последующим уничтожением.

Однако так как ключевой материал в блобе считать привязанным к типу ключа нельзя, то после импорта ключа его права поднимаются до прав нормального сессионного ключа. Точно так же флаги ограничений "теряются" при паре вызовов HashSessionKey/DeriveKey.
С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
thanks 1 пользователь поблагодарил Станислав Смышляев за этот пост.
al оставлено 13.05.2015(UTC)
Offline al  
#10 Оставлено : 13 мая 2015 г. 15:13:49(UTC)
al

Статус: Активный участник

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Спасибо, теперь всё понятно.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.