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

How to access MIFARE 1k memory blocks with Gemalto Prox-SU reader?

我最近才开始接触智能卡编程。

我正在使用 Gemalto Prox-SU reader 并且在 Ubuntu 16.04 机器上有几张空白的 MIFARE Classic 1k 卡可用。 我已经安装了 Gemalto Prox-SU reader 并使用 Ludovic Russeau's pyscard.

通过 python 中的脚本获取 reader 来检测卡

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

我知道我应该在每次读取和写入之前发送通用身份验证命令,如手册中所述,但即使是通用身份验证命令也会返回 "security status not satisfied"。从我一直在阅读的内容来看,这应该非常简单。我错过了什么?如何设置我的脚本以便身份验证成功并且我可以从内存块中读取数据?

使用 Prox-SU reader(参见 manual)读取 MIFARE Classic 1K 卡的典型流程是:

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

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

    这会将密钥 FF FF FF FF FF FF 存储到 reader 的易失性存储器 (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)
    

如果您在 GENERAL AUTHENTICATE 期间收到状态代码 69 82,这很可能表明您尝试使用不正确的密钥进行身份验证。