下面的代码可以工作,并允许我获得Mifare 1k卡的UID。不幸的是,它不适用于Desfire卡。
public byte[] GetUid()
{
byte[] uid = new byte[6];
int rc = Communicate(new byte[]{0xff, 0xca, 0x00, 0x00, 0x04}, ref uid);
if (rc != 0)
throw new Exception("failure: " + rc);
int rc1, rc2;
if (uid.Length == 2)
{
rc1 = uid[0];
rc2 = uid[1];
}
else
{
rc1 = uid[4];
rc2 = uid[5];
}
if (rc1 != 0x90 || rc2 != 0x00)
throw new Exception("failure: " + rc1 + "/" + rc2);
byte[] result = new byte[4];
Array.Copy(uid, result, 4);
return result;
}我看了下面的资源
..。试着这样做:
byte[] outb = new byte[15];
int rc9 = Communicate(new byte[] { 0x60 }, ref outb);outb始终包含{ 0x67,0x00 },而不像预期的那样,{ af 04 01 01 00 02 18 05 }。
连接是成功的,SCardGetAttrib允许我获取ATR。该通信方法与SCardTransmit一起工作。如果有帮助的话,我可以贴出代码。
谢谢你的指点!
编辑
谢谢你的第一个回答!我按照建议改变了计划:
byte[] outb = new byte[9];
int rc5 = Communicate(new byte[]{0x90, 0x60, 0x00, 0x00, 0x00, 0x00}, ref outb);现在outb是{ 0x91,0x7E }。这似乎更好,0x91看起来像一个ISO 7816响应代码,但不幸的是,不是0x90,如预期。(我还查看了第二个链接中的DESFIRE_TRANSCEIVE宏,如果接收到0xf2,该宏将继续读取。)我尝试谷歌搜索ISO 7816 APDU响应代码,但在解码错误代码方面没有成功。
编辑2
我还发现以下评论:
使用万能5321,我从apdu FFCA000000获得了FFCA000000 ATR 3B8180018080 UID 04 52 2E AA 47 23 80 90 00,所有其他apdu都给出了917 E未知错误。
这解释了我的错误代码,并给出了另一个提示,FFCA000000看起来与我的其他Mifare 1k字符串非常相似。因此,对于FFCA000000,我得到了一个9字节的响应,它似乎包含了UID。有趣的是,FFCA000000代码也适用于1k卡,所以也许我的解决方案就是更改最后的04到00并处理不同长度的响应。对吗?
编辑3
看来硬币掉了..。0x04 =4字节响应=7字节UID =响应917 E=缓冲区太小:-)
发布于 2013-02-21 21:51:39
尝试您提供的第一个链接的“本机包装”版本。您的界面需要ISO 7816-4风格的APDU(因为它返回一个ISO 7816-4状态字,表示长度错误)。
发布于 2013-02-22 08:47:55
这段代码似乎有效:
int rc = Communicate(new byte[] { 0xff, 0xca, 0x00, 0x00, 0x00 }, ref uid);
if (rc != 0)
throw new Exception("failure: " + rc);
int rc1 = uid[uid.Length-2], rc2 = uid[uid.Length-1];
if (rc1 != 0x90 || rc2 != 0x00)
throw new Exception("failure: " + rc1 + "/" + rc2);
byte[] result = new byte[uid.Length - 2];
Array.Copy(uid, result, uid.Length - 2);
return result;有什么评论吗?
发布于 2013-08-17 18:05:41
Cla=ff命令是pcsc第3部分命令。Ins=ca应该与符合PCSC2.0x标准的cl读取器一起工作。
https://stackoverflow.com/questions/15001673
复制相似问题