MIFARE DESFire Light 卡C#读写更改卡片密钥源码

本示例使用的发卡器:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.52de2c1bSIoUNa&ft=t&id=811882869044

cs 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;  //调用动态库一定要加入这个引用

namespace MifareDesfireLight
{
    public partial class Form1 : Form
    {
        //外部函数声明:让设备发出声响--------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "pcdbeep", CallingConvention = CallingConvention.StdCall)]
        static extern byte pcdbeep(Int32 xms);//xms单位为毫秒 

        //读取设备编号,可做为软件加密狗用,也可以根据此编号在公司网站上查询保修期限-----------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "pcdgetdevicenumber", CallingConvention = CallingConvention.StdCall)]
        static extern byte pcdgetdevicenumber(byte[] devicenumber);//devicenumber用于返回编号 

        //获取IC卡芯片型号---------------------------------------------------------------------------------------------------------------------------------------- 
        [DllImport("OUR_MIFARE.dll", EntryPoint = "getmifareversion")]
        static extern byte getmifareversion(byte[] cardtypestr, byte[] AtqaSak, byte[] versionbuf, byte[] versionlen, byte[] retsw);

        //激活Desfire卡、CPU卡------------------------------------------------------------------------------------------------------------------------------------ 
        [DllImport("OUR_MIFARE.dll", EntryPoint = "cpurequest1")]
        static extern byte cpurequest1(byte[] mypiccserial, byte[] myparam, byte[] myver, byte[] mycode, byte[] AtqaSak);

        //CPU卡发送接收调试--------------------------------------------------------------------------------------------------------------------------------------- 
        [DllImport("OUR_MIFARE.dll", EntryPoint = "cpuisoapdu")]
        static extern byte cpuisoapdu(byte[] sendbuf, Int32 datalen,  byte[] revbuf, byte[] revlen);

        //EV2密钥认证---------------------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "desfireauthkeyev2")]
        static extern byte desfireauthkeyev2(byte[] keybuf, byte keyid, byte authmode, byte[] retsw);

        //更改Desfire Light卡密钥---------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "ntagchangkey")]
        static extern byte ntagchangkey(byte[] newkeybuf, byte keyid,  byte onecode, byte[] oldkeybuf, byte[] retsw);

        //搜索出Desfire Light卡所有文件的ID------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "desfirelightgetfileids")]
        static extern byte desfirelightgetfileids(byte commmode, byte[] fidbuf, byte[] fidsize,  byte[] retsw);

        //搜索出Desfire Light卡所有ISO文件的ID----------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "desfirelightgetisofileids")]
        static extern byte desfirelightgetisofileids(byte commmode, byte[] fidbuf, byte[] fidsize, byte[] retsw);

        //读取文件配置信息------------------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "ntagreadfilesettings")]
        static extern byte ntagreadfilesettings(byte commmode, byte fid, byte[] settingsbuf, byte[] revbuflen, byte[] retsw);

        //更改文件配置信息------------------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "ntagchangefilesettings")]
        static extern byte ntagchangefilesettings(byte commmode, byte fid, byte[] settingsbuf, byte datalen, byte[] retsw);

        //读取文件数据----------------------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "ntagreaddata")]
        static extern byte ntagreaddata(byte commmode, byte fid, Int32 frombit, Int32 datalen,byte[] databuf, byte[] retsw);

        //写数据到文件----------------------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "ntagwritedata")]
        static extern byte ntagwritedata(byte commmode, byte fid, Int32 frombit, Int32 datalen, byte[] databuf, byte[] retsw);

        //卡片配置-------------------------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "ntagsetconfiguration")]
        static extern byte ntagsetconfiguration(byte optionval, byte[] settingsbuf, Int32 settingslen,  byte[] retsw);

        //删除MAC文件----------------------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "desfirelightdeletemacfile")]
        static extern byte desfirelightdeletemacfile(byte fid, byte[] retsw);

        //创建MAC文件----------------------------------------------------------------------------------------------------------------------------------------------
        [DllImport("OUR_MIFARE.dll", EntryPoint = "desfirelightcreatemacfile")]
        static extern byte desfirelightcreatemacfile(byte fid, byte[] settingsbuf, byte[] retsw);

        public Form1()
        {
            InitializeComponent();
        }

