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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Андрей Куликов  
#1 Оставлено : 12 марта 2011 г. 1:34:00(UTC)
Андрей Куликов

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

Группы: Участники
Зарегистрирован: 17.10.2010(UTC)
Сообщений: 147
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 2 раз
Поблагодарили: 10 раз в 9 постах
При вычислении имитовставки вызов CryptSetKeyParam(imito_key, KP_IV, IV, 0) не оказывает никакого влияния.

Код ниже в случае если этот вызов присутствует и если от закоментарен выдает одинаковые значения:
Цитата:
Calc IMIT: :
17 B8 66 55



Ключ имитовставки всегда один и тот же, IV фиксирован.
Пробовал и так и сяк, но никак.

Как убедить CSP использовать IV?

Код:

#define DBG_OUT(msg) fprintf(stderr, "MSG %s:%d:%s: %s\n", __FILE__, __LINE__, __FUNCTION__, msg);

#define DBG_OUT_E(msg) fprintf(stderr, "MSG %s:%d:%s: %s : 0x%X\n", __FILE__, __LINE__, __FUNCTION__, msg, GetLastError());


void printN(char *descr, unsigned char *dat, size_t amount){
    printf("%s:\n", descr);
    int i;
    for(i =0; i < amount; i++){
        printf("%02X ", *(dat + i));
    }

    printf("\n");
}

HCRYPTPROV hProv;

HCRYPTKEY gen_fake_session_key(){

    HCRYPTKEY sess_key = 0;

    HCRYPTHASH sess_hash = 0;
    const unsigned char *sess_secret = "session fake-secret data.";

    if (!CryptCreateHash(hProv, CALG_GR3411, 0, 0, &sess_hash))
    {
        DBG_OUT_E("Can't create CALG_GR3411 hash!");
        return 0;
    }

    if (!CryptHashData(sess_hash, sess_secret, strlen(sess_secret), 0)) {
        CryptDestroyHash(sess_hash);
        DBG_OUT_E("Can't hash sess data");
        return 0;
    }

    if (!CryptDeriveKey(hProv, CALG_G28147, sess_hash, CRYPT_EXPORTABLE, &sess_key)) {
        CryptDestroyHash(sess_hash);
        DBG_OUT_E("Can't derive sess key from hash.");
        return 0;
    }

    CryptDestroyHash(sess_hash);

    return sess_key;
}

static int make_imito(HCRYPTPROV hProv)
{

    unsigned char IV[ SEANCE_VECTOR_LEN ] = {1, 2, 3, 4, 5, 6, 7, 8};
    unsigned char data[ G28147_KEYLEN ];
    
    memset(data, 0, G28147_KEYLEN);


    HCRYPTKEY imito_key = gen_fake_session_key();

/*
    DWORD dparam = ZERO_PADDING;

    if (!CryptSetKeyParam(imito_key, KP_PADDING, (BYTE*)&dparam, 0))
    {
        DBG_OUT_E("Can't set ZERO_PADDING for generated KEK.");
        return 0;
    }
*/

    if (!CryptSetKeyParam(imito_key, KP_IV, IV, 0)) {
        DBG_OUT_E("Can't set IV for IMITO");
        return 0;
    }

    HCRYPTHASH im = 0;
    if(!CryptCreateHash(hProv, CALG_G28147_IMIT, imito_key, 0, &im))
    {
      DBG_OUT_E("Can't create IMITO hash");
      return 0;
    }

    if(!CryptHashData(im, data, G28147_KEYLEN, 0))
    {
        DBG_OUT_E("Can't hash");
        return 0;
    }

    unsigned char calc_imito [ EXPORT_IMIT_SIZE ];
    DWORD imitLen = EXPORT_IMIT_SIZE;

    if(!CryptGetHashParam(im,
                         HP_HASHVAL,
                         calc_imito, 
                         &imitLen, 0))
    {
        DBG_OUT_E("Can't get CEK hash data");
        return 0;
    }

    CryptDestroyHash(im);
    CryptDestroyKey(imito_key);

    printN(" Calc IMIT: ", calc_imito, 4);

    return 1;
}


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

    hProv = 0;
   
    if (CryptAcquireContext(&hProv, NULL, NULL, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
    {
        DBG_OUT("Container used");
    }
    else
    {
        DBG_OUT("Can't obtain context");
        exit(3);
    }

    make_imito(hProv);

    return (EXIT_SUCCESS);
}



Цитата:
# csptest -version
CSP (Type:75) v3.6.5359 KC1 Release Ver:3.6.6497 OS:Linux CPU:IA32 FastCode:READY,ENABLED.

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

Offline Андрей Куликов  
#2 Оставлено : 15 марта 2011 г. 22:10:20(UTC)
Андрей Куликов

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

Группы: Участники
Зарегистрирован: 17.10.2010(UTC)
Сообщений: 147
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 2 раз
Поблагодарили: 10 раз в 9 постах
Да, стандарт такого не предусматривает.
Но задание синхропосылки используется, например, при защищенном экспорте/импорте симметричных ключей.

Значит это как-то легко делается.
Offline Юрий  
#3 Оставлено : 15 марта 2011 г. 23:41:27(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 675
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 95 раз в 68 постах
Все здорово, но вот только генерация сессионного ключа на основе "пароля" (CryptDeriveKey) для ГОСТ'овых криптопровайдеров не предусмотрена.
Попробуйте простую схему:
1) CryptGenKey;
2) CryptSetKeyParam(...KP_IV...);

