Судя по всему, при использовании режима 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)
| Причина: Не указана