JAVA,C#的md5参数和传参都是byte[].所以在这两个语言里面,MD5的计算可以进行通用,其实也是进行数据的校验。但是python就不一样,传参是String。研究了一下,得出了代码,分享下,以便大家使用。
Java版本如下:
byte[] src = {0x25,0x25,0x01,0x00,0x15,0x00,0x01,0x03,0x58,0x68,(byte)0x80,0x00,0x00,0x01,0x60,0x15,0x01,0x13,0x25,0x03,0x00};
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] arrBTmp = md5.digest(src);
System.out.println("MD5: " + byteArr2HexStr(arrBTmp));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
其中byteArr2HexStr如下:
public static String byteArr2HexStr(byte[] arrB) {
int iLen = arrB.length;
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
// 把负数转换为正数
while (intTmp < 0) {
intTmp = intTmp + 256;
}
// 小于0F的数需要在前面补0
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
C#版本如下:
byte[] data = { 0x25, 0x25, 0x01, 0x00, 0x15, 0x00, 0x01, 0x03, 0x58, 0x68, (byte)0x80, 0x00, 0x00, 0x01, 0x60, 0x15, 0x01, 0x13, 0x25, 0x03, 0x00 };
RijndaelManaged rDel = new RijndaelManaged();
MD5 md5 = new MD5CryptoServiceProvider();
byte[] output = md5.ComputeHash(data);
也提供一个byte[]转十六进制字符串的方法:
public static String Bytes2HexString(byte[] bytes, int index)
{
if (bytes == null || bytes.Length <= 0 || index >= bytes.Length)
{
return null;
}
StringBuilder builder = new StringBuilder("");
for (int i = index; i < bytes.Length; ++i)
{
String hex = (bytes[i] & 0xFF).ToString("X");
if (hex.Length < 2)
{
builder.Append('0');
}
builder.Append(hex);
}
return builder.ToString();
}
python版本如下:
from hashlib import md5
if __name__ == "__main__":
src = [0x25,0x25,0x01,0x00,0x15,0x00,0x01,0x03,0x58,0x68,0x80,0x00,0x00,0x01,0x60,0x15,0x01,0x13,0x25,0x03,0x00]
result = md5(bytearray(src)).hexdigest()
print result
以上所有版本生成的十六进制的字符串为:
02289c2c3d180fe71af860653a1d6132