2

これは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();

その出力文字列は「몶뛛跬DEF-2\ZXCVBNMHOHUH、2020100」です。したがって、最初の4文字は正しくデコードされません。ソルトを変更すると、これらの文字が異なります。

C ++コードにはソルトがないので、試してみる価値があるとは思えません。しかし、すべての単純なものも機能しません。

誰か助けてもらえますか?

4

1 に答える 1

1

のC#コードにゼロ値を渡すことは機能しますdes.IVか?

SetIVを使用して、C++コードで同等のCBCIVを設定できます。

m_CryptKey.SetIV(...);
于 2010-11-29T17:02:56.267 に答える