如何使用Gemalto Prox-SU阅读器访问MIFARE 1k内存块?

时间:2016-09-08 20:22:56

标签: python authentication apdu mifare contactless-smartcard

我刚刚进入智能卡编程。

我正在使用Gemalto Prox-SU阅读器,并在Ubuntu 16.04计算机上有几张空白的MIFARE Classic 1k卡。 我安装了Gemalto Prox-SU阅读器并让读者使用Ludovic Russeau's pyscard通过python中的脚本检测卡片。

我设法编写了一个脚本,将APDU发送到读卡器/卡连接。我可以读取ATR,发送GetData命令来读取卡的序列号,并且一直在尝试向卡发送多个APDU以尝试读取卡内存块。但是,除了LoadKey命令之外,其他所有命令都返回“0x6982:安全状态不满足”

我知道我应该在每次读取和写入之前发送一个通用认证命令,如手册中所述,但即使是General Authenticate命令也会返回“安全状态不满足”。从我读过的内容来看,这应该非常简单。我错过了什么?如何设置我的脚本以便身份验证成功,我可以从内存块中读取数据?

1 个答案:

答案 0 :(得分:1)

使用Prox-SU阅读器阅读MIFARE Classic 1K卡的典型流程(请参阅manual)是:

  1. 加载身份验证密钥。例如,如果使用密钥A使用默认值("传输密钥")FF FF FF FF FF FF来读取您的卡,则可以使用以下LOAD KEY命令:

    FF 82 00 50 06 FFFFFFFFFFFF
          ^^ ^^    ^^^^^^^^^^^^
           |  |               \-- Key
           |  |
           |  \------------------ Key slot 80 (0x50)
           |
           \--------------------- Key in RAM (0x00)
    

    将密钥FF FF FF FF FF FF存储到阅读器易失性存储器(RAM)的第一个密钥槽(0x50)中。

  2. 使用GENERAL AUTHENTICATE命令对扇区进行身份验证。虽然您需要对整个扇区进行身份验证,但您需要通过块编号(通常是扇区的第一个块)来处理扇区:

    FF 86 00 00 05 01 0004 60 50
                      ^^^^ ^^ ^^
                         |  |  \-- Key slot 80 (0x50)
                         |  |
                         |  \----- Key type (0x60 = Key A, 0x61 = Key B)
                         |
                         \-------- Block number (block 4)
    
  3. 最后,您可以使用READ BINARY命令读取块:

    FF B0 0004 10
          ^^^^
             \-------- Block number (block 4)
    
  4. 如果您在GENERAL AUTHENTICATE期间收到状态代码69 82,则很可能表示您尝试使用错误的密钥进行身份验证。