Go Down

Topic: Error cambiando las claves en RFID (Read 488 times) previous topic - next topic

MiguelCalvo

Ante todo muchas gracias a todos por la ayuda que seguro me prestan.

Estoy con un proyecto de control de asistencia mediante RFID, para lo cual uso un Arduino RFID RC522 con la librería rfid-master.

Quiero cambiar la clave algunos sectores para que no se puedan copiar los datos de los "tags", para ello he intentado cambiar la KeyA del sector 7 mediante esta modificación de los ejemplos de la librería:
Code: [Select]
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9               // Configurado Arduino 1
#define SS_PIN          10              // Configurado Arduino 1

MFRC522 mfrc522(SS_PIN, RST_PIN);       // Crea instancia  MFRC522

  byte buffer[18];
  byte block;
 
void setup() {
  Serial.begin(9600);                   // Initiza la comunicacion serie
  SPI.begin();                          // Inicia el bus SPI
  mfrc522.PCD_Init();                   // Inicia tarjeta  MFRC522
  Serial.println(F("Escribir datos personales en un PICC MIFARE "));
}

void loop() {

  // Preparar clave - todas las teclas se ajustan a FF FF FF FF FF FFh en la entrega de chips desde la fábrica.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;


  if ( ! mfrc522.PICC_IsNewCardPresent()) {             // Busque nuevas tarjetas
    return;
  }

  if ( ! mfrc522.PICC_ReadCardSerial()) {               // Seleccione una de las tarjetas
    return;
  }

  Serial.print(F("Tag ID:"));                                           // ID del TagI
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.print(F(" Tipo Tag: "));                                       // Tipo de Tag
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));

  MFRC522::StatusCode status;
 
  block = 7;                                            // bloque quese desea cambiar
 
    buffer[0] = 0xAA;       buffer[1] = 0xBB;       buffer[2] = 0xCC;                               //6 primeros nueva clave
    buffer[3] = 0xDD;       buffer[4] = 0xEE;       buffer[5] = 0xFF;       
    buffer[6] = 0xFF;       buffer[7] = 0x7;        buffer[8] = 0x80;       buffer[9] = 0x69;       // 4 siguientes FF, 7, 80, 69
    buffer[01] = 0xFF;      buffer[11] = 0xFF;      buffer[12] = 0xFF;                              // 6 ultimos FF
    buffer[13] = 0xFF;      buffer[14] = 0xFF;      buffer[15] = 0xFF;       
   
  Serial.println(F("Autenticacion mediante 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("Error de autenticacion: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("Autenticacion correcta: "));

  // Escribir bloque
  status = mfrc522.MIFARE_Write(block, buffer, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Eror deescritura: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("Escritura correcta: "));
   
 
  Serial.println(" ");
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();  // Detener el cifrado en PCD

}


Creo que la escritura es correcta, pues al hacer Dump con el programa de ejemplo los sectores 4 a 7 no se ven por error de autenticación.

El problema viene cuando intento leerlos, pues me falla la autenticación, aunque uso la nueva KeyA

para intentar leerlos uso este código:

Code: [Select]
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9           // Para Arduino 1
#define SS_PIN          10          // Para Arduino 1

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Creamos una instancia MFRC522

byte block;                           // algunas variables necesarias
byte len;
byte buffer1[18];

void setup() {
  Serial.begin(9600);                                   
  SPI.begin();                                           
  mfrc522.PCD_Init();                                       
  Serial.println(F("Leer datos personales en un PICC MIFARE:"));   
}


