RFID MFRC522 change authentication key

  • Guten Abend
    ich würde gerne den authentication key eines tags mithilfe dieser Software //script ändern krieg das aber nicht hin.
    Ich habe folgende Informationen:
    dieses Dokument auf Seite 12 zeigt schön wie so ein Tag aufgebaut ist bzw. ein Sektor in diesem
    Ich überschreibe nun die Value so wie ich das verstanden habe mit:
    Sector 8 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    da drin sollte doch auch der Key in den ersten Zeichen enthalten sein. Allerdings kann ich mich damit nicht einloggen sondern muss immer noch den Standard Key nutzen und der überschriebene key = [0x00,0x00,0x00,0x00,0x00,0x00] funktioniert nicht
    hat jemand eine Idee was ich da falsch mache?
    Ps. die karte hat eine Grösse von 8. :helpnew:


  • Was hast du dir denn gekauft? Die Standart-Sets von Ebay und Co? (Blaue Lesekarte + 1 Kartentag und 1 Keytag?)
    Ansonsten bitte genau sagen was du hast, denke aber dass das diese sind.


    Wenn ich mich nicht vollständig täusche, kannst du die UID daran nicht ändern, lediglich die anderen Bytes beschreiben. Hast du das auch schon versucht?


    Hey JumpY
    ja genau hab mir so n Standart Set gekauft. Allerdings möchte ich nicht die UID überschreiben sondern den authentication key eines Spezifischen Sektors.

  • Soo, ich habe mal gerade bei mir getestet und das Script ein wenig umgebaut (geht mit dem originalen aber auch, wollte nur die Ausgabe etwas abkürzen). Ich habe jetzt 2 Codes hier, einmal ein "Read2.py" und einmal ein "Write2.py", sind einfach nur abgeänderte Dateien von Read.py und Write.py.
    Read2.py:


    Write2.py

    Code
    #!/usr/bin/env python[/b]# -*- coding: utf8 -*-import RPi.GPIO as GPIOimport MFRC522import signalcontinue_reading = True# Capture SIGINT for cleanup when the script is aborteddef end_read(signal,frame):   global continue_reading   print "Ctrl+C captured, ending read."   continue_reading = False   GPIO.cleanup()# Hook the SIGINTsignal.signal(signal.SIGINT, end_read)# Create an object of the class MFRC522MIFAREReader = MFRC522.MFRC522()# This loop keeps checking for chips. If one is near it will get the UID and authenticatewhile continue_reading:      # Scan for cards       (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)   # Get the UID of the card   (status,uid) = MIFAREReader.MFRC522_Anticoll()   # If we have the UID, continue   if status == MIFAREReader.MI_OK:       # Print UID       print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])          # This is the default key for authentication       key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]              # Select the scanned tag       MIFAREReader.MFRC522_SelectTag(uid)       # Authenticate       status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)       # Check if authenticated       if status == MIFAREReader.MI_OK:           # Variable for the data to write           data = [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xA,0xB,0xC,0xD,0xE,0xF]           # Fill the data with 0x00           for x in range(0,16):               data.append(0x00)           print "Sector 8 will now be filled with data[]:"           # Write the data           MIFAREReader.MFRC522_Write(8, data)           print "It now looks like this:"           # Check to see if it was written           MIFAREReader.MFRC522_Read(8)           # Stop           MIFAREReader.MFRC522_StopCrypto1()           # Make sure to stop reading for cards           continue_reading = False       else:           print "Authentication error"


    Die Datei Read2.py ließt dir jetzt nur den Block aus, den du haben möchtest, also Block 8 und schreibt dir den ins Terminal (damit kannst du einfach überprüfen ob das Schreiben vorher erfolgreich war).
    Die Datei Write2.py schreibt dir Dateien in den Block 8 und gibt dir auch aus, wie der Block nach dem Schreiben aussieht. Dabei stehen die Daten die du schreiben willst in der Variable data[]. Da habe ich jetzt einfach mal von 0-15 reingeschrieben: 'data = [0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xA,0xB,0xC,0xD,0xE,0xF]' ; Somit musst du diese Zeile durch das ersetzen, was du haben möchtest. Wenn du da jetzt z.B. nur 5 Sachen einfügst, wird der Rest mit 0x00 aufgefüllt, dass siehst du an 'data.append(0x00)'. Da könntest du jetzt auf 0xFF oder 0x05 oder was auch immer einfügen, dann wird der Rest damit aufgefüllt.


    Also für dich: Erstelle beide Dateien in dem gleichen Ordner wo die Originaldateien drin sind und führe einfach die Write2.py aus und halte einen Tag dran. Überprüfe es anschließend nochmal mit Write2.py oder Dump.py (vollständige Ausgabe aller Bytes des Tags). Zu guter letzt: Freuen :D

  • Hey JumpY
    tut mir leid aber ich glaube du hast mich falsch verstanden.
    Ich würde gerne diesen Key da ändern:
    # This is the default key for authentication
    key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]

  • Ach, okay mein Fehler..
    Ich habe gerade nochmal an meinem rumgetestet, du kannst den Key genauso beschreiben wie auch die anderen Sektoren. Der Key steckt meines Wissens immer im Sektor davor, also z.B. der Authkey für Sektor 8 steht in Sektor 7. Wenn ich das gerade richtig im Kopf habe, stellt sich der Sektor so zusammen:


    [0, 0, 0, 0, 0, 0, 255, 7, 128, 105, 255, 255, 255, 255, 255, 255] (Das war ein Standartkey bei mir in Sektor 7)


    Key A: ersten 6 byte
    Key B: letzten 6 byte
    Accessbytes: die mittleren 4 byte


    Standardmäßig authed man sich über Key A, also wäre es machbar nur die ersten 6 byte zu beschreiben und die anderen UNBEDINGT beizubehalten!!!! Somit könntest du danach auf die folgenden Sektoren nurnoch mit dem neuen Key zugreifen (Sektor 8,9,10), in Sektor 11 steht dann der nächste Key für die folgenden Sektoren.


    Achtung: Überschreibst du irgendwas falsch, vergisst den Key oder sonstiges kannst du den Tag in die Tonne werfen. Ich habe gerade ausversehen beim zurücksetzen auf den Standardkey alles auf 0xFF geschrieben und komme nun nirgends mehr in den Tag. Ob ich da nochmal dran komme wage ich zu bezweifeln.


    EDIT: Wie ich bereits dachte, kann ich den Tag fröhlich entsorgen, die Sektoren sind auf Lenbenszeit gesperrt. Dazu ist folgendes Dokument wichtig, damit du weißt welche Accesbits du setzen kannst/darfst, andererseits würde ich die einfach so lassen wie sie sind.
    Hier die PDF, Seite 13 und 14 ist speziell für die Accessbits, da siehst du das bei allen 3 Bytes auf 1 alles gesperrt wird und der Sektor damit weg ist. (Ich gehe mal davon aus, dass 1 = 0xFF heißt, was die Standarteinstellung von "255,7,128,105" heißt, weiß ich allerdings auch nicht. Normalerweise müssten die ja alle auf 0 stehen. Vielleicht habe ich auch einen kleinen Denkfehler drin)
    http://www.nxp.com/documents/data_sheet/MF1S50YYX.pdf


    EDIT2: Hier siehst du wie die Accesbits aufgebaut sind, also was z.B. 255 etc. bedeutet in den einzelnen Tabellen. Wie das genau funktioniert habe ich auch noch nicht geblickt, also am besten erstmal Finger von den Bits lassen :P
    https://dangerousthings.com/wp…ontrol-for-Mifare-S50.pdf

  • Guten Abend JumpY
    ich habe nun folgendes versucht:
    folgendes auf Sektor 7 geschrieben: [1, 0, 0, 0, 0, 0, 255, 7, 128, 105, 255, 255, 255, 255, 255, 255]
    versucht mich mit dem Key zu identifizieren [0x01,0xFF,0xFF,0xFF,0xFF,0xFF] und damit[0x1,0xFF,0xFF,0xFF,0xFF,0xFF]
    allerdings funktioniert das nicht ich kann nun auch meinen ersten Tag wegwerfen ... ein glück sind die kosten dafür verkraftbar . :D
    naja und 1 = 0xFF kann ja auch nicht stimmen nach der Logik des Entwicklers wäre es ja
    0 = 0xFF was noch irgendwie sinn macht ... aber auch nicht wirklich weil laut google
    255 = 0xFF (Umrechnung von dezimal in hexadezimal) naja ich weiss was ich reingeschrieben habe aber was ist denn nun 1 für den Entwickler.
    Komischerweise kann ich auch noch auf Sektor 8 zugreifen nur Sektor 7 geht nun nicht mehr zum Lesen und Schreiben ... ich verstehe die Logik dahinter irgendwie nicht....
    und [0xFE,0xFF,0xFF,0xFF,0xFF] funktioniert auch nicht wenn 0xFF = 0 dann wäre ja 0xFE = 1...
    danke das du dir bisher so viel Zeit genommen hast ich bin dir so mega dankbar :danke_ATDE:

  • Ich hoffe, du hast den Key nicht wirklich so als Data geschrieben, du musst das natürlich schon in HEX schreiben, also korrekt wäre dein Key als:


    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF


    Dann müsste Key A zur Authorisierung: [0x01,0x00,0x00,0x00,0x00,0x00] sein, B entsprechend nur 0xFF.


    Was dazwischen die Bytes betrifft, lass die wie gesagt auf Standard. Die Entschlüsselung dazu findest du in beiden PDFs von mir, ich werde das aber mal noch genauer studieren und dann vorstellen. (Dauert aber minimum 2 Tage)

  • okay du bist der Hammer hat perfekt geklappt ...
    danke dir 1000 Mal wenn ich dir mal irgendwie helfen kann meld dich :D

  • Das freut mich!
    Könntest du deine Codes diesbezüglich zeigen, was du damit genau machst? Ich gehe davon aus, dass du etwas auf die Karte schreibst, den Key änderst und dann die entsprechenden Daten nurnoch über diesen Key auslesbar sind. Würde mich sehr freuen wenn du eine kurze Erklärung + Codes hier posten könntest, wird sicherlich der eine oder andere nochmal brauchen können!

  • Ja Klar :D
    Write:


    und Read:


    Lg Noel

  • Danke für die Antwort. Ich hatte das Problem, das bei mir der RPi Read.py nicht gefunden hat.
    Ich habe das jetzt eingefügt und jetzt kommt das:



    Traceback (most recent call last):
    File "Read2.py", line 16, in <module>
    MIFAREReader = MFRC522.MFRC522()
    NameError: name 'MFRC522' is not defined


    Könnt ihr mir helfen?

  • Hi Agentdroid 008!


    Du musst alle py Dateien, also Read.py, Write.Py und MFRCN522.py etc in ein und demselben Ordner speichern, da diesvoneinander abhängig sind!


    So, und nun zu meinem Problem:


    Ich hab das Gleiche vor wie noelelias. Ich hab es mithilfe von Write.py geschafft die Hex-Zahlen wie oben erwähnt auf mein NFC-Armband zu schreiben. Read.py gibt “Size: 4“ zurück. Es werden jedoch nur die ersten vier Bytes beschrieben, der Rest wird jeweils als “0“ angezeigt.


    Hätte ich nur data = [0x00,0x00,0x00,0x00] schreiben sollen oder data = [

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

    Hast du das mit “nicht überschreiben“ gemeint?


    Ich freue mich schon auf die Antwort ☺