使用Omnikey 5022读取PACS(原始Wiegand)数据

时间:2019-07-01 10:32:37

标签: java .net smartcard contactless-smartcard omnikey

我正在开发连接到HID Omnikey 5022读卡器的Java应用程序。我需要读取PACS位(原始Wiegand数据)。

这个问题我有完全相同的问题,我也可以通过PACS Probe应用程序查看数据:

How to read Smart Card data

很遗憾,提供的答案对我不起作用。

这是我从PACS Probe得到的:

  • 读卡器:HID Global OMNIKEY 5022智能卡读卡器0
  • 卡类型:PicoPass 32KS(8x2 + 16)
  • 卡序列号(CSN,UID):32966202F8FF12E0(十六进制)
  • PACS位(原始韦根)数据:000000310BC53938(十六进制)

我已经尝试过在Omnikey 5023指南中找到的命令,令人惊讶的是它返回了一些数据,但这不是我所需要的。

该命令是:

commandAPDU = new CommandAPDU(new byte[] { (byte) 0xFF, (byte) 0x70, (byte) 0x07, (byte) 0x6B, (byte) 0x07,
                (byte) 0xA0, (byte) 0x05, (byte) 0xBE, (byte) 0x03, (byte) 0x80, (byte) 0x01, (byte) 0x04, (byte) 0x00 }); // Read PACS 5023

它返回以下内容:

  

9E020003   
//我需要000000310BC53938

由于我是智能卡开发的新手,因此我们将为您提供任何帮助。 预先感谢。

2 个答案:

答案 0 :(得分:0)

您从阅读器获得的响应APDU是不支持的专有命令的错误代码。

您将需要安全的会话才能使用OMNIKEY 5022或OMNIKEY 5023阅读器访问PACS位数据。

除非您拥有该读卡器的相应文档,否则我可能会坚持使用卡序列号(UID,CSN),并使用PC / SC(或pcsclite)的Java包装程序来连接读卡器和卡。

然后通过SCardTransmit(FFCA0000 APDU)发出,以获取https://PACSprobe.com的示例输出中显示的UID(32966202F8FF12E0)

对于Java:使用smartcardio lib。这对于本机PC / SC来说是一个很好的包装器

将安全通道协议移植到Java上需要进行大量工作。调用第三方库可能更容易。

答案 1 :(得分:0)

我能够使用javax.smartcardio,并使用如下代码获取Wiegand数据。最后,您会看到已打印设施代码和卡号。

TerminalFactory terminalFactory = TerminalFactory.getDefault();

CardTerminals cardTerminals = terminalFactory.terminals();

List<CardTerminal> terminalList = cardTerminals.list();

CardTerminal cardTerminal = terminalList.get(0);
cardTerminal.waitForCardPresent(10 * 1000); // wait 10 seconds
Card card = cardTerminal.connect("*");
System.out.println("Card: " + card);
CardChannel channel = card.getBasicChannel();

byte[] aid = { (byte) 0xA0, (byte) 0x05, (byte) 0xA1, (byte) 0x03, (byte) 0x80, (byte) 0x01, (byte) 0x04 };
CommandAPDU apdu = new CommandAPDU(0xFF, (byte) 112, (byte) 7, (byte) 107, aid, 256);
ResponseAPDU r = channel.transmit(apdu);
byte[] bytesOut = r.getBytes();

int num1 = (int) bytesOut[3];
if (bytesOut.length - 6 != num1)
System.out.println("problem");

int numberOfBitsShifted = (int) bytesOut[4];
int num2 = num1 - 1;

byte[] newBytesArr = Arrays.copyOfRange(bytesOut, 5, 5 + num2);
if (newBytesArr.length != num2)
    System.out.println("problem");

ByteBuffer wrapped = ByteBuffer.wrap(newBytesArr);
int num = wrapped.getInt();
int first26 = num >> 6;
int withoutParity = first26 >> 1;

int cardNumber = withoutParity & 0xffff;
int facilityCode = (withoutParity >> 16) & 0xff;

System.out.println(facilityCode);
System.out.println(cardNumber);