void loop() {

                                        // Clave de fabrica FF FF FF FF FF F
  MFRC522::MIFARE_Key key;
//    key.keyByte[0] = 0xFF;          key.keyByte[1] = 0xFF;          key.keyByte[2] = 0xFF;
//    key.keyByte[3] = 0xFF;          key.keyByte[4] = 0xFF;          key.keyByte[5] = 0xFF;

                                    // Mi clave AA BB CC DD EE FF
    key.keyByte[0] = 0xAA;          key.keyByte[1] = 0xBB;          key.keyByte[2] = 0xCC;
    key.keyByte[3] = 0xDD;          key.keyByte[4] = 0xEE;          key.keyByte[5] = 0xFF;

  MFRC522::StatusCode status;

  //-------------------------------------------

  if ( ! mfrc522.PICC_IsNewCardPresent()) {             // Buscar nuevas tarjetas
    return;
  }
 
  if ( ! mfrc522.PICC_ReadCardSerial()) {               // Seleccionamos una de las tarjetas
    return;
  }

  Serial.println(F("**Tarjeta detectada:**"));

  //-------------------------------------------

  mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); // descargar algunos detalles de la tarjeta

  //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));      // descomenta esto para ver todos los bloques en hexadecimal

  //-------------------------------------------

  Serial.print(F("Bloque 6: "));

  block = 6;                        // leemos bloque 6
  len = 18;
 
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Error de autenticacion: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    //return;
  }

  status = mfrc522.MIFARE_Read(block, buffer1, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("La lectura falló: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    //return;
  }

  for (uint8_t i = 0; i < 18; i++) {                    //Escribir datos
      Serial.print(buffer1[i], HEX);
      Serial.print(" ");
  }
 
  Serial.println(" ");


  //----------------------------------------

  Serial.println(F("\n**Fin de Lectura**\n"));

  delay(6000);

  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
   
}


El código paree que esta bien, pues si pongo la clave original y escojo un sector no afectado lo lee sin problemas.

Llevo un montón de tiempo dándole vueltas y no encuentro el fallo. ¿tiene alguien idea de cual puede ser?

Muchas gracias



surbyte

Esta no es una consulta para esta sección PROYECTOS sino para Software.
El hilo será movido.

GO_zalo

he estado haciendo pruebas.... el sector trailer esta bien, y si lo grabo con el movil no da problemas, se puede acceder al bloque para leer y escribir con exito

pero si lo hago desde tu codigo el sector se vuelve corrupto y ya llevo dos sectores muertos

me quedan 12 sectores (por que el resto los uso para otra cosa ynome los quiero cargar

seguire intentenado

GO_zalo

YA ESTAAAAAA


es un fallo muuu tonto los que mas faena dan
Code: [Select]
buffer[0] = 0xAA;       buffer[1] = 0xBB;       buffer[2] = 0xCC;                               //6 primeros nueva clave
    buffer[3] = 0xDD;       buffer[4] = 0xEE;       buffer[5] = 0xFF;       
    buffer[6] = 0xFF;       buffer[7] = 0x7;        buffer[8] = 0x80;       buffer[9] = 0x69;       // 4 siguientes FF, 7, 80, 69
    buffer[01] = 0xFF;      buffer[11] = 0xFF;      buffer[12] = 0xFF;                              // 6 ultimos FF
    buffer[13] = 0xFF;      buffer[14] = 0xFF;      buffer[15] = 0xFF; 


fijate que en vez de  buffer[10]  has puesto  buffer[01]

solo tienes que cambiar eso!

como me he dado cuenta?? he guardado los datos en vez de un sector trailer, en un sector normal, por que pensaba que era algo con el orden y he observado que me salia AAFFCCDDEEFF entonces tachannn he añadido a la lista de claves esa clave y mis sectores ya han revivido, (te recomiendo la app mifrare classic tool para el movil)

saludos


MiguelCalvo

Vergüenza me da el haber metido la pata en una cosa que debería haber visto antes. No sabes la cantidad de paginas que he visitado para encontrar una solución. Es muy de agradecer que quien sabe de verdad ayude los que estamos empezando. Muchas gracias.

En cuanto a lo del móvil, yo uso Windows Phone, intentare buscar alguna aplicación parecida, si la hay.

Muchas gracias otra vez

Go Up