I’m trying to create a program that will enable me to convert a MEID (a hex number of length 14) to pseudo ESN (a hex number of length 8). The way to obtain a pESN from MEID is fairly simple in theory. For example, given MEID 0xA0000000002329, to make a pESN, SHA-1 needs to be applied to the MEID. SHA-1 on A0000000002329 gives e3be267a2cd5c861f3c7ea4224df829a3551f1ab. Take the last 6 hex numbers of this result, and append it to 0x80 – the result is 0x8051F1AB.
Now here is the code I have so far:
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());
}
The problem is that using this method, SHA-1 on A0000000002329 gives 6ad447f040941bf43c0693d2b391c6c79fa58320 instead of e3be267a2cd5c861f3c7ea4224df829a3551f1ab. What am I doing wrong here??
Someone gave me a hint that
The trick is to apply SHA-1 to the number representing the MEID, not
the string representing the MEID. You’ll need to process it
byte-by-byte, so you must give it two hex numbers at a time (since two
hex numbers make a byte) and make sure they are interpreted as numbers
and not ASCII characters.
If these instructions are true, then how do I apply SHA-1 to my hex number byte by byte??
Strelok has found the problem about
BigIntegeradding an extra byte in the returned array. This simpler version also gives the expected result :