好,我知道了。我的错误是我正在发送
3DES(randA + randB')
但是我应该发送
3DES(randA) + 3DES(randB' XOR 3DES(randA))
这是Android / Java的身份验证代码(很遗憾,这是当前在网上可以找到的唯一代码!):
实际的验证码:
// send initial authentication requestbyte[] result = idTag.transceive(Utils.wrapMessage((byte)0x0a, new byte[]{(byte)0x0}));// get encrypted(randB) from the responsebyte[] b0 = new byte[8];for(int i = 0; i < 8; i++) { b0[i] = result[i];}// 16 bytes default keybyte[] key = new byte[] {(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0, (byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0, (byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0, (byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0 };// keys for TripleDesbyte[][] keys = new byte[3][];keys[0] = key; keys[1] = key; keys[2] = key;// decrypt enpred(randB)byte[] r0 = DES.TripleDES_Decrypt(b0, keys);// generate randA (integer 0-7 for trying, should randomize for real-life use) byte[] nr = new byte[8];for(int i = 0; i < 8; i++) { nr[i] = Byte.parseByte(Integer.toString(i), 16);}// decrypt randA, should XOR with IV, but IV is all 0's, not necessarybyte[] b1 = DES.TripleDES_Decrypt(nr, keys);// shift randB one byte left and get randB'byte[] r1 =new byte[8];for(int i = 0; i < 7; i++) { r1[i] = r0[i + 1];}r1[7]=r0[0];// xor randB' with randA and decryptbyte[] b2 = new byte[8];for(int i = 0; i < 8; i++) { b2[i] = (byte) (b1[i] ^ r1[i]);}b2 = DES.TripleDES_Decrypt(b2, keys);// concat (randA + randB')byte[] b1b2 = new byte[16];for (int i = 0; i < b1b2.length; i++) { if(i <= 7) { b1b2[i] = b1[i]; } else { b1b2[i]=b2[i-8]; }}result = idTag.transceive(Utils.wrapMessage((byte)0xaf, b1b2));TripleDes是问题之一。wrapMessage函数:
public static byte[] wrapMessage (byte command, byte[] parameters) throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); stream.write((byte) 0x90); stream.write(command); stream.write((byte) 0x00); stream.write((byte) 0x00); if (parameters != null) { stream.write((byte) parameters.length); stream.write(parameters); } stream.write((byte) 0x00); return stream.toByteArray();}编辑: 感谢VGe0rge,我们发现了这种身份验证有时不起作用的原因。不用调用问题中的3DES函数,只需调用:
Cipher.getInstance("DESede/CBC/NoPadding");


