标题: 两个方法能帮转成php吗
时间: 2020-12-03
public byte[] a(String str, int i, String str2) {
StringBuffer stringBuffer = new StringBuffer();
if (str != null) {
stringBuffer.append(str);
}
stringBuffer.append(i);
stringBuffer.append(str2);
stringBuffer.append("mMcShCsTr");
Log.d("TAG111", "_mmessage_checksum: " + c(stringBuffer.toString().substring(1, 9).getBytes()));
return c(stringBuffer.toString().substring(1, 9).getBytes()).getBytes();
}
public static final String c(byte[] bArr) {
char[] cArr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest instance = MessageDigest.getInstance("MD5");
instance.update(bArr);
byte[] digest = instance.digest();
int length = digest.length;
char[] cArr2 = new char[(length * 2)];
int i = 0;
int i2 = 0;
while (i < length) {
byte b = digest[i];
int i3 = i2 + 1;
cArr2[i2] = cArr[(b >>> 4) & 15];
cArr2[i3] = cArr[b & 15];
i++;
i2 = i3 + 1;
}
return new String(cArr2);
} catch (Exception e) {
return null;
}
}
『回复列表(10|隐藏机器人聊天)』
<?php
var_dump(a("a1", 2, "34"));
function a($str, $i, $str2) {
$stringBuffer = "";
if ($str != null) {
$stringBuffer .= $str;
}
$stringBuffer .= $i;
$stringBuffer .= $str2;
$stringBuffer .= "mMcShCsTr";
return md5(substr($stringBuffer, 1, 8));
}
输出:
string(32) "d300340816305da9f1020d38f9f6db74"
为什么c
函数不见了?因为调试后发现c
函数实际上就是PHP中的md5()
,以下这段代码就是在做bin2hex()
:
int length = digest.length;
char[] cArr2 = new char[(length * 2)];
int i = 0;
int i2 = 0;
while (i < length) {
byte b = digest[i];
int i3 = i2 + 1;
cArr2[i2] = cArr[(b >>> 4) & 15];
cArr2[i3] = cArr[b & 15];
i++;
i2 = i3 + 1;
}
看下面这个调试输出就明白了:
import java.security.MessageDigest;
class Untitled {
public static void main(String[] args) {
System.out.println(new String(a("a1", 2, "34"))); // 【调试输出4】
}
public static byte[] a(String str, int i, String str2) {
StringBuffer stringBuffer = new StringBuffer();
if (str != null) {
stringBuffer.append(str);
}
stringBuffer.append(i);
stringBuffer.append(str2);
stringBuffer.append("mMcShCsTr");
return c(stringBuffer.toString().substring(1, 9).getBytes()).getBytes();
}
public static String c(byte[] bArr) {
System.out.println(new String(bArr)); // 【调试输出1】
char[] cArr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest instance = MessageDigest.getInstance("MD5");
instance.update(bArr);
byte[] digest = instance.digest();
int length = digest.length;
System.out.println(length); // 【调试输出2】
System.out.println(byteToHex(digest)); // 【调试输出3】
char[] cArr2 = new char[(length * 2)];
int i = 0;
int i2 = 0;
while (i < length) {
byte b = digest[i];
int i3 = i2 + 1;
cArr2[i2] = cArr[(b >>> 4) & 15];
cArr2[i3] = cArr[b & 15];
i++;
i2 = i3 + 1;
}
return new String(cArr2);
} catch (Exception e) {
return null;
}
}
public static String byteToHex(byte[] bytes){
String strHex = "";
StringBuilder sb = new StringBuilder("");
for (int n = 0; n < bytes.length; n++) {
strHex = Integer.toHexString(bytes[n] & 0xFF);
sb.append((strHex.length() == 1) ? "0" + strHex : strHex);
}
return sb.toString().trim();
}
}
输出是这样:
1234mMcS
16
d300340816305da9f1020d38f9f6db74
d300340816305da9f1020d38f9f6db74
说明byteToHex(digest)
就是最终结果,而digest
是md5值的二进制表示,按PHP写法就是$digest = md5($bArr, true)
,所以后面那段代码就相当于$cArr2 = bin2hex($digest)
。
其实再精简一下可以写成:
<?php
var_dump(a("a1", 2, "34"));
function a($str, $i, $str2) {
return md5(substr("{$str}{$i}{$str2}mMcShCsTr", 1, 8));
}
输出:
string(32) "d300340816305da9f1020d38f9f6db74"
看到这里,你该相信PHP是世界上最好的语言了吧
MessageDigest instance = MessageDigest.getInstance("MD5");
instance.update(bArr);
byte[] digest = instance.digest();
后续代码是在做bin2hex,把字节转换成十六进制表示:
char[] cArr2 = new char[(length * 2)];
int i = 0;
int i2 = 0;
while (i < length) {
byte b = digest[i];
int i3 = i2 + 1;
cArr2[i2] = cArr[(b >>> 4) & 15];
cArr2[i3] = cArr[b & 15];
i++;
i2 = i3 + 1;
}
所以真正计算md5的函数并不在这里。