        private static byte MessageDispInfo(byte errno)
        {
            switch (errno)
            {
                case 0:
                    MessageBox.Show("操作成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    break;
                case 8:
                    MessageBox.Show("请重新拿开卡后再放到感应区!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 23:
                    MessageBox.Show("错误代码:" + errno.ToString("D") + ",驱动程序错误或尚未安装!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 24:
                    MessageBox.Show("错误代码:" + errno.ToString("D") + ",操作超时,一般是动态库没有反映!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 25:
                    MessageBox.Show("错误代码:" + errno.ToString("D") + ",发送字数不够!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 26:
                    MessageBox.Show("错误代码:" + errno.ToString("D") + ",发送的CRC错!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 27:
                    MessageBox.Show("错误代码:" + errno.ToString("D") + ",接收的字数不够!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 28:
                    MessageBox.Show("错误代码:" + errno.ToString("D") + ",接收的CRC错!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 50:
                    MessageBox.Show("RATS错误,厂家调试代码,用户不需理会!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 51:
                    MessageBox.Show("PPS错误,厂家调试代码,用户不需理会!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 52:
                    MessageBox.Show("已进入了14443-4协议状态,可进行CPU卡功能所有操作了!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 53:
                    MessageBox.Show("CPU卡功能通讯错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 54:
                    MessageBox.Show("数据不足,需要接着发送未完成的数据至卡上!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 55:
                    MessageBox.Show("发送ACK指令给卡,让卡接着发送数据回来!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 56:
                    MessageBox.Show("清空根目录失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 57:
                    MessageBox.Show("卡片不支持功能!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 58:
                    MessageBox.Show("卡片初始化失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 59:
                    MessageBox.Show("分配的空间不足!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 60:
                    MessageBox.Show("本次操作的实体已存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 61:
                    MessageBox.Show("无足够空间!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 62:
                    MessageBox.Show("文件不存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 63:
                    MessageBox.Show("权限不足,有可能是用只读密码认证,导致无法更改读写密码或无法写文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 64:
                    MessageBox.Show("密码不存在,或密钥文件未创建!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 65:
                    MessageBox.Show("传送长度错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 66:
                    MessageBox.Show("Le错误,即接收的数据长度指定过大!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 67:
                    MessageBox.Show("功能不支持或卡中无MF 或卡片已锁定!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 68:
                    MessageBox.Show("密码认证错识次数过多,该密码已被锁死!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 86:
                    MessageBox.Show("更改后的密码长度必须和创建时的长度一致!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 87:
                    MessageBox.Show("应用目录不存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 88:
                    MessageBox.Show("应用文件不存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 89:
                    MessageBox.Show("文件号不能超过5!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 90:
                    MessageBox.Show("读取文件时返回的长度不足,数据可能不正确!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 91:
                    MessageBox.Show("一次读文件的长度不能超过255!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 92:
                    MessageBox.Show("一次写文件的长度不能超过247!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case 70:
                case 71:
                case 72:
                case 73:
                case 74:
                case 75:
                case 76:
                case 77:
                case 78:
                case 79:
                case 80:
                case 81:
                case 82:
                case 83:
                case 84:
                case 85:
                    MessageBox.Show("密码错误,剩余次数为" + Convert.ToString(errno - 70) + ",如果为0,该密码将锁死,无法再认证", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                default:
                    MessageBox.Show("操作失败,返回错误代码!" + Convert.ToString(errno), "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;


            }
            return 0;
        }

        //判断16进制数据是否正确
        public static bool checkhexstr(string inputstr, int hexlen, byte[] bytebuf)
        {
            try
            {
                inputstr = inputstr.Replace(" ", "");
                inputstr = inputstr.Replace("\r", "");
                inputstr = inputstr.Replace("\n", "");
                for (int i = 0; i < hexlen; i++)
                {
                    bytebuf[i] = Convert.ToByte(Convert.ToInt32(inputstr.Substring(i * 2, 2), 16));
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

        //卡操作返回代码解析
        public static string RetTextFromStr(string inputstr)
        {
            string RetTextFromStr = "";
            switch (inputstr)
            {
                case "9000":
                    RetTextFromStr = "成功!";
                    pcdbeep(20);
                    break;
                case "9100":
                    RetTextFromStr = "成功!";
                    pcdbeep(20);
                    break;
                case "6281":
                    RetTextFromStr = "回送的数据可能错误!";
                    break;
                case "6283":
                    RetTextFromStr = "选择文件无效,文件或密钥校验错误";
                    break;
                case "6400":
                    RetTextFromStr = "状态标志未改变";
                    break;
                case "6581":
                    RetTextFromStr = "写 EEPROM 不成功!";
                    break;
                case "6700":
                    RetTextFromStr = "长度错误";
                    break;
                case "6900":
                    RetTextFromStr = "CLA 与线路保护要求不匹配";
                    break;
                case "6901":
                    RetTextFromStr = "无效的状态!";
                    break;
                case "6981":
                    RetTextFromStr = "命令与文件结构不相容";
                    break;
                case "6982":
                    RetTextFromStr = "不满足安全状态";
                    break;
                case "6983":
                    RetTextFromStr = "密钥被锁死!";
                    break;
                case "6984":
                    RetTextFromStr = "MAC格式不符合";
                    break;
                case "6985":
                    RetTextFromStr = "使用条件不满足";
                    break;
                case "6986":
                    RetTextFromStr = "请先选择文件!";
                    break;
                case "6987":
                    RetTextFromStr = "无安全报文";
                    break;
                case "6988":
                    RetTextFromStr = "安全报文数据项不正确";
                    break;
                case "6A80":
                    RetTextFromStr = "数据域参数错误!";
                    break;
                case "6A81":
                    RetTextFromStr = "功能不支持或卡中无MF 或卡片已锁定";
                    break;
                case "6A82":
                    RetTextFromStr = "文件未找到";
                    break;
                case "6A83":
                    RetTextFromStr = "记录未找到!";
                    break;
                case "6A84":
                    RetTextFromStr = "文件无足够空间";
                    break;
                case "6A86":
                    RetTextFromStr = "参数P1 P2 错";
                    break;
                case "6A88":
                    RetTextFromStr = "密钥未找到!";
                    break;
                case "6B00":
                    RetTextFromStr = "在达到Le/Lc 字节之前文件结束,偏移量错误";
                    break;
                case "6E00":
                    RetTextFromStr = "无效的CLA";
                    break;
                case "6F00":
                    RetTextFromStr = "数据无效!";
                    break;
                case "9302":
                    RetTextFromStr = "MAC 错误";
                    break;
                case "9303":
                    RetTextFromStr = "应用已被锁定";
                    break;
                case "9401":
                    RetTextFromStr = "金额不足!";
                    break;
                case "9403":
                    RetTextFromStr = "密钥未找到!";
                    break;
                case "9406":
                    RetTextFromStr = "所需的MAC 不可用!";
                    break;
                case "91AE":
                    RetTextFromStr = "认证失败,请检查命行的参数和前期计算是否错误!";
                    break;
                case "91CA":
                    RetTextFromStr = "上一个命令未完全完成!";
                    break;
                case "917E":
                    RetTextFromStr = "指令长度错误!";
                    break;
                case "9140":
                    RetTextFromStr = "当前目录或应用密钥不存在,请先选择正确的目录或应用!";
                    break;
                case "919D":
                    RetTextFromStr = "处于未验证密码的状态,该指令无法操作!";
                    break;
                case "911E":
                    RetTextFromStr = "MAC错误!";
                    break;
                case "91F0":
                    RetTextFromStr = "该文件号不存在!";
                    break;
                case "919E":
                    RetTextFromStr = "参数无效!";
                    break;
                case "91BE":
                    RetTextFromStr = "试图读取/写入的数据超出文件/记录的边界!";
                    break;
                case "91A0":
                    RetTextFromStr = "请求的 AID 不存在!";
                    break;
                default:
                    if (inputstr.Substring(0, 3) == "63C")
                    {
                        int i = Convert.ToInt16(inputstr.Substring(3, 1), 16);
                        if (i > 0)
                        {
                            RetTextFromStr = "再试 " + i.ToString("D") + " 次错误密码将锁定!";
                        }
                        else { RetTextFromStr = "密码已被锁定"; }
                    }
                    else
                    {
                        RetTextFromStr = "未知的异常";
                    }
                    break;
            }

            return RetTextFromStr;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
            comboBox4.SelectedIndex = 0;
            comboBox5.SelectedIndex = 0;
            comboBox6.SelectedIndex = 1;

            comboBox7.SelectedIndex = 2;
            comboBox8.SelectedIndex = 5;
            comboBox9.SelectedIndex = 5;
            comboBox10.SelectedIndex = 5;
            comboBox11.SelectedIndex = 5;

            comboBox12.SelectedIndex = 0;
            comboBox13.SelectedIndex = 2;

            comboBox14.SelectedIndex = 0;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            byte status = pcdbeep(50);
            if (status != 0)
            {
                MessageDispInfo(status);
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            byte[] devno = new byte[4];
            byte status = pcdgetdevicenumber(devno);
            if (status == 0)
            {
                pcdbeep(50);
                MessageBox.Show("设备的序列号为:" + devno[0].ToString("D3") + "-" + devno[1].ToString("D3") + "-" + devno[2].ToString("D3") + "-" + devno[3].ToString("D3"), "示例程序", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else { MessageDispInfo(status); }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            byte[] AtqaSak = new byte[3];
            byte[] retsw = new byte[2];
            byte[] versionbuf = new byte[100];
            byte[] versionlen = new byte[2];
            byte[] cardtypebuf = new byte[1024];

            byte status = getmifareversion(cardtypebuf, AtqaSak, versionbuf, versionlen, retsw);
            string cardtypestr = Encoding.ASCII.GetString(cardtypebuf).Trim();
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageDispInfo(status);
            }
            else
            {
                pcdbeep(20);
                MessageBox.Show("获取IC卡芯片型号操作,卡片返回代码:" + retstr + "\r\n型号:" + cardtypestr, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            byte status;  //'存放返回值
            byte[] mypiccserial = new byte[7];//'卡序列号            
            byte[] myparam = new byte[4];
            byte[] AtqaSak = new byte[3];
            byte[] myver = new byte[1];
            byte[] mycode = new byte[1];
            string cardhohex = "";
            string parastr = "";
            string verstr = "";
            string codestr = "";
            int i;

            status = cpurequest1(mypiccserial, myparam, myver, mycode, AtqaSak);
            if (status == 0 || status == 52)
            {
                pcdbeep(20);
                if (AtqaSak[0] / 64 > 0)
                {
                    for (i = 0; i < 7; i++) { cardhohex = cardhohex + mypiccserial[i].ToString("X2"); }
                    for (i = 0; i < 4; i++) { parastr = parastr + myparam[i].ToString("X2"); }
                    verstr = myver[0].ToString("X2");
                    codestr = mycode[0].ToString("X2");
                    textBox1.Text = cardhohex;
                    MessageBox.Show("激活Desfire卡成功,可以接着重复操作第二步进行调试了。\r\n" + "16进制卡号:" + cardhohex + "\r\n参数:" + parastr + "\r\n版本信息:" + verstr + "\r\n厂商代码(复旦为90):" + codestr, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    for (i = 0; i < 4; i++) { cardhohex = cardhohex + mypiccserial[i].ToString("X2"); }
                    for (i = 0; i < 4; i++) { parastr = parastr + myparam[i].ToString("X2"); }
                    verstr = myver[0].ToString("X2");
                    codestr = mycode[0].ToString("X2");
                    textBox1.Text = cardhohex;
                    MessageBox.Show("激活Fm1208CPU卡成功,可以接着重复操作第二步进行调试了。\r\n" + "16进制卡号:" + cardhohex + "\r\n参数:" + parastr + "\r\n版本信息:" + verstr + "\r\n厂商代码(复旦为90):" + codestr, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                MessageDispInfo(status);
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (comboBox1.SelectedIndex)
            {
                case 0:
                    comboBox2.SelectedIndex = 0;
                    comboBox3.SelectedIndex = 1;
                    textBox2.Text = "A0 00 00 03 96 56 43 41 03 F0 15 40 00 00 00 0B";
                    break;
                case 1:
                    comboBox2.SelectedIndex = 1;
                    comboBox3.SelectedIndex = 0;
                    textBox2.Text = "DF 01";
                    break;
                case 2:
                    comboBox2.SelectedIndex = 0;
                    comboBox3.SelectedIndex = 0;
                    textBox2.Text = "D2 76 00 00 85 01 01";
                    break;
                case 3:
                    comboBox2.SelectedIndex = 1;
                    comboBox3.SelectedIndex = 0;
                    textBox2.Text = "E1 03";
                    break;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            byte[] databuf=new byte[20];
            byte[] sendbuf =new byte[128];
            byte[] revbuf = new byte[128];
            byte[] revbuflen = new byte[4];
            byte datalen=0;

            switch (comboBox1.SelectedIndex)
            {
                case 0:
                    datalen = 16;                    
                    break;
                case 1:
                    datalen = 2;     
                    break;
                case 2:
                    datalen = 7;     
                    break;
                case 3:
                    datalen = 2;     
                    break;
            }

            if (checkhexstr(textBox2.Text.Trim(), datalen, databuf) == false)
            {
                MessageBox.Show("十六进制目标ID输入错误,请输入 " + datalen.ToString("D")+" 字节的目标ID!" , "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            sendbuf[0] = 0x00;
            sendbuf[1] = 0xA4;

            //'00h Select MF, DF or EF, by file identifier
            //'01h Select child DF
            //'02h Select EF under the current DF, by file identifier
            //'03h Select parent DF of the current DFP
            //'04h Select by DF name
            if  (comboBox2.SelectedIndex==0){
                sendbuf[2] = 0x04;
            }else { sendbuf[2] = 0x00; }

            //'00h Return FCI template: data stored in the file with ID 1Fh should be returned
            //'0Ch No response data: no FCI should be returned
            if (comboBox3.SelectedIndex == 0){
                sendbuf[3] = 0x00;
            }
            else { sendbuf[3] = 0x0C; }

            sendbuf[4] = datalen;
            for (int i = 0; i < datalen; i++)
            {
                sendbuf[i + 5] = databuf[i];
            }

            byte status = cpuisoapdu(sendbuf,Convert.ToByte(datalen + 6), revbuf, revbuflen);
            if (status == 0 || status == 55)
            {
                Int32 j = 0;
                string strls = "";
                while (j < revbuflen[0])
                {
                    strls = strls + revbuf[j].ToString("X2");
                    j++;
                }

                if (status == 0)
                {
                    MessageBox.Show("选择卡内应用操作卡片返回代码:" + strls + ",说明:" + RetTextFromStr(strls), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("选择卡内应用操作卡片返回异常代码:" + status.ToString("D") + ",说明:还有剩余数据没接收完,请再发AA继续接收后面的数据!" , "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                } 
            }
            else
            {
                if (status == 53)
                {
                    MessageBox.Show("选择卡内应用操作卡片返回异常代码:" + status.ToString("D") + ",说明:已出现发送无线信息后CPU卡没响应,请重新拿开卡后再放到感应区,再重新点【第一步:CPU卡复位】。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("选择卡内应用操作卡片返回异常代码:" + status.ToString("D"), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void button18_Click(object sender, EventArgs e)
        {
            byte[] authkeybuf = new byte[24];
            byte[] retsw = new byte[2];
            string retstr;
            int keylen = 16;

            if (checkhexstr(textBox6.Text.Trim(), keylen, authkeybuf) == false)
            {
                MessageBox.Show("十六进制认证密钥输入错误,请输入 " + keylen.ToString("D") + " 字节的16进制认证密钥!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            byte status = desfireauthkeyev2(authkeybuf, Convert.ToByte(keyid.Value), Convert.ToByte(comboBox14.SelectedIndex), retsw);
            retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");

            if (status > 0)
            {
                MessageBox.Show("认证密码操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show("认证密码操作,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            byte[] newkeybuf = new byte[24];
            byte[] oldkeybuf = new byte[24];
            byte[] retsw = new byte[2];
            string retstr;
            int keylen=16;

            if (checkhexstr(textBox3.Text.Trim(), keylen, newkeybuf) == false)
            {
                MessageBox.Show("十六进制新密钥输入错误,请输入 " + keylen.ToString("D") + " 字节的16进制新密钥!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (checkhexstr(textBox6.Text.Trim(), keylen, oldkeybuf) == false)
            {
                MessageBox.Show("十六进制旧密钥输入错误,请输入 " + keylen.ToString("D") + " 字节的16进制旧密钥!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }


            byte status = ntagchangkey(newkeybuf, Convert.ToByte(editkeyid.Value), 1, oldkeybuf, retsw);
            retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");

            if (status > 0)
            {
                MessageBox.Show("更改Light卡密钥操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (retstr == "91AE")
                {
                    MessageBox.Show("更改Light卡密钥操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:更改密码指令被禁止或密码未认证或密码不对,请先用0号密码认证后再试!" , "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("更改Ligh卡密钥操作,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] retsw = new byte[2];
            byte[] fidsize = new byte[1];       //返回的文件数量
            byte[] fidbuf = new byte[16];       //文件ID号数据缓冲

            byte status = desfirelightgetfileids(Convert.ToByte(comboBox4.SelectedIndex), fidbuf, fidsize, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("搜索当前应用内所有文件ID操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            string strls1 = "";
            if (fidsize[0] > 0)
            {
                strls1 = "文件ID:" + fidbuf[0].ToString("D");
                byte j = 1;
                while (j < fidsize[0])
                {
                    strls1 = strls1 + "," + fidbuf[j].ToString("D");
                    j++;
                }
            }
            MessageBox.Show("搜索当前应用内所有文件ID操作,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr) + "\r\n文件数量:" + fidsize[0].ToString("D") + "\r\n" + strls1, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            byte[] retsw = new byte[2];
            byte[] fidsize = new byte[1];       //返回的文件数量
            byte[] fidbuf = new byte[16];       //文件ID号数据缓冲

            byte status = desfirelightgetisofileids(Convert.ToByte(comboBox4.SelectedIndex), fidbuf, fidsize, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("搜索当前应用内所有ISO文件ID操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            string strls1 = "";
            if (fidsize[0] > 0)
            {
                strls1 = "ISO文件ID:" + fidbuf[1].ToString("X2") + fidbuf[0].ToString("X2");
                byte j = 1;
                while (j < fidsize[0])
                {
                    strls1 = strls1 + "," + fidbuf[j * 2 + 1].ToString("X2") + fidbuf[j * 2 ].ToString("X2");
                    j++;
                }
            }
            MessageBox.Show("搜索当前应用内所有ISO文件ID操作,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr) + "\r\n文件数量:" + fidsize[0].ToString("D") + "\r\n" + strls1, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void button9_Click(object sender, EventArgs e)
        {
            byte fid;
            byte commmode;
            byte[] retsw = new byte[2];
            byte[] revbuflen = new byte[1];          //返回数据长度
            byte[] settingsbuf = new byte[32];       //文件配置信息

            textBox4.Text = "";
            textBox5.Text = "";

            try { fid = Convert.ToByte(comboBox5.Text); }
            catch
            {
                MessageBox.Show("文件号输入错误,请输入正确的十进制文件号!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            commmode = Convert.ToByte(comboBox6.SelectedIndex);

            byte status = ntagreadfilesettings(commmode, fid, settingsbuf, revbuflen, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("读取文件配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (retstr == "9100")
            {
                string strls = "";
                byte j = 0;
                while (j < revbuflen[0])
                {
                    strls = strls + settingsbuf[j].ToString("X2") + " ";
                    j++;
                }
                textBox5.Text = strls;

                if (settingsbuf[0] == 2) { textBox4.Text = "Value"; }       //settingsbuf(0)为FileType
                else {
                    if (settingsbuf[0] == 4) { textBox4.Text = "CyclicRecord"; }
                    else {
                        if (settingsbuf[0] == 5) { textBox4.Text = "TransactionMAC"; }
                        else { textBox4.Text = "Data"; }
                    }
                }

                if ((settingsbuf[1] & 3) == 1) { comboBox7.SelectedIndex = 1; }       //settingsbuf(1)为FileOption
                else {
                    if ((settingsbuf[1] & 3) == 3) { comboBox7.SelectedIndex = 2; }
                    else { comboBox7.SelectedIndex = 0; }
                }

                int i = settingsbuf[2] % 16;   //settingsbuf(2-3)为AccessRights文件访问权限,更改指令 需要先认证的密码
                if (i == 15) { comboBox11.SelectedIndex = 5; }
                else{
                    if (i == 14) { comboBox11.SelectedIndex = 5; }
                    else{
                        if (i > 4) { comboBox11.SelectedIndex = 4; }
                        else { comboBox11.SelectedIndex = i; }
                    }
                }

                i = settingsbuf[2] / 16;        //读写指令 需要先认证的密码
                if (i == 15) { comboBox10.SelectedIndex = 6; }
                else
                {
                    if (i == 14) { comboBox10.SelectedIndex = 5; }
                    else
                    {
                        if (i > 4) { comboBox10.SelectedIndex = 4; }
                        else { comboBox10.SelectedIndex = i; }
                    }
                }

                i = settingsbuf[3] % 16;        //只写指令 需要先认证的密码
                if (i == 15) { comboBox9.SelectedIndex = 6; }
                else
                {
                    if (i == 14) { comboBox9.SelectedIndex = 5; }
                    else
                    {
                        if (i > 4) { comboBox9.SelectedIndex = 4; }
                        else { comboBox9.SelectedIndex = i; }
                    }
                }

                i = settingsbuf[3] / 16;        //只读指令 需要先认证的密码
                if (i == 15) { comboBox8.SelectedIndex = 6; }
                else
                {
                    if (i == 14) { comboBox8.SelectedIndex = 5; }
                    else
                    {
                        if (i > 4) { comboBox8.SelectedIndex = 4; }
                        else { comboBox8.SelectedIndex = i; }
                    }
                }
                pcdbeep(20);
                MessageBox.Show("读取文件配置操作成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (retstr == "917E")
                {
                    MessageBox.Show("指令长度错误,如果上一条操作为密码认证,本次指令必需用密文+MAC保护的通信模式,否则用明文的通信模式!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("读取文件配置操作,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }            
        }

        private void button10_Click(object sender, EventArgs e)
        {
            byte fid;
            byte[] settingsbuf = new byte[32];
            byte[] retsw = new byte[2];

            if (comboBox11.SelectedIndex == 6)
            {
                MessageBox.Show("更改指令需要先认证的密码如设为禁止操作,以后将不能再用5F指令更改配置!为防止卡片锁死此功能,本示例暂不支持该设置!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            try { fid = Convert.ToByte(comboBox5.Text); }
            catch
            {
                MessageBox.Show("文件号输入错误,请输入正确的十进制文件号!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (comboBox7.SelectedIndex == 1) { settingsbuf[0] = 1; }       //通讯模式
            else {
                if (comboBox7.SelectedIndex == 2) { settingsbuf[0] = 3; }
                else {
                    settingsbuf[0] = 0;
                }
            }

            if (comboBox11.SelectedIndex < 5) { settingsbuf[1] = Convert.ToByte(comboBox11.SelectedIndex); } //文件访问权限,更改指令 需要先认证的密码
            else{
                if (comboBox11.SelectedIndex == 5) { settingsbuf[1] = 0x0E; }
                else {
                    settingsbuf[1] = 0x0F;
                }
            }

            if (comboBox10.SelectedIndex < 5) { settingsbuf[1] = Convert.ToByte(settingsbuf[1]+ comboBox10.SelectedIndex*16); } //文件访问权限,读写指令 需要先认证的密码
            else
            {
                if (comboBox10.SelectedIndex == 5) { settingsbuf[1] =Convert.ToByte(settingsbuf[1]+ 0xe0); }
                else
                {
                    settingsbuf[1] =Convert.ToByte(settingsbuf[1]+ 0xf0);
                }
            }

            if (comboBox9.SelectedIndex < 5) { settingsbuf[2] = Convert.ToByte(comboBox9.SelectedIndex); } //只写指令 需要先认证的密码
            else
            {
                if (comboBox9.SelectedIndex == 5) { settingsbuf[2] = 0x0E; }
                else
                {
                    settingsbuf[2] = 0x0F;
                }
            }

            if (comboBox8.SelectedIndex < 5) { settingsbuf[2] = Convert.ToByte(settingsbuf[2] + comboBox8.SelectedIndex * 16); } //文件访问权限,读写指令 需要先认证的密码
            else
            {
                if (comboBox8.SelectedIndex == 5) { settingsbuf[2] = Convert.ToByte(settingsbuf[2] + 0xe0); }
                else
                {
                    settingsbuf[2] = Convert.ToByte(settingsbuf[2] + 0xf0);
                }
            }

            string datastr = "";
            for (int i = 0; i < 3; i++) { datastr = datastr + settingsbuf[i].ToString("X2") + " "; }
            textBox5.Text = datastr;
            //return;

            byte status = ntagchangefilesettings(Convert.ToByte(comboBox6.SelectedIndex), fid, settingsbuf, 3, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0) {
                MessageBox.Show("更改文件配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (retstr == "9100"){
                MessageBox.Show("更改文件配置操作成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (retstr == "91AE") {
                    if (comboBox6.SelectedIndex == 1) { MessageBox.Show("更改文件配置操作返回异常:" + status.ToString("D") + ",更改指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!" , "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                    else { MessageBox.Show("更改文件配置操作返回异常:" + status.ToString("D") + ",更改指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                }
                else { MessageBox.Show("更改文件配置操作,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            }

        }

        private void button11_Click(object sender, EventArgs e)
        {            
            byte commmode;
            byte fid;
            byte[] databuf = new byte[8192];
            byte[] retsw = new byte[2];

            try { fid = Convert.ToByte(comboBox12.Text); }
            catch
            {
                MessageBox.Show("读写文件号输入错误,请输入正确的十进制文件号!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (comboBox13.SelectedIndex == 2) { commmode = 0x03; }  //通信模式,bit1-0为1表示通信模式为MAC,bit1-0为3表示通信模式为密文+MAC模式
            else { 
                if (comboBox13.SelectedIndex == 1) { commmode = 0x01; }            
                else { 
                    commmode = 0x00; 
                }
            }

            byte status = ntagreaddata(commmode, fid,Convert.ToInt32(rwbegin.Value),Convert.ToInt32 (rwlen.Value), databuf, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status == 47){
                if (retstr == "91AE"){
                    MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:读数据失败,请检查认证的密码号是否正确!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else{
                    if (retstr == "917E"){
                        if (comboBox13.SelectedIndex == 1) {
                            MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:读文件指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else { MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:读文件指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                    }
                    else {
                        MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" +RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); 
                    }
                }
                return;
            }
            else{
                if (status >0) {
                    MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }

            if (retstr == "9100"){
                int i = 0;
                string datahex = "";
                while (i<rwlen.Value){
                    datahex = datahex + databuf[i].ToString("X2") + " ";
                    i++;
                }
                textBox8.Text = datahex;
                pcdbeep(20);
                MessageBox.Show("读取文件内数据成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else {
                if (retstr == "917E")
                {
                    if (comboBox13.SelectedIndex == 1)
                    {
                        MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:指令长度错误或密码未认证,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else { MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                }
                else
                {
                    MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

 
        }

        private void button12_Click(object sender, EventArgs e)
        {
            byte commmode;
            byte fid;
            byte[] databuf = new byte[8192];
            byte[] retsw = new byte[2];

            try { fid = Convert.ToByte(comboBox12.Text); }
            catch
            {
                MessageBox.Show("读写文件号输入错误,请输入正确的十进制文件号!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (checkhexstr(textBox8.Text.Trim(), Convert.ToInt32(rwlen.Value), databuf) == false)
            {
                if (MessageBox.Show("写入数据输入不足或错误,是否要生成写入数据?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    button17.PerformClick();
                }
                return;
            }

            if (comboBox13.SelectedIndex == 2) { commmode = 0x03; }  //通信模式,bit1-0为1表示通信模式为MAC,bit1-0为3表示通信模式为密文+MAC模式
            else
            {
                if (comboBox13.SelectedIndex == 1) { commmode = 0x01; }
                else
                {
                    commmode = 0x00;
                }
            }

            byte status = ntagwritedata(commmode, fid, Convert.ToInt32(rwbegin.Value), Convert.ToInt32(rwlen.Value), databuf, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status == 41)
            {
                if (retstr == "91AE")
                {
                    MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写数据失败,请检查认证的密码号是否正确!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    if (retstr == "9100")
                    {
                        MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:有可能是错误选择"密文+MAC保护的通信模式",请选择"MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        if (retstr == "917E")
                        {
                            if (comboBox13.SelectedIndex == 1)
                            {
                                MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写文件指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                            else { MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写文件指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                        }
                        else
                        {
                            MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                return;
            }
            else
            {
                if (status > 0)
                {
                    MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                else
                {
                    if (retstr == "9100")
                    {
                        pcdbeep(20);
                        MessageBox.Show("写文件成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        if (retstr == "91AE")
                        {
                            if (comboBox13.SelectedIndex == 1)
                            {
                                MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写文件指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                            else { MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写文件指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                        }
                        else
                        {
                            MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
            }


        }

        private void button17_Click(object sender, EventArgs e)
        {
            Int32 i = 0;
            string datastr = "";
            for (Int32 j = 0; j < Convert.ToInt32(rwlen.Value); j++)
            {
                datastr = datastr + i.ToString("X2") + " ";
                i++;
                if (i == 256) { i = 0; }
            }
            textBox8.Text = datastr;
        }

        private void button13_Click(object sender, EventArgs e)
        {
            byte[] settingsbuf = new byte[64];
            byte[] retsw = new byte[2];

            if (MessageBox.Show("此操作一旦成功,卡的应用名和ID号将被写死,不可恢复,继续操作?", "严重警告", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
            {
                return;
            }
            //'AppNameOptions 1 byte
            //'Bit 7 must be set to 1b and means
            //'update of the 2-byte ISOFile ID
            //'Bit 6 to 5: RFU
            //'Bit 4 to 0: Length of DF Name,
            //'must be in the range of 1 to 16
            settingsbuf[0] = 0x87;
            //ISO DFName
            settingsbuf[1] = 0xD2;
            settingsbuf[2] = 0x76;
            settingsbuf[3] = 0x00;
            settingsbuf[4] = 0x00;
            settingsbuf[5] = 0x85;
            settingsbuf[6] = 0x01;
            settingsbuf[7] = 0x01;
            //不够16个字节,需要补0
            for (int i = 8; i < 17; i++) { settingsbuf[i] = 0x00; }
            //ISO File ID LSB first
            settingsbuf[17] = 0x10;
            settingsbuf[18] = 0xE1;

            byte status = ntagsetconfiguration(6, settingsbuf, 19, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (retstr == "9100")
                {
                    pcdbeep(20);
                    MessageBox.Show("更改配置成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    if (retstr == "91AE")
                    {
                        MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:更改配置指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void button14_Click(object sender, EventArgs e)
        {
            byte[] settingsbuf = new byte[64];
            byte[] retsw = new byte[2];

            if (MessageBox.Show("此操作一旦成功,卡的应用名和ID号将被写死,不可恢复,继续操作?", "严重警告", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
            {
                return;
            }
            //'Bit 7 to 2: RFU
            //'Bit 1: Set to 1b means update 2 Files
            //'Bit 1: Set to 0b means update 1 File
            //'Bit 0: Set to 1b means update ISO File ID
            //'Bit 0: Set to 0b means no update 'of ISO File ID
            settingsbuf[0] = 0x01;
            //OldFileNo
            settingsbuf[1] = 31;
            //NewFileNo
            settingsbuf[2] = 31;
            //NewISOFileID
            settingsbuf[3] = 0x03;
            settingsbuf[4] = 0xE1;

            byte status = ntagsetconfiguration(8, settingsbuf, 5, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (retstr == "9100")
                {
                    pcdbeep(20);
                    MessageBox.Show("更改配置成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    if (retstr == "91AE")
                    {
                        MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:更改配置指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void button15_Click(object sender, EventArgs e)
        {
            byte[] settingsbuf = new byte[64];
            byte[] retsw = new byte[2];

            if (MessageBox.Show("此操作一旦成功,卡的应用名和ID号将被写死,不可恢复,继续操作?", "严重警告", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
            {
                return;
            }
            //'Bit 7 to 2: RFU
            //'Bit 1: Set to 1b means update 2 Files
            //'Bit 1: Set to 0b means update 1 File
            //'Bit 0: Set to 1b means update ISO File ID
            //'Bit 0: Set to 0b means no update 'of ISO File ID
            settingsbuf[0] = 0x01;
            //OldFileNo
            settingsbuf[1] = 4;
            //NewFileNo
            settingsbuf[2] = 4;
            //NewISOFileID
            settingsbuf[3] = 0x04;
            settingsbuf[4] = 0xE1;

            byte status = ntagsetconfiguration(8, settingsbuf, 5, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (retstr == "9100")
                {
                    pcdbeep(20);
                    MessageBox.Show("更改配置成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    if (retstr == "91AE")
                    {
                        MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:更改配置指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        MessageBox.Show("更改卡片配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void button16_Click(object sender, EventArgs e)
        {
            byte[] settingsbuf = new byte[32];
            byte[] retsw = new byte[2];

            //数据准备
            //FileOption
             settingsbuf[0] = 0x00;  //明文

            //'文件访问权限
            //'更改指令 需要先认证的密码
            settingsbuf[1] = 0x0e ; //无需密码,直接用明文

            //'读写指令 需要先认证的密码
            settingsbuf[1] =Convert.ToByte (settingsbuf[1]+0xe0); //无需密码,直接用明文

            //'只写指令 需要先认证的密码
            settingsbuf[2] = 0x0e; //无需密码,直接用明文

            //'只读指令 需要先认证的密码
            settingsbuf[2] = Convert.ToByte(settingsbuf[2] + 0xe0); //无需密码,直接用明文

            byte status = ntagchangefilesettings(1, 31, settingsbuf, 3, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("更改31号文件配置操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (retstr == "91AE")
            {
                if (comboBox6.SelectedIndex == 1) { MessageBox.Show("更改31号文件配置操作返回异常:" + status.ToString("D") + ",更改指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                else { MessageBox.Show("更改31号文件配置操作返回异常:" + status.ToString("D") + ",更改指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                return;
            }
            else {
                if (retstr != "9100")
                {
                    MessageBox.Show("更改31号文件配置操作,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
            }

            status = ntagchangefilesettings(1, 4, settingsbuf, 3, retsw);
            retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (retstr == "9100")
            {
                pcdbeep(20);
                MessageBox.Show("更改配置成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (retstr == "91AE")
                {
                    if (comboBox6.SelectedIndex == 1) { MessageBox.Show("更改4号文件配置操作返回异常:" + status.ToString("D") + ",更改指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                    else { MessageBox.Show("更改4号文件配置操作返回异常:" + status.ToString("D") + ",更改指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                    return;
                }
                else
                {
                     MessageBox.Show("更改4号文件配置操作,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void button19_Click(object sender, EventArgs e)
        {
            byte[] databuf = new byte[200];
            byte[] retsw = new byte[2];
            string datastr = "00 17 20 01 00 00 FF 04 06 E1 04 01 00 00 00 05 06 E1 05 00 80 82 83 00";

            if (checkhexstr(datastr, 24, databuf) == false)
            {
                MessageBox.Show("写入数据输入不足或错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            byte status = ntagwritedata(0, 31, 0,24, databuf, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status == 41)
            {
                if (retstr == "91AE")
                {
                    MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写数据失败,请检查认证的密码号是否正确!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    if (retstr == "9100")
                    {
                        MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:有可能是错误选择"密文+MAC保护的通信模式",请选择"MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        if (retstr == "917E")
                        {
                            if (comboBox13.SelectedIndex == 1)
                            {
                                MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写文件指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                            else { MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写文件指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                        }
                        else
                        {
                            MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                return;
            }
            else
            {
                if (status > 0)
                {
                    MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                else
                {
                    if (retstr == "9100")
                    {
                        pcdbeep(20);
                        MessageBox.Show("写文件成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        if (retstr == "91AE")
                        {
                            if (comboBox13.SelectedIndex == 1)
                            {
                                MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写文件指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                            else { MessageBox.Show("读文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:写文件指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                        }
                        else
                        {
                            MessageBox.Show("写文件数据操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
            }


        }

        private void button20_Click(object sender, EventArgs e)
        {
            byte[] retsw = new byte[2];
            byte status = desfirelightdeletemacfile(15, retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("删除MAC文件操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (retstr == "9100")
                {
                    pcdbeep(20);
                    MessageBox.Show("删除MAC文件成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    if (retstr == "917E")
                    {
                        MessageBox.Show("删除MAC文件失败,指令长度错误,如果上一条操作为密码认证,本次指令必需用密文+MAC保护的通信模式,否则用明文的通信模式!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("删除MAC文件操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void button21_Click(object sender, EventArgs e)
        {
            byte[] settingsbuf = new byte[32];
            byte[] retsw = new byte[2];

            //数据准备
            //FileOption
            settingsbuf[0] = 0x03;  //密文 MAC保护

            //'文件访问权限
            settingsbuf[1] = 0x00; //更改指令 需要先认证的密码 0

            settingsbuf[1] = Convert.ToByte(settingsbuf[1] + 1*16); //读写指令 需要先认证的密码 1
           
            settingsbuf[2] = 0x0f; //只写指令 需要先认证的密码 禁止该指令

            settingsbuf[2] = Convert.ToByte(settingsbuf[2] + 1 * 16); //只读指令 需要先认证的密码 1

            settingsbuf[3] = 2;//MACKeyOption,KeyType:AES

            for (int i = 4; i <= 20; i++) { settingsbuf[i] = 0; }

            byte status = desfirelightcreatemacfile(15,  settingsbuf,  retsw);
            string retstr = retsw[0].ToString("X2") + retsw[1].ToString("X2");
            if (status > 0)
            {
                MessageBox.Show("创建MAC文件操作返回异常:" + status.ToString("D") + ",卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (retstr == "9100")
            {
                pcdbeep(20);
                MessageBox.Show("创建15号MAC文件操作成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else
            {
                if (retstr == "91AE")
                {                    
                    if (comboBox6.SelectedIndex == 1) { MessageBox.Show("创建MAC文件操作返回异常:" + status.ToString("D") + ",更改指令被禁止或密码未认证或密码不对,请先用正确的密码号进行认证再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                    else { MessageBox.Show("创建MAC文件操作返回异常:" + status.ToString("D") + ",更改指令被禁止或不支持明文操作,请先用正确的密码号进行认证并且选择"密文+MAC保护的通信模式"再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                    return;
                }
                else
                {
                    MessageBox.Show("创建MAC文件操作返回异常,卡片返回代码:" + retstr + ",说明:" + RetTextFromStr(retstr), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }


    }
}
相关推荐
Zhen (Evan) Wang1 小时前
ABP-Book Store Application中文讲解 - Part 2: The Book List Page
c#
小乖兽技术3 小时前
在 .NET 8 开发的WinForms 程序中展示程序版本号的几种方式
开发语言·c#·.net
TheWindofFate3 小时前
C# 基础 try-catch代码块
c#·try-catch
TIF星空7 小时前
【使用 C# 获取 USB 设备信息及进行通信】
开发语言·经验分享·笔记·学习·microsoft·c#
csdn_aspnet9 小时前
如何在 C# 中自定义 Datagridview 标题
c#·winform·datagridview
炯哈哈13 小时前
【上位机——WPF】Window标签常用属性
开发语言·c#·wpf·上位机
江沉晚呤时18 小时前
C# 实现雪花算法(Snowflake Algorithm)详解与应用
c#·.net
酷炫码神21 小时前
C#语法基础
开发语言·c#
酷炫码神1 天前
C#数据类型
java·服务器·c#