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 )) то всё вроде работает корректно.