gpt4 book ai didi

hid - 通过 HID OMNIKEY 5427 CK 向卡发送 APDU 命令

转载 作者:行者123 更新时间:2023-12-04 15:40:10 27 4
gpt4 key购买 nike

我试图通过 HID OMNIKEY 5427 CK 通过 APDUs 命令来操作 MIFARE 卡,即。 Ultralight C 卡,在 Windows 10 x64 操作系统环境中使用 WinSCard.dll。 (我在 NXP NDA 下,可以完全访问他们的文件)

我试图在网上查找信息好几天了。除了 2 页小册子外,似乎没有针对此模型的已发布文档。

像 GetUID (FFCA000000) 这样的简单命令就可以了,我可以取回实际的卡 UID。

但是对于“使用卡进行身份验证”,来自 HID 5421 模型的引用文件说我应该从 OpenGenericSession (FFA0000703010001) 开始,我尝试过,但读者总是回复 6D00h(错误)

我尝试直接发送 Authentication 命令'1Ah+00h' (FFA00005080100F30000641A0000) 阅读器也总是回复错误代码。

我使用过 HID 5421 型号,而且非常简单,不知道为什么这个 5427 与其兄弟型号不同。

是的,我联系了 HID 支持。没运气。我无法从他们那里获得有用的信息。

如果有人有想法或有5427软件开发指南,请帮忙。我现在拉头发快一个星期了。

最佳答案

下面是使用 Omnikey 5321/6321 通过通用 session 与 Ultralight-C 通信的概念验证 java 代码:

private static final byte AF = (byte)0xAF;

protected static final byte[] PREFIX = new byte[] { 0x01, 0x00, (byte) 0xF3, 0x00, 0x00, 0x64 };

protected final CardChannel channel;

protected void openGenericSession() throws CardException {
System.out.println("OPEN GENERIC SESSION");
transmitAssert9000(new CommandAPDU(0xFF, 0xA0, 0x00, 0x07, new byte[] { 0x01, 0x00, 0x01}));
}

protected byte[] transmitRaw(byte[] data) throws CardException {
System.out.println(" => " + toHex(data));
byte[] ret = transmitAssert9000(new CommandAPDU(0xFF, 0xA0, 0x00, 0x05, ArrayUtils.addAll(PREFIX, data), 256));
if(ret.length<2) {
throw new RuntimeException();
}
if((ret[0]==0x00)&&(ret[1]==0x00)) {
// Success
ret = Arrays.copyOfRange(ret, 2, ret.length);
System.out.println(" <= " + toHex(ret));
return ret;
}
if((ret[0]==0x08)&&(ret[1]==0x04)&&(ret.length==3)) {
// ACK/NAK
switch(ret[2]) {
case 0x0A:
System.out.println(" <= ACK");
return ArrayUtils.EMPTY_BYTE_ARRAY;
default:
// Buyer beware: very simplified
System.out.println(" <= NAK");
throw new RuntimeException("NAK");
}
}
ret = Arrays.copyOfRange(ret, 2, ret.length);
System.out.println(" <= " + toHex(ret));
return ret;
}

protected static byte[] assert9000(ResponseAPDU transmit) {
if(transmit.getSW()!=0x9000) {
throw new RuntimeException("Unexpected response code");
}
return transmit.getData();
}

protected byte[] transmitAssert9000(CommandAPDU commandAPDU) throws CardException {
return assert9000(transmit(commandAPDU));
}

protected ResponseAPDU transmit(CommandAPDU commandAPDU) throws CardException {
System.out.println(" -> " + toHex(commandAPDU.getBytes()));
ResponseAPDU responseAPDU = channel.transmit(commandAPDU);
System.out.println(" <- " + toHex(responseAPDU.getBytes()));
return responseAPDU;
}

public byte[] read(int offset) throws CardException {
System.out.println("READ");
return transmitRaw(new byte[] {0x30, (byte)offset});
}

注 1:此代码使用 javax.smartcardioApache Commons Lang .

注 2:我写这段代码已经有一段时间了,请验证我的想法......

注 3:有关 Ultralight-C 身份验证代码,请参阅此 companion answer .

带有 Ultralight-C 的 Omnikey 6321 的通用 session 示例跟踪(单线箭头表示通用 session APDU,双线箭头表示 Ultralight-C 命令):
OPEN GENERIC SESSION
-> FFA0000703010001
<- 9000
AUTHENTICATE
=> 1A00
-> FFA00005080100F30000641A0000
<- 0000AF4BDA4E34B5D04A019000
<= AF4BDA4E34B5D04A01
=> AF6F18402E0F0E5357D854833B149FBB56
-> FFA00005170100F3000064AF6F18402E0F0E5357D854833B149FBB5600
<- 000000F0F667CCF0E140419000
<= 00F0F667CCF0E14041
READ
=> 3003
-> FFA00005080100F3000064300300
<- 0000000000000000000000000000000000009000
<= 00000000000000000000000000000000
CLOSE GENERIC SESSION
-> FFA0000703010002
<- 9000

一些补充说明:
  • (AFAIK)这种方法适用于 Windows(使用 Omnikey 驱动程序)。它在 linux 下不起作用(即使使用 Omnikey 驱动程序)。
  • 请注意 PC/SC version 2.02 Part 3定义 MANAGE SESSION , TRANSAPARENT EXCHANGESWITCH PROTOCOL以标准化方式提供相同功能的命令(您的读者可能支持它而不是专有的通用 session 机制——HID 甚至参与了本文档)。

  • 祝你好运!

    关于hid - 通过 HID OMNIKEY 5427 CK 向卡发送 APDU 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44622497/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com