2010-11-29 28 views
2

Ceci est le code C++:Impossible de reproduire le déchiffrement de données ATL dans .NET: mauvais premier 4 octets

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)); 

Il décode avec succès le tableau d'octets à une chaîne comme « ABC-DEF-2 \ ZXCVBNMHOHUH, 2020100 ".

Et voici le code .NET correspondant, je suis en train d'écrire:

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(); 

Sa chaîne de sortie est "몶  뛛 跬 DEF-2 \ ZXCVBNMHOHUH, 2.020.100". Ainsi, les quatre premiers caractères sont décodés incorrectement. Changer de sel rend ces caractères différents.

Puisqu'il y a pas de sel dans le code C++, je ne peux même pas penser à la valeur possible à essayer. Mais tous les simples ne fonctionnent pas aussi.

Quelqu'un peut-il m'aider s'il vous plaît?

Répondre

1

Fonctionne-t-il en passant une valeur nulle dans le code C# pour des.IV?

Vous pouvez régler l'équivalent CBC IV dans le code C++ en utilisant SetIV

m_CryptKey.SetIV(...); 
+0

Oui, des.IV = new byte [8] a travaillé. Je vous remercie! –