Mifare authentication

14,750

Solution 1

Read this Article.Here you will find the APDU structure to communicate with Mifare card...

Solution 2

In Mifare Classic 1K tags There are 16 Sectors and each Sectors contains 4 Blocks and each block contains 16 bytes.

  1. Sector 0 contains Block (0,1,2,3)
  2. Sector 1 contains Block (4,5,6,7)
  3. Sector 2 contains Block (8,9,10,11)
  4. Sector 3 contains Block (12,13,14,15)....

Before Reading or writing from a block You must have to Authenticate its corresponding Sector using Key A or Key B of that sector. When Authentication is complete then you can read or write. using this command you can authenticate sector 0 using KEY A(60)

byte[] authenticationByte = new byte[10];  

authenticationByte = new byte[] { (byte) 0xFF, (byte) 0x86, (byte) 0x00,
 (byte) 0x00, (byte) 0x05, (byte) 0x00,(byte) 0x00, (byte) 0x04, 
                                    (byte) 0x60,(byte) 0x00 };

When Authentication is succes then you will get 90 00. That is Success message. Else response is 63 00 , that means authentication failed. When Authentication complete then you can read block (0,1,2,3) cause sector 0 contains 4 block and those are block (0,1,2,3).

For more details you can read this Answer. Sorry for bad English

Share:
14,750
Admin
Author by

Admin

Updated on August 19, 2022

Comments

  • Admin
    Admin almost 2 years

    Say I want to authenticate to Mifare Classic.

    How do I know the exact kind of APDU to send to the card?

    Example.

    This code:

    bcla = 0xFF;
    bins = 0x86;
    bp1 =  0x0;
    bp2 =  0x0; // currentBlock
    len =  0x5;
    
    sendBuffer[0] = bcla;
    sendBuffer[1] = bins;
    sendBuffer[2] = bp1;
    sendBuffer[3] = bp2;
    sendBuffer[4] = len;
    sendBuffer[5] = 0x1;                // Version
    sendBuffer[6] = 0x0;                // Address MSB
    sendBuffer[7] = currentBlock;
    if(keyradioButton->Checked==true)   // Address LSB
         sendBuffer[8] = 0x60;              // Key Type A
    else if(keynumberradioButton->Checked ==true)
        sendBuffer[8] = 0x61;               // Key Type B
    sendBuffer[9] = keynumber;          // Key Number
    
    sendbufferlen = 0xA;
    receivebufferlen = 255;
    
    //Invoke the Transmit command
    retval = SCardTransmit(hCard,  // A reference value returned from the SCardConnect function.
                                     &sioreq, 
                                  sendBuffer,  // Send buffer
                               sendbufferlen,  // Send buffer length
                                     &rioreq, 
                               receiveBuffer,  // Receive butter
                          &receivebufferlen);  // Length of received buffer
    

    is a sample program which tries to authenticate to Mifare Classic. My question is basically, how do I know what kind of APDU to send to the card? e.g., how do I know what should be in the sendBuffer?