Mifare authentication
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.
- Sector 0 contains Block (0,1,2,3)
- Sector 1 contains Block (4,5,6,7)
- Sector 2 contains Block (8,9,10,11)
- 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
Admin
Updated on August 19, 2022Comments
-
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
?