Mifare Desfire / Mifare plus 无法使用 ACS ACR1252 读取

如何解决Mifare Desfire / Mifare plus 无法使用 ACS ACR1252 读取

嗨,我是 RFID 阅读的新手。所以首先我从 github 下载了 pcsc 锐利的存储库。然后我尝试从常见的 rfid 标签读取二进制文件,它工作得很好,但下一步是从我认为模拟的 rfid 标签中读取数据。 RFID 标签控制器为 pn71501。从这个使用 pcsc 锐利的标签中,我无法读取除 ATR 和 uid 之外的任何数据。我试图用我的 iPhone 读取这个标签,它读取了它。那么我做错了什么?

我也尝试使用已经完成的软件,但它也无法读取。

这是我使用 NFC 工具得到的结果:

enter image description here

enter image description here

我使用的 PS 智能卡读卡器是 ACS acr1252

这是我的代码

using System;
using System.Text;
using System.Collections.Generic;
using PCSC;
using PCSC.Iso7816;

namespace Transmit {
    public class Program {
        public static void Main() {
            using (var context = ContextFactory.Instance.Establish(SCardScope.System)) {
                var readerNames = context.GetReaders();
                if (noreaderFound(readerNames)) {
                    Console.WriteLine("You need at least one reader in order to run this example.");
                    Console.ReadKey();
                    return;
                }

                var readerName = ChooseRfidReader(readerNames);
                if (readerName == null) {
                    return;
                }

                String response = "";

                using (var rfidReader = context.ConnectReader(readerName,SCardShareMode.Shared,SCardProtocol.Any)) {
                  // for (byte i = 0x00; i < 0x47; i++) {
                        var apdu = new CommandApdu(IsoCase.Case3Extended,rfidReader.Protocol) {
                            CLA = 0xFF,Instruction = (InstructionCode)0xB0,P1 = 0x00,P2 = 0x00,Le = 0x10
                        };

                        using (rfidReader.Transaction(Scardreaderdisposition.Leave)) {
                            //Console.WriteLine("Retrieving the UID .... ");

                            var sendPci = SCardPCI.GetPci(rfidReader.Protocol);
                            var receivePci = new SCardPCI(); // IO returned protocol control information.

                            var receiveBuffer = new byte[256];
                            var command = apdu.ToArray();


                            var bytesReceived = rfidReader.Transmit(
                                sendPci,// Protocol Control information (T0,T1 or Raw)
                                command,// command APDU
                                command.Length,receivePci,// returning Protocol Control information
                                receiveBuffer,receiveBuffer.Length); // data buffer

                            var responseApdu =
                                new ResponseApdu(receiveBuffer,bytesReceived,IsoCase.Case3Extended,rfidReader.Protocol);

                        Console.WriteLine(String.Format("SW1: {0:X2} SW2: {1:X2}",responseApdu.SW1,responseApdu.SW2));
                        //if(responseApdu.DataSize > 0) {
                        //response += BitConverter.ToString(responseApdu.GetData()).Replace('-',' ');
                          response += responseApdu.DataSize;
                           // }
                        }
                   // }
                }
                /*String[] devidedResponse = response.Split(' ');

                String stillResponse = "";

                bool notStarted = true;

                int skipBytes = 7;
                int onByte = 0;

                for(int i = 0; i < devidedResponse.Length; i++) {
                    if (devidedResponse[i] != "D1" && notStarted) {
                        continue;
                    } else if (onByte < skipBytes) {
                        notStarted = false;
                        onByte += 1;
                        continue;
                    } else if (devidedResponse[i] == "FE") {
                        break;
                    }

                    stillResponse += devidedResponse[i] + " ";
                }

                String res = stillResponse.Trim();

                string asciiCharString = "";

                var splitResult = res.Split(' ');

                foreach (string hexChar in splitResult) {
                    var byteChar = int.Parse(hexChar,System.Globalization.NumberStyles.Hexnumber);
                    asciiCharString += (char)byteChar;
                }*/
                
                Console.WriteLine(response);
            }

            Console.WriteLine("\nPress any key to exit.");
            Console.ReadKey();
        }

        private static string ChooseRfidReader(IList<string> readerNames) {
            // Show available readers.
            Console.WriteLine("Available readers: ");
            for (var i = 0; i < readerNames.Count; i++) {
                Console.WriteLine($"[{i}] {readerNames[i]}");
            }

            // Ask the user which one to choose.
            Console.Write("Which reader is an RFID reader? ");
            var line = Console.ReadLine();

            if (int.TryParse(line,out var choice) && choice >= 0 && (choice <= readerNames.Count)) {
                return readerNames[choice];
            }

            Console.WriteLine("An invalid number has been entered.");
            Console.ReadKey();
            return null;
        }

        private static bool noreaderFound(ICollection<string> readerNames) =>
            readerNames == null || readerNames.Count < 1;
    }
}

解决方法

我知道。我之前查过。你能用文件浏览器读取卡片吗?

可以在三个不同级别读取像 UART 这样的硬件设备

  1. 通过查找硬件 I/O 地址直接读/写 UART
  2. 通过驱动程序读/写。在 c# 中使用打开串行端口。驱动程序获取硬件 I/O
  3. 通过应用程序读取/写入。应用程序执行上述 1 和/或 2。

您有一个可用的应用程序(编号 3),但我不知道它使用的是方法 1 还是方法 2。

使用读卡器,我试图让您的编程尽可能简单。如果您有 API,最简单的方法是 3。下一个最简单的是方法 2,如果您安装了供应商驱动程序,您应该可以使用该方法。您应该会在设备管理器中看到设备。

要解锁卡(加密),您还需要安装卡附带的证书。文件浏览器应该能够读/写卡。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?