【C#】利用读卡器对IC卡进行读写、加密等操作,源码下载
本例应用场合:对IC卡的读写、加密,个人及各企事业单位可以根据自己的加密方式对卡片进行处理后使用。本例在VS2010及以上编译环境中测试通过。
运行界面:
想调试你得有这些:
德卡D3非接触式IC卡读写器(USB免驱)
IC芯片卡
D3 SDK
在操作之前先了解一下IC卡的一些基础知识(本例以M1卡为例):
M1卡有16个扇区,即0到15扇区,每个扇区4块,每块16个字节,以块为存取单位,要读取扇区中的数据,首先要进行密码校验(校验读卡设备中的密码和卡上的密码);要读取哪个扇区的数据就要校验哪个扇区的密码,dc_read或dc_read_hex方法是用的地址是绝对地址(每个扇区4个地址,16个扇区共64个地址,即0到63),校验完0扇区的密码后,能读取0到3地址上的数据,校验完1扇区的密码后,能读取4到7地址上的数据,以此类推。假设扇区号是 sNo,数据块号是dNo,则:sNo号扇区的最小区块号为:4 * sNo,最大区块号为:4 * sNo + 3。
存储结构
第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。
每个扇区的块0、块1、块2为数据块,可用于存贮数据。
每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:
A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5
对IC卡操作的基本步骤:
初始化InitIC() -> 寻卡ReadIc() -> 校验密码getKeys(string cardID) -> 加密操作LoadKeysToCard(string cardID) -> 关闭串口ExitIC()。
本例测试用卡片的特定加密方式:
- 卡号+“ZMATRIX”+扇区号。
- 经MD5加密后取前12位字符形成字符串。
- 对字符串进行BCD码加密。
- 组合秘钥形成完整控制块数据。
- 写入卡片进行加密。
核心函数的代码:
/// <summary>
/// 寻卡
/// </summary>
/// <returns>物理卡号</returns>
public string ReadIc()
{uint st = 4;ulong icCardNo = 0;char str = (char)0;string cardID = "";int card = dc_card((Int16)_icdev, str, ref icCardNo);if(card == 0){string strCardID = Ten2Hex(icCardNo);cardID = FormatCardID(String.Format("{0:X}", strCardID));cardUniID = cardID;MessageBox.Show("寻卡成功!");}else{MessageBox.Show("寻卡失败!");}return cardID;//16进制
}
/// <summary>
/// 获取各扇区对应秘钥,核心函数
/// </summary>
/// <param name="cardID">卡物理号</param>
private void getKeys(string cardID)
{ int len = 16;byte[] bMoren = { 255, 255, 255, 255, 255, 255 }; byte[] bKey = new byte[6]; byte[] bData = new byte[16];string[] befEncrypt = new string[len]; string[] aftEncrypt = new string[len];for(int sector = 0 ; sector < len ; sector++) { befEncrypt[sector] = cardID + "ZMATRIX" + sector.ToString(); aftEncrypt[sector] = MD5.MD5Encrypt(befEncrypt[sector], 32).Substring(0, 12);bKey = BCDEncrypt.str2Bcd(aftEncrypt[sector]); int checkNum = dc_authentication_passaddr(_icdev, 4, (sector * 4 + 3), bKey);if (checkNum == 0) { MessageBox.Show("验证第" + (sector * 4 + 3) + "块密码成功!"); int readData = dc_read(_icdev, sector * 4 + 3, bData);}else{ MessageBox.Show("验证第" + (sector * 4 + 3) + "块密码失败!"); } }
}
/// <summary>
/// 新卡加密,核心函数
/// </summary>
/// <param name="cardID">新卡序列号(物理卡号)</param>
private void LoadKeysToCard(string cardID)
{ byte[] bKey = new byte[6]; string[] befEncrypt = new string[16]; string[] aftEncrypt = new string[16]; byte[] bMoren = { 255, 255, 255, 255, 255, 255 }; lbl = getLabel();//Label集 lblTips.Text = "";for (int sector = 0; sector < 16; sector++) { int checkNum = dc_authentication_passaddr(_icdev, 4, (sector * 4 + 3),bMoren); if (checkNum == 0) { befEncrypt[sector] = cardID + "ZMATRIX" + sector.ToString(); aftEncrypt[sector] = MD5.MD5Encrypt(befEncrypt[sector], 32).Substring(0, 12);bKey = BCDEncrypt.str2Bcd(aftEncrypt[sector]); int writeOk = dc_write(_icdev, (sector * 4 + 3), CombineKey(bKey)); if (writeOk == 0) { tip[sector] = 0; }else{ tip[sector] = 1; } }else{ tip[sector] = 1; lblTips.Text = "失败:【该卡可能已加密】"; lblTips.ForeColor = Color.Red;} }Set_Text = new set_Text(set_LalColor); thread1 = new Thread(new ThreadStart(run)); thread1.Start();
}
源码下载:关注公众号『几行简码』,回复【读卡】即可获取下载链接。
原创文章,转载请务必先查阅公众号内【转载须知】。
【C#】利用读卡器对IC卡进行读写、加密等操作,源码下载相关推荐
- 独角数卡PHP自动化售货发卡网源码下载
源码下载:独角数卡PHP自动化售货发卡网源码-小程序文档类资源-CSDN下载 独角数卡PHP自动化售货发卡网源码 支付接口已集成 支付宝当面付 支付宝PC支付 支付宝手机支付 payjs微信扫码. P ...
- 树莓派使用RFID-RC522A读卡器对IC卡进行读写(通过 python)
1. 配置树莓派 首先需要运行raspi-config,开启树莓派的spi接口,因为RFID-RC522A读卡器与树莓派之间是通过spi协议进行通信的 https://www.raspberrypi ...
- 电动吞吐式ISO14443ISO15693多功能IC卡磁条读写器M100接口说明
1.RS232串口通讯的线路连接图 A.将TTCE产品所携带的串口通讯线DB9线公头插在电脑串口座上. B.再将TTCE产品所携带串口通讯线的另一端3PIN插头(红线是TXD,蓝线是RXD,黑线是GN ...
- stm32驱动RFID高频读卡器读取IC卡
stm32驱动RFID读卡器读取IC卡 1.介绍RFID 2.RFID控制指令 2.1 读IC卡号 2.2 读IC卡数据块 2.3 写数据到IC卡数据块 2.4 读取RFID读卡器用户数据 2.5 向 ...
- cesium 经纬度绘制点_cesium结合geoserver利用WFS服务实现图层新增(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- Qt利用avilib实现录屏功能_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...
内容概览 1.openlayers6结合geoserver利用WFS服务实现图层编辑功能 2.源代码demo下载 效果图如下: 本篇主要是参照openlayers6结合geoserver利用WFS服务 ...
- arcgis xml 下载 切片_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...
内容概览 1.openlayers6结合geoserver利用WFS服务实现图层编辑功能 2.源代码demo下载 效果图如下: 本篇主要是参照openlayers6结合geoserver利用WFS服务 ...
- Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接
Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...
- 利用SpringBoot和Vue实现前后端分离(附源码)
利用SpringBoot和Vue实现前后端分离(附源码) 引言: 本文主要分享了SpringBoot和Vue整合实现前后端分离,实现了简单的增删查改:包括:项目的搭建.后端的实现.前台的实现:(附源码 ...
- 微信步数日历打卡小程序全栈项目源码+视频教程
一.视频教程目录: 微信小程序+JavaWeb SSM框架+MySql数据库 项目演示 1.项目源码提供,如何使用 1)软件.源码下载 2)如何配置.使用(前提安装好了开发工具和环境配置) 3)项目演 ...
最新文章
- 编程有多可怕 | 每日趣闻
- cocos2d js调用java_【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法...
- sklearn中cross_validation包无法使用
- android 解决Date.gettimezoneoffset已经废弃
- [POI2015]CZA
- 《软件需求最佳实践》阅读笔记01
- matlab深度学习_matlab使用贝叶斯优化的深度学习
- 今天 ,给大家变个魔术!!!
- 智能照明控制系统电路图_咻享智能|学校教室智能照明控制系统怎么理解
- MySql8.0.11的安装与使用
- 【Python】安装IPython和IPthon Notebook
- python读取npy文件 mse_python读取mat或npy文件以及将mat文件保存为npy文件(或npy保存为mat)的方法...
- B. Restore Modulo
- java石头剪刀布思路_石头剪刀布Java实现
- 【路科V0】systemVerilog基础3——字符串类型
- 计算机使用了休眠 怎么唤醒,电脑睡眠模式怎么唤醒?
- 【T+】畅捷通T+存货档案批量修改存货属性
- 服务器启动显示防火墙,宝塔面板防火墙怎么打开
- 80端口进不去问题解析
- 关于xshell突然就连不上虚拟机的解决方法(之前可以正常连接)
热门文章
- Kubernetes 的网络原理 (五)---CNI网络模型
- 【C++】实现自旋锁互斥(TAS 算法和 CAS 算法)
- linux 命令 查询丢包率,linux测试丢包率的命令 linux查看丢包率命令
- linux pbs 安装包,【Linux】单计算机安装PBS系统(Torque)与运维
- ibm是被联想收购了吗_联想集团收购IBM背后的苦
- 详细Ubuntu系统修改默认软件下载源
- 我的物联网大学【第五章】:沉默不会爆发,沉默一定会灭亡!
- w10计算机名重新启动此计算机后,win10电脑关机后自动重启怎么回事?原因与解决办法...
- HNOI 2015 落忆枫音 题解
- elasticsearch报错org.elasticsearch.discovery.MasterNotDiscoveredException: null