我正在尝试创建一个程序,使我能够将MEID(长度为16的十六进制数)转换为伪ESN(长度为8的十六进制数)。从MEID获得pESN的方法在理论上非常简单。例如,给定MEID 0xA0000000002329,要制作pESN,需要将SHA-1应用于MEID。 A0000000002329上的SHA-1给出e3be267a2cd5c861f3c7ea4224df829a3551f1ab。取该结果的最后6个十六进制数字,并将其附加到0x80-结果为0x8051F1AB。

现在这是我到目前为止的代码:

public void sha1() throws NoSuchAlgorithmException {

    String hexMEID = "A0000000002329";

    MessageDigest mDigest = MessageDigest.getInstance("SHA1");
    byte[] b = new BigInteger(hexMEID,16).toByteArray();

    byte[] result = mDigest.digest(b);
    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会给出6ad447f040941bf43c0693d2b391c6c79fa58320而不是e3be267a2cd5c861f3c7ea4224df829a3551f1ab。我在这里做错了什么?

有人给我提示


  诀窍是将SHA-1应用于代表MEID的数字,而不是
  代表MEID的字符串。您需要对其进行处理
  逐字节,因此您必须一次给它两个十六进制数(因为两个
  十六进制数字组成一个字节),并确保将其解释为数字
  而不是ASCII字符。


如果这些说明是正确的,那么我如何逐字节将SHA-1应用于我的十六进制数字?

最佳答案

Strelok已发现有关BigInteger在返回的数组中添加额外字节的问题。这个更简单的版本也提供了预期的结果:

String hexMEID = "A0000000002329";

MessageDigest mDigest = MessageDigest.getInstance("SHA1");

byte[] b = new BigInteger(hexMEID,16).toByteArray();

// skip the first byte set by BigInteger and retain only 7 bytes (length of MEID)
byte[] result = mDigest.digest(Arrays.copyOfRange(b, 1, 8));

StringBuilder sb = new StringBuilder("80");

// need only the last 3 bytes
for (int i=17; i<20; i++) {
    sb.append(Integer.toHexString((result[i] & 0xff) | 0x100).substring(1));
}

String pESN = sb.toString();
System.out.println(pESN);
// -> 8051f1ab

关于java - 如何将SHA-1逐字节应用于大十六进制数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11838825/

10-10 14:32