智能卡读卡器,无法读取某些卡

Posted

技术标签:

【中文标题】智能卡读卡器,无法读取某些卡【英文标题】:Smart Card Reader, can't read some cards 【发布时间】:2015-05-21 14:55:43 【问题描述】:

我有一个应用程序使用智能卡读卡器允许用户访问系统的某些部分。在一个位置我没有问题。但是另一个,拥有不同类型的卡制造商有很多问题。它不断得到一个零的ID。然后查看事件日志,我看到了这个: 这是代码:

 card.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1);

 var apduGetID = new APDUCommand(0xFF, 0xCA, 0, 0, null, 4);
 var apduRespGetID = card.Transmit(apduGetID);
long cardId = BitConverter.ToUInt32(apduRespGetID.Data.Reverse().ToArray(), 0);

第二个问题是,然后尝试调试代码,它运行良好,只有删除断点才能看到问题,但看不到问题在哪里。有人可以帮我吗?

附:我找到了这个帖子,但它不起作用:https://superuser.com/questions/715688/smart-card-errors

更新:这是 Transmit 类

 public override APDUResponse Transmit(APDUCommand ApduCmd)
        
            var RecvLength = (uint)(ApduCmd.Le + APDUResponse.SW_LENGTH);
            byte[] ApduBuffer;
            var ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH];
            var ioRequest = new SCard_IO_Request
            
                m_dwProtocol = m_nProtocol,
                m_cbPciLength = 8
            ;

            // Build the command APDU
            if (ApduCmd.Data == null)
            
                ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)];

                if (ApduCmd.Le != 0)
                
                    ApduBuffer[4] = ApduCmd.Le;
                
            
            else
            
                ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length];

                for (var nI = 0; nI < ApduCmd.Data.Length; nI++)
                
                    ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI];
                

                ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte)ApduCmd.Data.Length;
            

            ApduBuffer[0] = ApduCmd.Class;
            ApduBuffer[1] = ApduCmd.Ins;
            ApduBuffer[2] = ApduCmd.P1;
            ApduBuffer[3] = ApduCmd.P2;

            m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength);

            if (m_nLastError != 0)
            
                var msg = "SCardTransmit error: " + m_nLastError;
                throw new SmartCardException(msg, m_nLastError);
            

            var apduData = new byte[RecvLength];

            for (var nI = 0; nI < RecvLength; nI++)
            
                apduData[nI] = ApduResponse[nI];
            

            return new APDUResponse(apduData);
        

更新 2:我也尝试过放一些 Thread.Sleep()

【问题讨论】:

card.Transmit 是做什么的?也就是说,读卡器或卡的实际响应是什么?您使用的是哪种卡? 你能在你的命令之间放一些延迟,然后再试一次吗?读卡器或卡可能没有你的程序运行时间那么快? 您自己编写了安装在智能卡上的程序吗?您可以将00A404000004 发送到这两种卡片并将卡片的响应添加到问题中吗? (使用此工具向卡发送 APDU 命令:github.com/OpenSC/OpenSC/wiki) 暂时关闭所有防火墙和杀毒应用程序,然后再次检查问题。 您使用的是什么版本的 Windows? 【参考方案1】:

请检查您是否在第二台机器上安装了智能卡的所有最新驱动程序。此外,有时将制造商提供的驱动程序替换为“Microsoft WUDF 驱动程序”会有所帮助 - https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85).aspx

请注意,当您插入时,操作系统会检测到两种类型的设备 - 智能卡枚举器设备(智能卡读卡器)和智能卡(有时称为智能卡容器)本身。一个智能卡读卡器可以包含多张智能卡。

智能卡驱动被强制替换为 Microsoft WUDF 以使客户端应用程序 (iBank2) 工作的示例:

四个智能卡驱动程序已被强制替换为基本的 Microsoft 驱动程序,以使应用程序正常工作。

【讨论】:

【参考方案2】:

如果其他系统不使用您的智能卡,只需检查智能卡的Bios 设置即可。在某些系统中可以选择禁用/启用它们。

【讨论】:

以上是关于智能卡读卡器,无法读取某些卡的主要内容,如果未能解决你的问题,请参考以下文章

使用 ACR38 读卡器从 SLE 4442 智能卡读取数据

如何读取金雅拓智能卡的序列号?

Girocard-Maestro 智能卡读卡器问题,读取持卡人姓名和 IBAN

Mifare卡安全

在 Java 中读取智能卡并捕获数据

如何通过读卡器使用Java激活/开启ICC卡?