/****************************************************/
/** 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结果一致。
/** 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结果一致。
(3)现在想用C#做WEB方式,使其算出的MD5结果与C++builder的MD5结果一致。
两个MD5结果还是一样不相等。
(2)查了一下,bcb中AnsiString 其实也就是*char,而char=ASC||,
因此将上又改为byte[] bytes = System.Text.Encoding.ASC||.GetBytes("9123456");
两个MD5结果还是一样不相等。
有谁知道怎么处理啊!!!
(1)跟踪了一点:执行MD5后,好似输入的“9123456“变成了"9123456€",不知何故,但执行前没有改变。
(2)在C#中,不用MD5类,改用数学方法来计算MD5,结果当输入“9123456"时,计算的结果与用MD5类计算的结果一致!!!难道说C++中的TIdCoderMD5有问题,否则为什么3种方式中,就只有C++的计算不同???
(3)有没有人遇到相同的问题:winForm的C++与C#中的Md5计算。