
本示例使用的发卡器: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);
}
}
}
}
}