RFID

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
dermartini
User
Beiträge: 1
Registriert: Samstag 3. November 2018, 23:42

Servus, ich habe den unten aufgeführten Code, der mit Hilfe eines RC522 Modules meine RFID Karten auslesen soll.

Das funktioniert soweit auch alles, aber wenn ich meine Karte an das Modul halte, kommt folgender Fehler:

Code: Alles auswählen

Card detected
Card read UID: 136,4,150,165
Size: 4
AUTH ERROR!!
AUTH ERROR(status2reg & 0x08) != 0
Authentication error
Es liegt also an dem in der PythonCode angegeben Key:

# This is the default key for authentication
key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]

Welche Möglichkeiten habe ich diesen Authentication-Key von einer Karte auszulesen?

Hier auf dieser Seite ist der Aufbau beschrieben, ich werde daraus aber nicht schlau...
https://www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf

Hier der Code der Read.py

Vielen Dank für die Hilfe!

Code: Alles auswählen


MFRC522-python/Read.py
65ebda1  on 20 Mar
@mxgxw mxgxw Merge branch 'master' into master
@mxgxw @mj3052 @wybczu @BiTinerary
     
82 lines (64 sloc)  2.5 KB
#!/usr/bin/env python
# -*- coding: utf8 -*-
#
#    Copyright 2014,2018 Mario Gomez <mario.gomez@teubi.co>
#
#    This file is part of MFRC522-Python
#    MFRC522-Python is a simple Python implementation for
#    the MFRC522 NFC Card Reader for the Raspberry Pi.
#
#    MFRC522-Python is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Lesser General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    MFRC522-Python is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Lesser General Public License for more details.
#
#    You should have received a copy of the GNU Lesser General Public License
#    along with MFRC522-Python.  If not, see <http://www.gnu.org/licenses/>.
#

import RPi.GPIO as GPIO
import MFRC522
import signal

continue_reading = True

# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()

# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)

# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()

# Welcome message
print "Welcome to the MFRC522 data read example"
print "Press Ctrl-C to stop."

# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:
    
    # Scan for cards    
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

    # If a card is found
    if status == MIFAREReader.MI_OK:
        print "Card detected"
    
    # 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: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], 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:
            MIFAREReader.MFRC522_Read(8)
            MIFAREReader.MFRC522_StopCrypto1()
        else:
            print "Authentication error"
Benutzeravatar
__blackjack__
User
Beiträge: 13073
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dermartini: Wenn man von der Karte auslesen könnte mit welchem Schlüssel man sich authentifizieren kann, dann wäre der ganze Vorgang ziemlich sinnlos. ;-)

Wenn also die bekannte Werksvoreinstellung nicht geht, dann könnte man noch hoffen, dass es eine Möglichkeit gibt die Karte auf die Voreinstellungen rücksetzen zu können.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@dermartini: Dir ist klar, was Authentifizierung bedeutet? Nur derjenige, der den richtigen Schlüssel kennt, kann die Karte lesen. Braucht man z.B. dann, wenn man die Karte als Zugangsschlüssel benutzt, damit sie nicht jeder kopieren kann.

Um den großen Schrott, der so an Pythoncode herumfliegt etwas einzudämmen:

Code: Alles auswählen

import RPi.GPIO as gpio
import MFRC522

def read_card(reader, key):
    # Scan for cards    
    (status, tag_type) = reader.MFRC522_Request(reader.PICC_REQIDL)

    # If a card is found
    if status != reader.MI_OK:
        return None
    print "Card detected"
            
    # Get the UID of the card
    (status, uid) = reader.MFRC522_Anticoll()

    # If we have the UID, continue
    if status != reader.MI_OK:
        return None

    # Print UID
    print "Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3])
    # Select the scanned tag
    reader.MFRC522_SelectTag(uid)

    # Authenticate
    status = reader.MFRC522_Auth(reader.PICC_AUTHENT1A, 8, key, uid)

    # Check if authenticated
    if status != reader.MI_OK:
        print "Authentication error"
        return None
    data = reader.MFRC522_Read(8)
    reader.MFRC522_StopCrypto1()
    return data

def main():
    try:
        reader = MFRC522.MFRC522()

        # Welcome message
        print "Welcome to the MFRC522 data read example"
        print "Press Ctrl-C to stop."

        # This is the default key for authentication
        key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
        # This loop keeps checking for chips. If one is near it will get the UID and authenticate
        while True:
            data = read_card(reader, key) 
            if data is not None:
                print data           
    except KeyboardInterrupt:
        print "Ctrl+C captured, ending read."
    finally:
        gpio.cleanup()

if __name__ == '__main__':
    main()
Antworten