无法在.NET中重现基于ATL的数据解密:错误的前4个字节

时间:2010-11-29 16:49:41

标签: c# .net encryption atl cryptoapi

这是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”。因此,前四个字符的解码不正确。改变盐会使这些角色不同。

由于 C ++代码中没有盐,我甚至无法想到尝试它的可能性。但所有简单的方法都不起作用。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

是否可以将零值传递到des.IV的C#代码?

您可以使用SetIV

在C ++代码中设置等效的CBC IV
m_CryptKey.SetIV(...);