2010-11-29 3 views
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++コードには塩が入っていないので、試してみる価値があるとは思えません。です。しかし、単純なものもすべて機能しません。

誰かが助けてくれますか?

答えて

1

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

あなたはSetIV

m_CryptKey.SetIV(...); 
+0

はい、DES.IV =新しいバイトを使用してC++コードでの同等のCBC IVは、[8]に働い設定することができます。ありがとうございました! –