CryptDecrypt для DES Win7 CBC возвращает NTE_BAD_DATA

Данные правильные. Проверенно онлайн кодировщиками. При тех же ключах дешифрирование проходит успешно и полученные данные верны. Что я делаю не так?

PUBLICKEYSTRUC k = { 0 };
k.bType = PLAINTEXTKEYBLOB;
k.bVersion = CUR_BLOB_VERSION;
k.aiKeyAlg = CALG_DES;

Bytes blob( sizeof(k) );
CopyMemory( &blob[0], &k, sizeof(k) );
blob.push_back( 0x08 );
blob.push_back( 0 );
blob.push_back( 0 );
blob.push_back( 0 );
blob.insert( blob.end(), privKey.begin(), privKey.begin() + 8 );

//Импортируем ключ
HCRYPTKEY key;
if ( !CryptImportKey( GetCryptProv(), &blob[0], sizeof(k) + 12, 0, CRYPT_USER_PROTECTED, &key))
{
 throw "Error ImportKey";
}

Bytes initVector( privKey.begin() + 8, privKey.begin() + 16  );

if ( !CryptSetKeyParam( key, KP_IV, &preInitVector[0], 0))
            throw "error set key";

Bytes encodedScoped( m_EncodedScoped );

size_t encodedLen = encodedScoped.size();
DWORD dataLen = (DWORD)encodedLen;
encodedScoped.resize( dataLen + 1024 , 0x00 );

if ( !CryptDecrypt( key, NULL, TRUE, 0, &encodedScoped[0], &dataLen ))
{
   throw "error decrypt";
}

typedef std::vector<BYTE> Bytes; Bytes privKey; вектор из байт 1 по 8 байт ключ с 9 по 16 байт начальный вектор.

почему при этом в encodedScoped данные нормально расшифрованные? Данные это зашифрованная часть SNMP пакета третей версии. корректность расшифровки проверяю онлайн расшифровщиками DES-CBC и с помощью SNMP++ (OpenSources проект). Данные совпадают от всех трех дешифровальщиков. Немного настораживает момент, что длинна входных и выходных данных спадают и равна 456 байт. Могу приложить зашифрованные и расшифрованные данные. с ключами если это поможет. Но по моему 456 шестнадцатеричных цифр только усложнит понимание вопроса.


Ответы (1 шт):

Автор решения: Николай Старовойтов

если в место if ( !CryptDecrypt( key, NULL, TRUE, 0, &encodedScoped[0], &dataLen )) написать if ( !CryptDecrypt( key, NULL, FALSE, 0, &encodedScoped[0], &dataLen )) то всё вроде работает корректно.

→ Ссылка