这是我用C#编写的代码:
public static String MD5Encrypt(String str, Boolean raw_output=false)
{
// Use input string to calculate MD5 hash
String output;
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(str);
byte[] hashBytes = md5.ComputeHash(inputBytes);
// Convert the byte array to hexadecimal string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}
output = sb.ToString();
if (raw_output)
{
output = pack(output);
}
return output;
}
public static String pack(String S)
{
string MultiByte = "";
for (int i = 0; i <= S.Length - 1; i += 2)
{
MultiByte += Convert.ToChar(HexToDec(S.Substring(i, 2)));
}
return MultiByte;
}
private static int HexToDec(String hex)
{
//Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
return Convert.ToInt32(hex, 16);
}
要重现php中所做的事情,请使用以下方法:
md5($str, true);
或
pack('H*', md5( $str ));
我尝试了很多方法,但在某些情况下,无法在word的两侧得到相同的结果。例如,在字符串“8tv7er5j”上尝试此测试。
PHP端:
9c36ad446f83ca38619e12d9e1b3c39e <= md5("8tv7er5j");
œ6DoƒÊ8ažÙá³Ãž <= md5("8tv7er5j", true) or pack("H*", md5("8tv7er5j"))
C#侧:
9c36ad446f83ca38619e12d9e1b3c39e <= MD5Encrypt("8tv7er5j")
6DoÊ8aÙá³Ã <= MD5Encrypt("8tv7er5j", true) or pack( MD5Encrypt("8tv7er5j") )
为什么?编码问题?
**EDIT 1:**我有很好的结果,但是用pack()的这个函数编码不好:
if ((hex.Length % 2) == 1) hex += '0';
byte[] bytes = new byte[hex.Length / 2];
for (int i = 0; i < hex.Length; i += 2)
{
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
}
return bytes;
因此,System.Text.Encoding.UTF8.GetString(字节)将给予我:6度8a度
和系统.文本.编码.ASCII.获取字符串(字节)?6?做??8a???????
...
6条答案
按热度按时间bejyjqdl1#
我遇到了同样的情况下,我在C#中需要php的pack-unpack-md5函数。最重要的是,我需要匹配出所有这3个函数与php。
我创建了自己的函数,然后使用onlinephpfunctions.com上的函数验证输出。使用DefaultEncoding. FYI解析时,输出是相同的。我检查了应用程序的编码(Encoding.Default.ToString()),结果是System.Text.SBCSCodePageEncoding
** Package **
千年发展目标5
**打开 Package **
私有静态字符串解包(字符串p1,字符串输入){ StringBuilder输出= new StringBuilder();
67up9zun2#
我猜PHP默认为Latin1,所以代码应该如下所示:
trnvg8h33#
如果要将结果作为HMAC-SHA1散列的键输入,请将其保存为bytes[],并使用此函数的返回值初始化HMACSHA 1:不要把它转换成字符串再转换回字节,因为这个错误我已经花了几个小时。
aamkag614#
我知道这是一个老问题。我贴出我的答案给任何人谁可能到达这个网页搜索它。以下代码是**珍珠功能包(“H*”)到c#**的完整转换。
lpwwtiir5#
对不起,我没有完全回答问题。但是如果php代码如下所示,
如果无法读取$testpack值(由于某些不支持的格式),则首先执行base64_encode,如下所示并回显它。
然后使用危险的Pathak答案。为了完成这个答案,我会张贴他的答案与一些小的修改,如基地64编码等。
现在如果你比较两个值,它们应该是相似的。
所有的功劳都应该归功于“危险的帕塔克”的回答。
kuuvgm7e6#
在c#中同样可以用Hex.Decode()方法实现。而bin2hex()在php中就是Hex.Encode()。