Невозможно воспроизвести расшифровку данных на основе ATL в .NET: неправильно первые 4 байта - PullRequest
2 голосов
/ 29 ноября 2010

Это код C ++:

CCryptMD5Hash md5;
CCryptProv cprov;
PCWSTR pszPassword = <password>;
BYTE* data = <array of bytes>;
ATL::CCryptDerivedKey m_CryptKey;

md5.Initialize( cprov );
md5.AddData(reinterpret_cast<const BYTE*>(pszPassword), wcslen(pszPassword) * sizeof(wchar_t));

m_CryptKey.Initialize( cprov, md5, CALG_DES);

std::vector<BYTE> buff(data, data + size);
DWORD cbBufSize = buff.size();
m_CryptKey.Decrypt(TRUE, &buff.front(), &cbBufSize));

Он успешно декодирует массив байтов в строку типа "ABC-DEF-2 \ ZXCVBNMHOHUH, 2020100".

И это соответствующий код .NET, который я пытаюсь написать:

byte[] salt = new byte[0];
byte[] input = <array of bytes>;
byte[] pwd = Encoding.Unicode.GetBytes(<password>);

DESCryptoServiceProvider des = new DESCryptoServiceProvider();
PasswordDeriveBytes pdb = new PasswordDeriveBytes(pwd,  salt);
des.Key = pdb.CryptDeriveKey("DES", "MD5", 0, des.IV);

MemoryStream ms = new MemoryStream(input);
CryptoStream ds = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read);

StreamReader sr = new StreamReader(ds, Encoding.Unicode);
string s = sr.ReadToEnd();

Выходная строка: "EF  뛛 跬 DEF-2 \ ZXCVBNMHOHUH, 2020100". Итак, первые четыре символа декодируются неправильно. Изменение соли отличает этих персонажей.

Поскольку в коде C ++ нет соли , я даже не могу думать о его возможной ценности. Но все простые тоже не работают.

Может кто-нибудь помочь, пожалуйста?

1 Ответ

1 голос
/ 29 ноября 2010

Работает ли передача нулевого значения в код C # для des.IV?

Вы можете установить эквивалент CBC IV в коде C ++, используя SetIV

m_CryptKey.SetIV(...);
...