当前位置: 首页 > ops >正文

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

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

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 nameif  (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 returnedif (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)为FileTypeelse {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)为FileOptionelse {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 16settingsbuf[0] = 0x87;//ISO DFNamesettingsbuf[1] = 0xD2;settingsbuf[2] = 0x76;settingsbuf[3] = 0x00;settingsbuf[4] = 0x00;settingsbuf[5] = 0x85;settingsbuf[6] = 0x01;settingsbuf[7] = 0x01;//不够16个字节,需要补0for (int i = 8; i < 17; i++) { settingsbuf[i] = 0x00; }//ISO File ID LSB firstsettingsbuf[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 IDsettingsbuf[0] = 0x01;//OldFileNosettingsbuf[1] = 31;//NewFileNosettingsbuf[2] = 31;//NewISOFileIDsettingsbuf[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 IDsettingsbuf[0] = 0x01;//OldFileNosettingsbuf[1] = 4;//NewFileNosettingsbuf[2] = 4;//NewISOFileIDsettingsbuf[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];//数据准备//FileOptionsettingsbuf[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];//数据准备//FileOptionsettingsbuf[0] = 0x03;  //密文 MAC保护//'文件访问权限settingsbuf[1] = 0x00; //更改指令 需要先认证的密码 0settingsbuf[1] = Convert.ToByte(settingsbuf[1] + 1*16); //读写指令 需要先认证的密码 1settingsbuf[2] = 0x0f; //只写指令 需要先认证的密码 禁止该指令settingsbuf[2] = Convert.ToByte(settingsbuf[2] + 1 * 16); //只读指令 需要先认证的密码 1settingsbuf[3] = 2;//MACKeyOption,KeyType:AESfor (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);}}}}
}

http://www.xdnf.cn/news/6262.html

相关文章:

  • SLAM定位与地图构建
  • 【专栏启动】开篇:为什么是 Django + Vue3?测试平台的技术选型与架构蓝图
  • 通用软件项目技术报告 - 第一章节检测 - 参考答案
  • DeepSeek执行流程加速指南:跨框架转换与编译优化的核心策略全解析
  • Day118 | 灵神 | 二叉树 | 删点成林
  • 缺乏对新技术的评估和引入机制,如何建立
  • 【C++】set和multiset的常用接口详解
  • 答题pk小程序道具卡的获取与应用
  • yarn任务筛选spark任务,判断内存/CPU使用超过限制任务
  • 【物联网】基于树莓派的物联网开发【3】——最新镜像下载和烧录
  • 【iOS】源码阅读(四)——isa与类关联的原理
  • 怎么样制作网站?
  • redis是内存级缓存吗
  • the request was rejected because no multipart boundary was found
  • Python-Django系列—日志
  • 中间件-MQ常见问题
  • TCP实现安全传输的核心机制 + TCP的报文讲解(全程图文讲解)
  • UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview(1)
  • 量化交易 - 网格交易策略实现与原理解析
  • 随机森林(Random Forest)
  • EasyExcel详解
  • 用户态和内核态
  • 2、ubantu系统配置OpenSSH | 使用vscode或pycharm远程连接
  • 用MCP往ppt文件里插入系统架构图
  • Servlet原理
  • 获取淘宝商品图片的完整指南
  • 3D曲面上的TSP问题(一):曲面上点集距离求解
  • EdgeShard:通过协作边缘计算实现高效的 LLM 推理
  • 华为Watch的ECG功能技术分析
  • SQLMesh 模型管理指南:从创建到验证的全流程解析