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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline ForwardAA  
#1 Оставлено : 2 февраля 2009 г. 20:57:00(UTC)
ForwardAA

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

Группы: Участники
Зарегистрирован: 02.02.2009(UTC)
Сообщений: 6
Откуда: Москва

Судя по всему, при использовании режима CRYPT_PROMIX_MODE (смена ключа и синхропосылки через каждые 1 КБ данных)
в режимах CBC и OFB CryptoPro CSP изменяет параметры (ключ и синхропосылку) способом, несовместимым с RFC 4357.
Во всяком случае, следующий тест (для режима CBC) должен всегда возвращать значение TRUE, чего не происходит.

BOOL TestCryptoProCBC()
{
BYTE src[1535] = {0}; BYTE key[32] = {0}; BYTE iv[8] = {0};

BYTE dest1[2048]; BYTE dest2[1024];

// зашифровать данные со сменой ключа после 1 килобайта
DWORD cbDest1 = GOST28147EncryptData(key, CRYPT_MODE_CBC, CRYPT_PROMIX_MODE,
PKCS5_PADDING, OID_CipherVerbaO, iv, src, sizeof(src), dest1, sizeof(dest1));

// извлечь последнюю синхропосылку первой части и сменить параметры
memcpy(iv, src + 1016, sizeof(iv)); CryptoProKeyMeshing(key, iv);

// зашифровать вторую часть после явной смены ключа и синхропосылки
DWORD cbDest2 = GOST28147EncryptData(key, CRYPT_MODE_CBC, CRYPT_PROMIX_MODE,
PKCS5_PADDING, OID_CipherVerbaO, iv, src + 1024, sizeof(src) - 1024, dest2, sizeof(dest2));

// сравнить вторую часть после явной и неявной смены ключа и синхропосылки
return (cbDest2 + 1024 == cbDest1) && memcmp(dest2, dest1 + 1024, cbDest2) == 0;
}

Здесь функция CryptoProKeyMeshing изменяет значения ключа и синхропосылки согласно RFC 4357:

void CryptoProKeyMeshing(BYTE key[], BYTE iv[])
{
// константа для расшифрования
BYTE C[] = {
0x69, 0x00, 0x72, 0x22, 0x64, 0xC9, 0x04, 0x23,
0x8D, 0x3A, 0xDB, 0x96, 0x46, 0xE9, 0x2A, 0xC4,
0x18, 0xFE, 0xAC, 0x94, 0x00, 0xED, 0x07, 0x12,
0xC0, 0x86, 0xDC, 0xC2, 0xEF, 0x4C, 0xA9, 0x2B,
};
// сменить ключ
GOST28147DecryptData(key, CRYPT_MODE_ECB, CRYPT_SIMPLEMIX_MODE,
0, OID_CipherVerbaO, 0, C, sizeof(C), key, 32);

// сменить синхропосылку
GOST28147EncryptData(key, CRYPT_MODE_ECB, CRYPT_SIMPLEMIX_MODE,
0, OID_CipherVerbaO, 0, iv, 8, iv, 8);
},

а функции GOST28147EncryptData и GOST28147DecryptData имеют следующие прототипы:

DWORD WINAPI GOST28147EncryptData(CONST VOID* pvKey, DWORD dwMode,
DWORD dwMixMode, DWORD dwPaddMode, PCSTR sboxOID, CONST VOID* pvIV,
CONST VOID* pvData, DWORD cbData, PVOID pvBuffer, DWORD cbBuffer);

DWORD WINAPI GOST28147DecryptData(CONST VOID* pvKey, DWORD dwMode,
DWORD dwMixMode, DWORD dwPaddMode, PCSTR sboxOID, CONST VOID* pvIV,
CONST VOID* pvData, DWORD cbData, PVOID pvBuffer, DWORD cbBuffer);

и зашифровывают/расшифровывают данные, напрямую используя значение ключа.
(Явно заданное значение ключа вставляется в алгоритм шифрования с использованием
импорта значения ключа через алгоритм с идентификатором CALG_SIMPLE_EXPORT).

Вопрос техподдержке: почему так происходит?

Отредактировано пользователем 3 февраля 2009 г. 0:22:47(UTC)  | Причина: Не указана

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