使用javax.smartcardio从mifare classic中读取块 [英] Reading block from mifare classic using javax.smartcardio

查看:195
本文介绍了使用javax.smartcardio从mifare classic中读取块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Java的javax.smartcardio阅读关于Mifare classic的特定块。
这是我的代码:

I would like to read a specific block on Mifare classic using Java's javax.smartcardio. Here's my code:

public byte[] getCardUID() throws CardException {
    CardTerminals terminals = TerminalFactory.getDefault().terminals();
    terminal = terminals.list().get(0);
    Card card = terminal.connect("*");
    CardChannel channel = card.getBasicChannel();
    CommandAPDU command = new CommandAPDU( new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0xD4, (byte) 0x4A, (byte) 0x01, (byte) 0x00 });
    ResponseAPDU response = channel.transmit(command);
    card.disconnect(true);
    if (response.getSW1() == 0x90) {
        byte[] data = response.getData();
        data = Arrays.copyOfRange(data, 0x08, data.length);
        return data;
    }
    return new byte[] {};
}

此方法(在互联网上找到的样本)成功读取卡的UID,但是当我尝试构建自己的命令时,我总是变成错误SW1 = 63。

This method (sample found on internet) successfully reads the UID of the card, but when I try to construct my own command, I always become error SW1=63.

在这个网站上(http://www.acs.com.hk/drivers /eng/API_ACR122U_v2.00.pdf)我发现了一些关于APDU的信息,但没有任何工作,我找不到原因。
我尝试了以下命令但没有成功(总是错误63):
FF B0 00 04 10(B0 - 读取二进制块,04 - 扇区数,10 - 读取16字节)。我也试过只读一个字节,读取值块(INS B1)但也没有成功。

On this site (http://www.acs.com.hk/drivers/eng/API_ACR122U_v2.00.pdf) i have found some informations about APDU, but nothing is working and i cannot find out why. I have tried following command without success (always error 63): FF B0 00 04 10 (B0 - read binary block, 04 - number of sector, 10 - read 16 bytes). I have also tried reading only one byte, reading value block (INS B1) but also no success.

FF 00 00 00 ...(来自我的例子)应该是直接传输,但我不知道以下有关读取块的说明。

FF 00 00 00 ... (from my example) should be a direct transmit, but i don't know following instructions for reading a block.

任何人都可以帮助我吗?非常感谢。
(对不起我的英文)

Can anyone help me? Thanks a lot. (Sorry for my english)

推荐答案

在Mifare Classic 1K标签中有16个扇区,每个扇区包含4个块每个块包含16个字节。
从页面读取或写入之前必须使用密钥A或密钥B对扇区进行身份验证。验证完成后,您可以进行读取或写入。
这是验证命令
使用该密钥作为密钥A(60)验证扇区0:

In Mifare Classic 1K tags There are 16 Sectors and each Sectors contains 4 Blocks and each block contains 16 bytes. Before Reading or writing from a page You must have to Authenticate The Sector using Key A or Key B. When Authentication is complete then you can read or write. Here is the Authentication Command Authenticate sector 0 using that key as key A (60):

FF 86 0000 05 01 0000 60 00

或使用该密钥作为密钥B验证扇区0(61) :

Or authenticate sector 0 using that key as key B(61):

FF 86 0000 05 01 0000 61 00

或使用此命令您还可以验证扇区0

or using this command you can also authenticate sector 0

byte[] authenticationByte = new byte[10];
authenticationByte = new byte[] { (byte) 0xFF, (byte) 0x86, (byte) 0x00,
 (byte) 0x00, (byte) 0x05, (byte) 0x00,(byte) 0x00, (byte) 0x04, 
                                    (byte) 0x60,(byte) 0x00 };

当身份验证成功时,您将获得90 00.这就是成功消息。否则响应是63 00,这意味着身份验证失败。
当身份验证完成时,你可以读取块(0,1,2,3),因为扇区0包含4个块,那些是块(0,1,2,3)。

When Authentication is succes then you will get 90 00. That is Success message. Else response is 63 00 , that means authentication failed. When Authentication complete then you can read block (0,1,2,3) cause sector 0 contains 4 block and those are block (0,1,2,3).

使用此命令您可以从Sector 0 block 1读取数据

Using this command You can read data from Sector 0 block 1

byte[] readFromPage = new byte[10];
readFromPage = new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,
 (byte) 0x00, (byte) 0x05, (byte) 0xD4, (byte) 0x40,
 (byte) 0x00, (byte) 0x30, (byte) 0x01 };

这里最后一个(字节)0x01是你想要读取的块。
在这个答案中,您可以找到完整的代码。只需用这个替换字节值。
谢谢。

Here last (byte) 0x01 is block where you want to read. in this answer you can find the complete code. Just replace the byte value using this. Thanks.

这篇关于使用javax.smartcardio从mifare classic中读取块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