代码之家  ›  专栏  ›  技术社区  ›  Mikhail Orlov

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

  •  2
  • Mikhail Orlov  · 技术社区  · 15 年前

    这是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 回复  |  直到 15 年前
        1
  •  1
  •   Rup    15 年前

    是否可以将零值传递到 des.IV ?

    可以在C++代码中使用等效的CBC IV。 SetIV

    m_CryptKey.SetIV(...);
    
    推荐文章