2
これはC++コードです:は.NETでATLベースのデータ暗号解読を再現することはできません。間違った最初の4つのバイトを
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++コードには塩が入っていないので、試してみる価値があるとは思えません。です。しかし、単純なものもすべて機能しません。
誰かが助けてくれますか?
はい、DES.IV =新しいバイトを使用してC++コードでの同等のCBC IVは、[8]に働い設定することができます。ありがとうございました! –