1

I just received a RC522 board and since i am new to RFID, I tried out some examples from "Arduino RFID Library for MFRC522". Here's one of them rfid_default_keys

/*
 * ----------------------------------------------------------------------------
 * This is a MFRC522 library example; see https://github.com/miguelbalboa/rfid
 * for further details and other examples.
 * 
 * NOTE: The library file MFRC522.h has a lot of useful info. Please read it.
 * 
 * Released into the public domain.
 * ----------------------------------------------------------------------------
 * Example sketch/program which will try the most used default keys listed in 
 * https://code.google.com/p/mfcuk/wiki/MifareClassicDefaultKeys to dump the
 * block 0 of a MIFARE RFID card using a RFID-RC522 reader.
 * 
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 * MFRC522 Arduino Arduino Arduino Arduino Arduino
 * Reader/PCD Uno Mega Nano v3 Leonardo/Micro Pro Micro
 * Signal Pin Pin Pin Pin Pin Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
 * SPI SS SDA(SS) 10 53 D10 10 10
 * SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
 * SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
 * SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
 *
 */
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
// Number of known default keys (hard-coded)
// NOTE: Synchronize the NR_KNOWN_KEYS define with the defaultKeys[] array
#define NR_KNOWN_KEYS 8
// Known keys, see: https://code.google.com/p/mfcuk/wiki/MifareClassicDefaultKeys
byte knownKeys[NR_KNOWN_KEYS][MFRC522::MF_KEY_SIZE] = {
 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // FF FF FF FF FF FF = factory default
 {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // A0 A1 A2 A3 A4 A5
 {0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5}, // B0 B1 B2 B3 B4 B5
 {0x4d, 0x3a, 0x99, 0xc3, 0x51, 0xdd}, // 4D 3A 99 C3 51 DD
 {0x1a, 0x98, 0x2c, 0x7e, 0x45, 0x9a}, // 1A 98 2C 7E 45 9A
 {0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // D3 F7 D3 F7 D3 F7
 {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, // AA BB CC DD EE FF
 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // 00 00 00 00 00 00
};
/*
 * Initialize.
 */
void setup() {
 Serial.begin(9600); // Initialize serial communications with the PC
 while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
 SPI.begin(); // Init SPI bus
 mfrc522.PCD_Init(); // Init MFRC522 card
 Serial.println(F("Try the most used default keys to print block 0 of a MIFARE PICC."));
}
/*
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
 for (byte i = 0; i < bufferSize; i++) {
 Serial.print(buffer[i] < 0x10 ? " 0" : " ");
 Serial.print(buffer[i], HEX);
 }
}
/*
 * Try using the PICC (the tag/card) with the given key to access block 0.
 * On success, it will show the key details, and dump the block data on Serial.
 *
 * @return true when the given key worked, false otherwise.
 */
boolean try_key(MFRC522::MIFARE_Key *key)
{
 boolean result = false;
 byte buffer[18];
 byte block = 0;
 byte status;
 // Serial.println(F("Authenticating using key A..."));
 status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, key, &(mfrc522.uid));
 if (status != MFRC522::STATUS_OK) {
 // Serial.print(F("PCD_Authenticate() failed: "));
 // Serial.println(mfrc522.GetStatusCodeName(status));
 return false;
 }
 // Read block
 byte byteCount = sizeof(buffer);
 status = mfrc522.MIFARE_Read(block, buffer, &byteCount);
 if (status != MFRC522::STATUS_OK) {
 // Serial.print(F("MIFARE_Read() failed: "));
 // Serial.println(mfrc522.GetStatusCodeName(status));
 }
 else {
 // Successful read
 result = true;
 Serial.print(F("Success with key:"));
 dump_byte_array((*key).keyByte, MFRC522::MF_KEY_SIZE);
 Serial.println();
 // Dump block data
 Serial.print(F("Block ")); Serial.print(block); Serial.print(F(":"));
 dump_byte_array(buffer, 16);
 Serial.println();
 }
 Serial.println();
 mfrc522.PICC_HaltA(); // Halt PICC
 mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
 return result;
}
/*
 * Main loop.
 */
void loop() {
 // Look for new cards
 if ( ! mfrc522.PICC_IsNewCardPresent())
 return;
 // Select one of the cards
 if ( ! mfrc522.PICC_ReadCardSerial())
 return;
 // Show some details of the PICC (that is: the tag/card)
 Serial.print(F("Card UID:"));
 dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
 Serial.println();
 Serial.print(F("PICC type: "));
 byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
 Serial.println(mfrc522.PICC_GetTypeName(piccType));
 // Try the known default keys
 MFRC522::MIFARE_Key key;
 for (byte k = 0; k < NR_KNOWN_KEYS; k++) {
 // Copy the known key into the MIFARE_Key structure
 for (byte i = 0; i < MFRC522::MF_KEY_SIZE; i++) {
 key.keyByte[i] = knownKeys[k][i];
 }
 // Try the key
 if (try_key(&key)) {
 // Found and reported on the key and block,
 // no need to try other keys for this PICC
 break;
 }
 }
}

So i modified the code to see exactly what is happening there and here is my output: my output

Everything looks fine, right ? So i tried to modify it again by adding some more stuff to the knownKeys array but it looks like that only the first key is used in the actual authentication. Here's an output for the same card but i moved {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // FF FF FF FF FF FF = factory default to the end of that array. enter image description here

So.. as you can see even if it used the right key, nothing happened. For the solution i tried few things but without a success. Thanks in advance for answering.

asked Jul 3, 2015 at 18:16

4 Answers 4

1

Call:

if ( ! mfrc522.PICC_IsNewCardPresent()) return false;
if ( ! mfrc522.PICC_ReadCardSerial()) return false;

before every re-authenticate.


According to NXPs application note (AN1304) regarding MIFARE CLASSIC cards (page 24/25):

Each time an Authentication operation, a Read operation or a Write operation fails, the MIFARE Classic or MIFARE Plus remains silent and it does not respond anymore to any commands. In this situation in order to continue the NDEF Detection Procedure the MIFARE Classic or MIFARE Plus needs to be re-activated and selected.

  1. PICC_IsNewCardPresent resets modulation parameters and performs RequestA - activates the PICC (Card).
  2. PICC_ReadCardSerial basically just performs Select - with anti-collision algorithm.

In case there are multiple cards present it would be better to manually call mfrc522.PICC_Select(&mfrc522.uid, mfrc522.uid.size * 8), the second argument tells it that you already know all of the bits for UID, thus it will select the same PICC that was selected previously.

answered Aug 18, 2015 at 23:14
0
2

Based on some experimenting, I believe the 1st key is skipped for one of two reasons:

  1. If you follow the code flow, in loop(), PICC_IsNewCardPresent() and PICC_ReadCardSerial() called. If a "new" card/tag is present, then try_key() is called which calls PICC_IsNewCardPresent() [and PICC_ReadCardSerial()] again. Since the card/tag is not "new", PICC_IsNewCardPresent() returns false. or
  2. It appears that if the correct key is the default of all 0xFF's, then a call to PCD_Authenticate() will fail.

I'm still working a new version of rfid_default_keys to fix the problem.

answered Aug 19, 2018 at 1:19
1

i replaced

if (try_key(&key)) {
 // Found and reported on the key and block,
 // no need to try other keys for this PICC
break;

by

if (try_key(&key)) break;
 // Found and reported on the key and block,
 // no need to try other keys for this PICC
 
if (!rfid->PICC_IsNewCardPresent() || !rfid->PICC_ReadCardSerial()) {
 delay(50);
 }

now it tries all entries in the key array until it finds the correct one. Thanks for the hint !

answered Aug 13 at 0:50
0

If called:

if ( ! mfrc522.PICC_IsNewCardPresent()) return false;
if ( ! mfrc522.PICC_ReadCardSerial()) return false;

before every re-authenticate. You will skip the FIRST item in array knownKeys so you will never test the default key FF FF FF FF FF FF.

per1234
4,2782 gold badges23 silver badges43 bronze badges
answered Jan 18, 2018 at 10:10

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.