我有一个JCOP V2.4.2 R3 java卡,它的数据表中提到"卡支持T=1和T=0通信协议"
我还有一个ACR38智能卡读卡器,它支持T = 0和T = 1协议.(我成功地与一张卡进行了T = 0通信,并且成功地与该卡进行了T = 1通信.)
我编写了以下程序并将其上传到卡上以发送和接收扩展的APDU:
package extAPDU;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacardx.apdu.ExtendedLength;
public class ExAPDU extends Applet implements ExtendedLength {
private ExAPDU() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new ExAPDU().register();
}
public void process(APDU arg0) throws ISOException {
short number = arg0.setIncomingAndReceive();
arg0.setOutgoingAndSend((short)0, (short)(number+7));
}
}
Run Code Online (Sandbox Code Playgroud)
在CAD方面,我使用python脚本向卡发送不同的APDU.问题是:
1-为什么我无法启动与T = 0协议的通信(虽然提到该卡支持此协议):
python脚本:
from smartcard.scard import *
import …Run Code Online (Sandbox Code Playgroud) 我最近一直在重写ISO 14443-3防冲突循环,并发现它实际上没有在标准中正确定义.
示例:该字段中的两张卡将进入防冲突循环:
card uid = AB CD EF GH IJ KL xx xx xx(10字节/ tripple size UID)
card uid = AB CD EF 88 GH IJ KL(7字节/双倍大小的UID)
他们都将进入防撞级联2级,其中:
将传输:UID CL2 = 88 GH IJ KL- 88表示其UID较长的级联标记
将传输:UID CL2 = 88 GH IJ KL- 作为其实际UID
=>没有彻底解决.
PCB将发送SELECT,两个卡都将响应SAK,其中bit2会发生冲突.
ISO/IEC 14443-3标准没有说任何关于0x88禁止uid [3]的内容,只禁止使用uid [0] 0x88.
我是对的还是我错过了什么?我知道两张这样的牌同时出现在场上的概率非常低(1:2 ^ 56).但是,这是不正确的(我工作的公司的总经理一定会来看看我们在钱包里用两张这样的牌做什么).
我想制作一款可以访问USB智能卡读卡器(HID Global OmniKey 3121)的Chrome应用程序.
有人曾经成功做过吗?
不幸的是,我看不到它的使用usb.getDevices.
script.js(由index.html调用,后者本身由background.js 调用onLaunched):
//dom elements
var findBtn = document.querySelector( "button#find-btn" )
var deviceInfo = document.querySelector( "p#device-info" )
//{click}
findBtn.addEventListener( "click", findDevice )
/*
* Try to find HID OmniKey 3x21
*/
function findDevice ()
{
var options = {
filters: [
{
vendorId: 1899, //OmniKey AG
productId: 12321 //CardMan 3121 but PID=0x3021
}
]
}
chrome.usb.getDevices( options, function ( devices )
{
console.log( devices )
deviceInfo.innerHTML = …Run Code Online (Sandbox Code Playgroud) 我正在尝试更改ACR1252U上的蜂鸣器持续时间.
链接至API:http: //www.acs.com.hk/download-manual/6402/API-ACR1252U-1.09.pdf
根据API文档,我需要'E0000028010A'命令来更改蜂鸣器状态,其中'0A'将持续时间标记为0A*10ms(页44).
使用以下Java代码:
public static void main(String[] args) {
try {
byte[] send = new byte[6];
send[0] = (byte) 0xE0; // Commandclass
send[1] = (byte) 0x00; // Protocoll
send[2] = (byte) 0x00; // Param 1
send[3] = (byte) 0x28; // Param 2: Buzzerstatus
send[4] = (byte) 0x01; // Change Flag
send[5] = (byte) 0x0A; // Duration: 0A*10ms => 100ms
Card card = getCard("DIRECT"); // Works!
CardChannel channel = card.getBasicChannel(); // Works!
CommandAPDU command = new CommandAPDU(send); …Run Code Online (Sandbox Code Playgroud) 我正在使用Microsoft SmartCard API开发SCM非接触式RFID读卡器。
据我所知,惯用智能卡的通常过程是:
1.使用SCardEstablishContext()建立上下文
2. 使用SCardListReaders()列出连接到系统的所有读取器
3.选择一个读取器并等待卡插入其中。
4.一旦检测到卡,函数SCardGetStatusChange()将返回。
5.使用SCardConnect()通过选定的读取器连接至卡。6
.使用SCardTransmit()与卡进行通话
直到5的所有步骤都可以正常工作,这意味着我拥有正确的卡手柄。可以通过发出返回协商协议的SCardStatus()函数和卡的ATR来进一步验证卡。但是,当我尝试使用SCardTransmit()发送任何APDU命令时,它将返回错误(错误代码14,我猜是SCARD_E_CANT_DISPOSE)。
我不知道出什么问题或缺少什么。我通过发出{0xFF,0xCA,0x00、0x00、0x00}尝试了不同的APDU,例如非常基本的APDU来读取卡UID。我使用SCM TestResMan调试工具验证了此APDU,它向我返回了卡的正确UID。我正在使用MiFARE 1k卡和SCM非接触式SCL011读卡器。
请在下面找到SCardTransmit()代码片段(所有先前的函数返回成功)。
SCARD_IO_REQUEST sioreq;
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
sioreq.cbPciLength = 8;
SCARD_IO_REQUEST rioreq;
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
rioreq.cbPciLength = 8;
byte sendbuffer[256], receivebuffer[256];
ULONG sendbufferLen, receivebufferLen, sizeofUID;
sendbuffer[0] = 0xFF; // CLA - Instruction Class
sendbuffer[1] = 0xCA; // Instruction code
sendbuffer[2] = 0x00; // P1 - 1st parameter
sendbuffer[3] = 0x00; // P2 - 2nd parameter
sendbuffer[4] = 0x00;
sendbufferLen = …Run Code Online (Sandbox Code Playgroud) 我使用WinSCard列出所有读者,这给我一个这样的列表:
ASK RDR4x7 0
SCM Microsystems Inc. SCR3320 USB Smart Card Reader 0
SCM Microsystems Inc. SCR3320 USB Smart Card Reader 1
SCM Microsystems Inc. SCR3320 USB Smart Card Reader 2
Run Code Online (Sandbox Code Playgroud)
哪个好,但我不知道哪个名字属于哪个读卡器.
这些名字来自哪里?他们是如何建造的?
我到目前为止所发现的:在注册表中,有一个HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services密钥.在此密钥下,您可以找到与读卡器的"服务"(我通过查询WMI注册表找到)匹配的子项.例如:为SCM Microsystems Inc. SCR3320 USB Smart Card Reader读者提供的服务SCR3XX2K.
这个子键(SCR3XX2K)有另一个子键Enum,它有多个有趣的值:
Count:DWORD,连接的读者数量0,1,2:STRING,硬件设备ID我猜这些是附加到'友好名称'的数字,但我无法弄清楚如何构造名称字符串.我需要这个将硬件设备ID(我通过WMI)映射到他们的友好名称.
那么,用于为智能卡读卡器创建"友好名称"的模式是什么?这些值来自何处?
我有智能卡和读卡器(金雅拓).我想用C#读取卡的序列号.我在金雅拓支持网站上阅读了文档/图书馆,但没有任何信息对我有用.
我希望有人对金雅拓有所帮助我帮助我一些例子!
非常感谢 !
有人可以解释两者之间的差异/关系吗?
现在我使用GPShell + globalplatform + pcsclite也操纵了支持NFC的卡.从我的角度来看(我对libnfc了解不多)pcsclite和libnfc做同样的事情.
我在 APDU 上的终端和芯片之间有一次通信,我需要对该通信进行解码。
是这样的:
Terminal: 00 B6 02 00 06 00
Chip: 49 55 7B 2C 1F 30 57 35 63 7D 24 7B 60 21
Terminal:00 B5 03 0B 04 02 00
Chip:45 43 3C 3B 4A 31 51 35 53 4B 34 2C 30 21
Run Code Online (Sandbox Code Playgroud)
据我所知,终端正在向智能卡芯片发送命令,智能卡芯片正在做出响应。所以,我需要知道他们的沟通内容是什么。这与EMV标准和APDU有关。
我怎样才能解码它?有哪些步骤和规则?
我有一个终端,它有自己的API来固定和发送芯片和终端之间的命令,有一个功能,它发送APDU命令并以字节数组返回答案.
例如,如果想要读取标签5A(应用程序PAN),我发送以下命令:
byte[] byteArrayAPDU = new byte[]{(byte)0x00, (byte)0xCA, (byte)0x00, (byte)0x5A};
int nResult = SmartCardInterface.transmit(nCardHandle, byteArrayAPDU, byteArrayResponse);
Run Code Online (Sandbox Code Playgroud)
该变量byteArrayResponse获得对APDU命令的响应.
当我将值转换byteArrayAPDU为十六进制数字字符串时,这给了我:00 CA 00 5A.并且对该命令的响应是6E 00(类不受支持).
我的设备使用ISO 7816作为技术规格.我发送APDU命令的方式是否正确?我问这个是因为我已经读过APDU命令至少必须有5个值,但我不知道在第五个参数中要发送什么.我不知道答案的长度是什么.
您能举例说明如何在APDU命令中获取标签5A或其他内容吗?
如果命令正确,取代我6E 00此刻看到的位置,我会在投射到字符串时将信息看作纯文本吗?