我刚刚进入智能卡编程。
我正在使用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命令也会返回“安全状态不满足”。从我读过的内容来看,这应该非常简单。我错过了什么?如何设置我的脚本以便身份验证成功,我可以从内存块中读取数据?
答案 0 :(得分:1)
使用Prox-SU阅读器阅读MIFARE Classic 1K卡的典型流程(请参阅manual)是:
加载身份验证密钥。例如,如果使用密钥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)中。
使用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)
最后,您可以使用READ BINARY命令读取块:
FF B0 0004 10 ^^^^ \-------- Block number (block 4)
如果您在GENERAL AUTHENTICATE期间收到状态代码69 82
,则很可能表示您尝试使用错误的密钥进行身份验证。