首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >米法雷氏菌( EV1 GetCardUid )

米法雷氏菌( EV1 GetCardUid )
EN

Stack Overflow用户
提问于 2013-02-21 11:57:12
回答 3查看 8K关注 0票数 0

下面的代码可以工作,并允许我获得Mifare 1k卡的UID。不幸的是,它不适用于Desfire卡。

代码语言:javascript
复制
    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;
    }

我看了下面的资源

  • http://ridrix.wordpress.com/2009/09/19/mifare-desfire-communication-example/
  • desfire.c?r=532

..。试着这样做:

代码语言:javascript
复制
        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一起工作。如果有帮助的话,我可以贴出代码。

谢谢你的指点!

编辑

谢谢你的第一个回答!我按照建议改变了计划:

代码语言:javascript
复制
        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=缓冲区太小:-)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-21 21:51:39

尝试您提供的第一个链接的“本机包装”版本。您的界面需要ISO 7816-4风格的APDU(因为它返回一个ISO 7816-4状态字,表示长度错误)。

票数 1
EN

Stack Overflow用户

发布于 2013-02-22 08:47:55

这段代码似乎有效:

代码语言:javascript
复制
        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;

有什么评论吗?

票数 3
EN

Stack Overflow用户

发布于 2013-08-17 18:05:41

Cla=ff命令是pcsc第3部分命令。Ins=ca应该与符合PCSC2.0x标准的cl读取器一起工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15001673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档