【问题标题】:How to access MIFARE 1k memory blocks with Gemalto Prox-SU reader?如何使用 Gemalto Prox-SU 阅读器访问 MIFARE 1k 内存块?
【发布时间】:2016-09-08 20:22:56
【问题描述】:

我最近刚刚涉足智能卡编程。

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

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

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

【问题讨论】:

    标签: python authentication apdu mifare contactless-smartcard


    【解决方案1】:

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

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

      FF 82 00 50 06 FFFFFFFFFFFF ^^ ^^ ^^^^^^^^^^^^ | | \ - 钥匙 | | | \----------------- 密钥槽 80 (0x50) | \--------------------- 输入 RAM (0x00)

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

    2. 使用 GENERAL AUTHENTICATE 命令对扇区进行身份验证。即使您对整个扇区进行身份验证,您也需要通过块号(通常是扇区的第一个块)来寻址该扇区:

      FF 86 00 00 05 01 0004 60 50 ^^^^ ^^ ^^ | | \-- 密钥槽 80 (0x50) | | | \----- 密钥类型(0x60 = 密钥 A,0x61 = 密钥 B) | \-------- 块号(块 4)
    3. 最后,您可以使用 READ BINARY 命令读取块:

      FF B0 0004 10 ^^^^ \-------- 块号(块 4)

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

    【讨论】:

    • 您说“如果您的卡可以使用具有默认值的密钥 A(“传输密钥”)FF FF FF FF FF FF 读取,您将使用以下 LOAD KEY 命令”。这已经奏效了,就我最初的问题而言,这已经解决了 mt 的麻烦。不过,那如果有新的麻烦。我怎么知道卡是否可以单独使用 keyA 读取?这是我以后可以设置的吗?
    • @GugaFigueiredo 每个扇区都有两个键(键 A 和键 B)。每个扇区中的块可以被配置为可由密钥 A 或密钥 B 读取和/或写入。配置访问条件的密钥和位存储在每个扇区的最后一个块(“扇区尾部”)中。扇区尾部可以像任何其他块一样访问(除了在读取命令期间返回的数据中屏蔽了键的值)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多