当前位置: 首页 > 知识库问答 >
问题:

了解主机卡仿真和APDU背后的代码

杜河
2023-03-14

我刚刚开始制作一个使用主机卡模拟(HCE)的应用程序,我做了各种各样的工作。我需要该应用程序使手机的行为像一张卡,而另一部手机的行为像一个NFC阅读器,并扫描它,反之亦然,以便交换一个非常小的信息-身份证号码。

我已经完成了一些功能单元,如ProcessDirecdApdu和定义AID,但我并不真正理解它是如何工作的。

这是我目前的代码。。。

@TargetApi(19)公共类主要活动扩展HostApduService{

@Override
public void onDeactivated(int reason) {

}

@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
    String inboundApduDescription;
    byte[] responseApdu;

    if (Arrays.equals(AID_SELECT_APDU, commandApdu)) {
        inboundApduDescription = "Application selected";
        Log.i("HCEDEMO", inboundApduDescription);
        byte[] answer = new byte[2];
        answer[0] = (byte) 0x90;
        answer[1] = (byte) 0x00;
        responseApdu = answer;
        return responseApdu;

    }
    return commandApdu;
}

private static final byte[] AID_SELECT_APDU = {
        (byte) 0x00,
        (byte) 0xA4,
        (byte) 0x04,
        (byte) 0x00,
        (byte) 0x07,
        (byte) 0xF0, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00,
        (byte) 0x00
};

public static void main(String[] args) throws UnsupportedEncodingException {
    TerminalFactory terminalFactory = TerminalFactory.getDefault();
    try {
        for (CardTerminal terminal : terminalFactory.terminals().list()) {
            System.out.println(terminal.getName());
            try {
                Card card = terminal.connect("*");
                CardChannel channel = card.getBasicChannel();
                System.out.println("SelectAID ");
                CommandAPDU command = new CommandAPDU(SelectAID);
                ResponseAPDU response = channel.transmit(command);
                byte recv[] = response.getBytes();
                for (int i = 0; i < recv.length; i++) {
                    System.out.print(String.format("%02X", recv[i]));
                }
                System.out.println("");
            }
            catch (CardException e){}


        }
    }
    catch(CardException e){

    }
}

}

public class ReaderActivity {
public static byte[] SelectAID = new byte[]{(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00,
        (byte) 0x07,
        (byte) 0xF0, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00, (byte)
        0x00
};

}

这些字节代表什么,例如0x00,0xA4,以及如何通过APDU传达我自己的信息(身份证号码)?

我还要补充什么?

我的代码基于以下教程https://www.slideshare.net/ChienMingChou/hce-tutorialv-v1

共有1个答案

仉臻
2023-03-14

APDU是在ISO 7816标准的第4部分中指定的——在那里你会发现每个字节代表什么(类字节、操作代码、参数字节等)。例如,0xA4意味着SELECT命令

我的建议是去GlobalPlatform网站下载卡片规格——你必须注册,但它是免费的。该卡规范的第11章包含了大量关于APDU编码、最有趣的APDU命令和管理卡的响应等信息。这些信息将帮助您入门,并让您了解可以为应用程序设计哪些APDU命令。

 类似资料:
  • 我一直在查看全球平台规范,了解如何为我的应用程序定义APDU,该应用程序将使用主机卡模拟(HCE)。我的应用程序应该有一部手机通过HCE像NFC标签一样工作,另一部手机充当NFC阅读器。我试图在手机之间传输的任意数据只是一个包含ID号的简单字符串,但我不确定如何在代码中应用它。我已经了解了不同字节命令的含义,但我真的不知道如何应用它。 我想我需要使用STORE DATA命令,但我不知道如何直观地执

  • 通过阅读《HCE开发者指南》,这里的《HCE开发者指南》似乎可以将android手机用作阅读器。我把卡片信息放在NFC标签上,然后用手机读。我想让手机充当阅读器。你知道这是否可行吗?我创建了一个示例项目,其中包含以下代码行: 我不知道下一步该去哪里。

  • translated_page: https://github.com/PX4/Devguide/blob/master/en/simulation/sitl.md translated_sha: b522243efef9deb5e2d3ae7bd03ae9ed0eee3418 Multi-Vehicle Simulation This tutorial explains how to simul

  • HCE是在Android 4.4中实现的,但是关于如何在模拟卡中写入的信息很少。 我有心肺复苏40.30阅读器 这个读者带来了一些样本NFC卡。我使用NFC读卡应用程序读取这些卡。 与CPR 40.30兼容的NFC卡详细信息 IC制造商:恩智浦半导体 我想写HCE代码,希望我的Android手机像一张卡片一样,可以被CPR 40.30阅读器读取。我假设HCE代码应该模拟具有上述规格的卡,因为读卡器

  • 我正在尝试使用ACR1281U NFC标签阅读器在Android设备上进行主机卡仿真。 这就是我想申请的类型。 根据Android文档和示例,需要在Android项目中注册一个AID: 我如何知道我需要在我的Android应用程序中注册哪些AID,以便读者可以阅读HCE Android应用程序? 这里是我发布的另一个关于同样问题的问题:没有找到支持的卡终端ARC1281U nfc读卡器 我参考了以

  • 我开发了一个系统,可以使用带有PN532芯片的阅读器读取NFC标签。它工作正常。我可以阅读米费尔经典和米费尔超轻标签。 现在我想使用带有Android 4.4.2的Nexus平板电脑来模拟标签。我没有Android开发经验,但我认为这是可能的。 我已经在Nexus平板电脑中设置了NFC通信,但我想我必须下载或编写一些应用程序来模拟Tag和NDEF通信。 最简单的方法是什么?