Такая схема точно работает, в частности для криптопровайдера от КриптоПРО.
С уважением,
Юрий Строжевский
Offline Андрей Куликов  
#4 Оставлено : 17 марта 2011 г. 2:43:50(UTC)
Андрей Куликов

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

Группы: Участники
Зарегистрирован: 17.10.2010(UTC)
Сообщений: 147
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 2 раз
Поблагодарили: 10 раз в 9 постах
CryptDeriveKey тут исключительно для того чтобы при каждом запуске ключ был один и тот же.

Как иначе проверить что на конечное значение имитовставки повлиял именно IV, а не новый ключ?

P.S. Не понял что значит "не предусмотрена". Функция-то работает :-)

Отредактировано пользователем 17 марта 2011 г. 2:44:36(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#5 Оставлено : 17 марта 2011 г. 11:05:03(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 38 раз
Поблагодарили: 736 раз в 633 постах
Ничего не путаете? Как IV используется при вычислении имитовставки?
Знания в базе знаний, поддержка в центре поддержки
Offline Андрей Куликов  
#6 Оставлено : 17 марта 2011 г. 13:12:15(UTC)
Андрей Куликов

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

Группы: Участники
Зарегистрирован: 17.10.2010(UTC)
Сообщений: 147
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 2 раз
Поблагодарили: 10 раз в 9 постах
Защищенный экспорт/импорт ключа

RFC4357 пункты 6.1 - 6.4

http://tools.ietf.org/html/rfc4357#section-6.3

Offline Максим Коллегин  
#7 Оставлено : 17 марта 2011 г. 14:47:22(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 38 раз
Поблагодарили: 736 раз в 633 постах
И где там про IV?
Знания в базе знаний, поддержка в центре поддержки
Offline Андрей Куликов  
#8 Оставлено : 17 марта 2011 г. 19:36:26(UTC)
Андрей Куликов

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

Группы: Участники
Зарегистрирован: 17.10.2010(UTC)
Сообщений: 147
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 2 раз
Поблагодарили: 10 раз в 9 постах
Про IV там в определении. пункт 1.1 последняя функция

Некое значение длинной SEANCE_VECTOR_LEN байтов.

Цитата:
gost28147IMIT (IV, K, D) is the 32-bit result of the GOST 28147-89 in
"imitovstavka" (MAC) mode, used with D as plaintext, K as key and IV
as initialization vector. Note that the standard specifies its use
in this mode only with an initialization vector of zero.


В пунктах 6.1-6.4 скрывается под видом UKM.

Отредактировано пользователем 17 марта 2011 г. 19:53:03(UTC)  | Причина: Не указана

Offline vpopov  
#9 Оставлено : 23 марта 2011 г. 19:01:09(UTC)
vpopov

Статус: Новичок

Группы: Участники
Зарегистрирован: 23.03.2011(UTC)
Сообщений: 1

В соответствии с ГОСТ 28147 89 вычисление имитовставки производится только от текста, подаваемого на функцию имитозащиты и не зависит от таких параметров, как IV. Отсюда поведение примеров, как бы не менять атрибут ключа IV, значение имиты не меняется. Если очень хочется сделать имиту зависящей от IV, то имитим IV, а затем текст.
Offline Андрей Куликов  
#10 Оставлено : 25 марта 2011 г. 21:45:51(UTC)
Андрей Куликов

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

Группы: Участники
Зарегистрирован: 17.10.2010(UTC)
Сообщений: 147
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 2 раз
Поблагодарили: 10 раз в 9 постах
Для задания IV необходимо установить параметр хеша
CryptSetHashParam(..., HP_HASHSTARTVECT, ...)

Тогда имитовставка вычислается в соответствии с RFC4357.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.