栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

DESFire身份验证的DES发送和接收模式

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

DESFire身份验证的DES发送和接收模式

好,我知道了。我的错误是我正在发送

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");


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454780.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号