我每天都和手机打交道,并处理MEID号码。因此,我想到可以自己编写一个程序,而不是在网上搜索MEID(长度为14个十六进制数字的编号)到伪ESN(长度为8个十六进制数字的编号)计算器。从理论上讲,从MEID获取pESN的方法非常简单。例如,给定MEID 0xA0000000002329,要生成pESN,需要将SHA-1应用于MEID。对A0000000002329进行SHA-1运算得到e3be267a2cd5c861f3c7ea4224df829a3551f1ab。取该结果的最后6个十六进制数字,然后将其附加到0x80——结果为0x8051F1AB。
现在是我至今拥有的代码:
使用这种方法,对A0000000002329应用SHA-1算法会得到a89b611b421f57705bd013297ce3fc835f706ab0,而不是e3be267a2cd5c861f3c7ea4224df829a3551f1ab。我在这里做错了什么?
有人给了我一个提示:“诀窍是将SHA-1应用于表示MEID的数字,而不是表示MEID的字符串。你需要逐字节地处理它,所以你必须每次给出两个十六进制数(因为两个十六进制数组成一个字节),并确保它们被解释为数字而不是ASCII字符”。如果这是正确的,那么我该如何将我的字符串转换为十六进制,然后转换为字节,以便SHA1可以给我正确的结果?
现在是我至今拥有的代码:
public void sha1() throws NoSuchAlgorithmException {
String hexMEID = "A0000000002329";
MessageDigest mDigest = MessageDigest.getInstance("SHA1");
byte[] result = mDigest.digest(hexMEID.getBytes());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.length; i++) {
sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
System.out.println(sb.toString());
}
使用这种方法,对A0000000002329应用SHA-1算法会得到a89b611b421f57705bd013297ce3fc835f706ab0,而不是e3be267a2cd5c861f3c7ea4224df829a3551f1ab。我在这里做错了什么?
有人给了我一个提示:“诀窍是将SHA-1应用于表示MEID的数字,而不是表示MEID的字符串。你需要逐字节地处理它,所以你必须每次给出两个十六进制数(因为两个十六进制数组成一个字节),并确保它们被解释为数字而不是ASCII字符”。如果这是正确的,那么我该如何将我的字符串转换为十六进制,然后转换为字节,以便SHA1可以给我正确的结果?