我想获得Mifare Ultralight NFC标签的UID.在Java中我有这个代码:
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
CardTerminal terminal = terminals.get(0);
Card card = terminal.connect("*");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
ResponseAPDU answer = channel.transmit(new CommandAPDU(0xFF, 0xCA, 0x00, 0x00, 0x00));
byte[] uid = answer.getBytes();
Run Code Online (Sandbox Code Playgroud)
问题是我收到两个字节而不是UID.有什么问题?APDU是否正确?
我想要实现的是将APDU命令发送到MIFARE Classic 1K卡以更改其A和B键.
我能够与卡建立连接并使用默认密钥(FFFFFFFFFFFF)来读取块0和块1.我使用了HID MifareSamples应用程序.
现在,我想将A键从默认更改为其他内容.我在这里找到了一个解决方案,在stackoverflow(Mifare Change KEY A和B),这表明我必须发送这个APDU:
新密钥A = 00 11 22 33 44 55未覆盖访问位密钥B未使用(所以FF FF FF FF FF FF)
=>写入扇形拖车00 11 22 33 44 55 FF 0F 00 FF FF FF FF FF FF FF
我找到了一个很好的工具JSmartCard Explorer,它允许你将APDU发送到卡上.然后我阅读了PCSC规范3.2.2.1.4加载密钥命令章节并理解命令应该如下所示:
FF 82 00 00 18 00 11 22 33 44 55 FF 0F 00 FF FF FF FF FF FF FF
Run Code Online (Sandbox Code Playgroud)
但不幸的是,JSmartCard工具失败了,"命令不允许(没有当前的EF)".
我做错了什么?我该如何更改密钥?
我知道这篇文章: - Mifare Classic 1K的锁定机制
但是,实际上并不清楚 - 如何FF 07 80 FF在此字符串中计算值:
D3 F7 D3 F7 D3 F7 FF 07 80 FF 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)
这意味着可以使用密钥A读取块并使用密钥B写入但不允许使用inc/dec.
如果我必须支持递增和递减操作,访问位应该如何.我知道C1,C2和C3必须是1,1,0这是如何反映到字节6,7和8.
任何帮助将非常感激.