/****************************************************/
/**                   C++Builder                   **/
/****************************************************/
AnsiString __fastcall Strip(AnsiString S)
{
        return S.Delete(1, 2);
}
//------------------------------------------------------------------------------------------
AnsiString md5ToString(AnsiString S)
{
    AnsiString AHex;
    for (int i=1; i<=S.Length(); i++)
    {
        AHex += IntToHex((unsigned char)S[i], 2);
    }
    return AHex;
}
//------------------------------------------------------------------------------------------
String Md5Str(String src)
{
        TIdCoderMD5 *md5=new TIdCoderMD5(NULL);
        md5->Reset();
        md5->AutoCompleteInput = true;
        String tmp=md5ToString( Strip(md5->CodeString(src)));
        delete md5;
        md5=NULL;
        return tmp;
}
//------------------------------------------------------------------------------------------
AnsiString MyIntToString(char *S)
{
    AnsiString AHex;
    for (int i=0; i<8; i++)
    {
        AHex += IntToHex((unsigned char)S[i], 2);
    }
    return AHex;
}
//------------------------------------
void example()
{
       AnsiString sCHK=Md5Str("9123456");       结果sCHK="8663A9CEF1AD700EE8DEF2B4DF976636"
}/****************************************************/
/**                       C#                       **/
/****************************************************/
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes("9123456");
            bytes = md5.ComputeHash(bytes);
            md5.Clear();
            string ret = "";
            for (int i = 0; i < bytes.Length; i++)
            {
                ret += Convert.ToString(bytes[i], 16).PadLeft(2, '0');
            }
            string sCHK= ret.PadLeft(32, '0');   结果sCHK="7822b9f261889df1e3df69d83992f22d"(1)c++builder的程序是原有的,其MD5方法不能再修改,因为程序已在客户端运行。
(2)C#程序是WEB方式算注册码的方法,原来的算注册码的方法也是cbuilder的,是winform的,是可行的。
(3)现在想用C#做WEB方式,使其算出的MD4结果与C++builder的MD5结果一致。

解决方案 »

  1.   

    修正一下:
    (3)现在想用C#做WEB方式,使其算出的MD5结果与C++builder的MD5结果一致。
      

  2.   

    试试改成...byte[] bytes = System.Text.Encoding.Default.GetBytes("9123456"); 是编码问题...Ansi String "9123456" 和 UTF-8 String "9123456" 可是截然不同的两个值...
      

  3.   

    (1)改成了byte[] bytes = System.Text.Encoding.Default.GetBytes("9123456"); 
    两个MD5结果还是一样不相等。
    (2)查了一下,bcb中AnsiString 其实也就是*char,而char=ASC||,
    因此将上又改为byte[] bytes = System.Text.Encoding.ASC||.GetBytes("9123456");
    两个MD5结果还是一样不相等。
    有谁知道怎么处理啊!!!
      

  4.   

    你c++b的程序跟踪一个编码后的byte数组内容是什么?md5之前。
      

  5.   

    两个在MD5前byte内容都是一样的啊。
    (1)跟踪了一点:执行MD5后,好似输入的“9123456“变成了"9123456",不知何故,但执行前没有改变。
    (2)在C#中,不用MD5类,改用数学方法来计算MD5,结果当输入“9123456"时,计算的结果与用MD5类计算的结果一致!!!难道说C++中的TIdCoderMD5有问题,否则为什么3种方式中,就只有C++的计算不同???
    (3)有没有人遇到相同的问题:winForm的C++与C#中的Md5计算。