【问题标题】:Mifare 1k value block operationsMifare 1k 值块操作
【发布时间】:2013-10-16 12:39:50
【问题描述】:

我对 Mifare Standard 1k 卡有疑问。我在地址为 62 的数据块上做了一个值块(00000001FFFFFFFE0000000100FF00FF - 有效?)。值块的值应该是 1,值块的地址是 0。

我已将数据块 2 的访问位更改为:

  • C1=1
  • C2=1
  • C3=0

其他 2 个数据块具有工厂访问位。扇区尾部的访问位也发生了变化,它们是:

  • C1=0
  • C2=1
  • C3=1

因此,对应扇区(第 16 个扇区)的访问位为 3B478C69(有效?)。

问题是我无法在该块上执行任何值块特定功能(递增、递减等),我总是得到6A81 作为响应->“卡被阻止或不支持命令”。 我使用的 APDU 是 FFF5C13E0400000001

【问题讨论】:

  • 您的访问位和块数据看起来还不错。你用什么读卡器来访问卡?您确定要发送给 MIFARE 阅读器的命令吗?
  • 我使用的是 Omnikey 5021 CL 阅读器。我发送的命令如下(格式:CLA INS P1 P2 Lc Data In):FF F5 Opcode(C0-decrement, C1-increment, C2-restore) SourceBlock 04 Operand.
  • 命令示例:FF F5 C1 56 04 00 00 00 01
  • 我不确定您从哪里获得该命令,但用于 MIFARE 卡的 PC/SC 的 OMNIKEY 扩展(根据 OMNIKEY 非接触式智能卡读卡器开发指南)使用 FF D4 P1 P2 04 XX XX XX XX 递增和 FF D8 P1 P2 04 XX XX XX XX 递减,其中 P1 是块地址的 MSB,P2 是块地址的 LSB,XX XX XX XX 是递增/递减值(LSB 在前)。
  • 顺便说一句。浏览我的代码示例发现,该用户手册的旧版本对这些命令使用的格式略有不同:FF D4 P1 P2 01 XX 用于递增,FF D8 P1 P2 01 XX 用于递减。

标签: nfc rfid mifare apdu contactless-smartcard


【解决方案1】:

OMNIKEY 读卡器对非接触式存储卡的 PC/SC API 进行了扩展。这些扩展定义的用于增加和减少 MIFARE Classic 值块的命令是:

增量:

+------+------+------+------+------+--------------+ |共轭亚油酸 | INS | P1 | P2 | LC |数据 | +------+------+------+------+------+--------------+ | 0xFF | 0xD4 |块# | 0x04 | XX 00 00 00 | +------+------+------+------+------+--------------+

或(取决于固件版本???)具有 1 字节数据字段的相同命令:

+------+------+------+------+------+----+ | 0xFF | 0xD4 |块# | 0x01 | XX | +------+------+------+------+------+----+

递减:

+------+------+------+------+------+--------------+ |共轭亚油酸 | INS | P1 | P2 | LC |数据 | +------+------+------+------+------+--------------+ | 0xFF | 0xD8 |块# | 0x04 | XX 00 00 00 | +------+------+------+------+------+--------------+

或(取决于固件版本???)具有 1 字节数据字段的相同命令:

+------+------+------+------+------+----+ | 0xFF | 0xD8 |块# | 0x01 | XX | +------+------+------+------+------+----+

方块#: P1 是块号的 MSB(始终为零),P2 是块号的 LSB。

XX: 递增/递减值。

这些命令记录在OMNIKEY Contactless Smart Card Readers Developer Guide

似乎两个命令都隐含地发出传输命令来提交操作。没有记录 PC/SC 扩展的恢复命令,但是,恢复命令可通过 OMNIKEY 同步 API 获得。

【讨论】:

  • 那么,在值块上使用递增和递减函数时,值块的损坏是否存在一些危险?它会发生吗?例如,我在交易过程中取出卡并中断交易。如果是这样,并且值块已损坏,我怎样才能从值块中取回我的数据?还有,值块中的地址有什么用?
  • 到目前为止,我们的经验是(至少使用 OMNIKEY 阅读器,但我也假设与其他阅读器一起使用)即使使用递增/递减命令。
  • 如果您的卡上的数据已损坏,您该怎么办?有没有更智能的方法可以安全地在卡片上书写?
  • 嗯,不多。我们尝试过的一种方案(效果很好)是使用两个值块来存储相同的数据,并使用一个附加块来存储块状态标志。然后,在每次更新值块​​之前和之后写入这些标志。如果发生撕裂,您可以根据值块和标志块的格式/内容确定哪个值块仍然有效。
  • 因为这个讨论超出了我一开始提出的问题的范围,所以我开始了一个新问题:stackoverflow.com/questions/19709289/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多