PN532 MiFare Ultralight C相互认证

时间:2014-11-08 09:56:43

标签: nfc mifare encoder mutual-authentication

有没有人设法使用这个芯片使用超轻C卡进行相互认证? 我理解身份验证程序,但是查看芯片手册中的命令集并尝试了一些我认为实际上不可能的事情,但我想在放弃芯片组然后回到使用CJS编码器之前发布这里验证

提前致谢

2 个答案:

答案 0 :(得分:1)

示例C源代码:

typedef unsigned char byte;

int mutual_authentication( const byte *diversifiedKey )
{
    byte cmd[256], response[256];
    int cmdLen, responseLen;

    //Send 1A00
    cmd[0] = 0x1A;
    cmd[1] = 0x00;
    cmdLen = 2;
    int ret = send_command( cmd, cmdLen, response, &responseLen );

    //Get ekRndB
    byte ekRndB[8], rndB[8];

    memcpy(ekRndB, response, 8);
    //Decrypt ekRndB with diversifiedKey
    des_ISO_decrypt( diversifiedKey, ekRndB, rndB, 8 );

    //PCD Generates RndA
    byte randA[8] = "\x33,\x54,\x2A,\x87,\x21,\x00,\x77,\x98";//random numbers
    byte rndARndBComplement[16], ekRndARndBComplement[16];

    // Append RndA and RndB' ( RndB' is generated by rotating RndB one byte to the left )
    // after the status byte.
    memcpy(&rndARndBComplement[0],rndA,8);
    memcpy(&rndARndBComplement[8],&rndB[1],7);  // bytes 1 to 7
    rndARndBComplement[15] = rndB[0];           // byte 0

    // Apply the DES send operation to the 16 argument bytes before sending the second frame to the PICC
    des_ISO_encrypt(diversifiedKey, rndARndBComplement, ekRndARndBComplement, 16);

    cmd[0] = 0xAF;
    memcpy(&cmd[1], ekRndARndBComplement, 16);
    cmdLen = 17;

    ret = send_command( cmd, cmdLen, response, &responseLen );

    byte ekRndAComplement[8], rndAComplement[8], finalOutput[8];

    memcpy(&ekRndAComplement[0], &response[1], 8);
    des_ISO_decrypt(diversifiedKey, ekRndAComplement, rndAComplement, 8);

    memcpy(&finalOutput[1], &RndAComplement[0], 7);
    finalOutput[0] = rndAComplement[7];

    //compare the received RndA with the one we originally had
    return memcmp(&finalOutput[0], &rndA[0], 8);
}

注意:您应该拥有自己的 send_command ()(取决于您的读卡器), des_ISO_decrypt ()和 des_ISO_encrypt ( )(取决于您的DES库)。

答案 1 :(得分:0)

是的,可以与Mifare Ultralight C进行相互认证。使用以下程序:

第1步:发送启动验证命令。 (1A 00)到卡

步骤2:卡生成一个8字节的随机数RndB。该随机数是用多样化密钥加密的DES / 3DES,用ek(RndB)表示,然后传输到终端。

步骤3 终端在接收到的ek(RndB)上运行DES / 3DES解密操作,从而检索RndB。然后RndB向左旋转8位(第一个字节移动到RndB的末尾),产生RndB'。现在终端本身生成一个8字节的随机数RndA。该RndA与RndB'连接并使用DES / 3DES解密(使用密码块链接(CBC)发送模式链接两个块的解密)。此令牌dk(RndA + RndB')被发送到卡。

第4步:该卡在收到的令牌上运行DES / 3DES加密,从而获得RndA + RndB'。卡现在可以通过将其与通过在内部旋转8位原始RndB获得的RndB'进行比较来验证发送的RndB'。成功的验证向卡证明卡和终端具有相同的秘密(密钥)。如果验证失败,则卡将停止验证过程并返回错误消息。由于卡还接收到由终端产生的随机数RndA,它可以在RndA上执行8位旋转左操作以获得再次加密的RndA',从而产生ek(RndA')。该令牌被发送到终端。

步骤5:终端在接收到的ek(RndA')上运行DES / 3DES解密,从而获得RndA'以与终端内部旋转的RndA'进行比较。如果比较失败,终端退出程序并可能暂停卡。

第6步:该卡将身份验证状态设置为“已验证”

哪一部分给你一个问题?