在阅读IC卡读写SDK调用说明之前,我们需要补充几个知识点。
一、对MifareOne系列卡的认识
1、ISOTYPEA标准的MifareOne系列卡(含S50卡),容量为1K字节。MifareOne卡的内部存储结构分为16个扇区,从第0区到第15区,每个扇区有独立的密码和权限控制字,可作为独立的电子钱包,每个扇区有4个块,序号为第0块、第1块、第2块、第3块,每块16个字节,第3块是卡的密码和权限控制字专用块,禁止在此存放数据。第0块、第1块、第2块可随意存放数据。但第0区的第0块已被固化了IC卡出厂信息,此块只能读出信息,不可更改。
每张卡都有一个全球统一的4个字节的序列号。许多公司销售的读卡器只有读取卡序列号的功能,也能用于一般的考勤系统。但这类读卡器跟本公司的读写器有着本质的不同,本公司的读写器不仅能读序列号,而且还有服务于IC卡所有用途的功能,比如选中卡、认证、读卡、写卡、改密码、休眠卡能功能。
2、ISOTYPEA标准的S70卡,容量为4K字节。共40个扇区,也就是40个独立电子钱包,其中0~31扇区为普通区,区定义与以上的S50卡相同。32~39区为大数据区,每区有16个块,第15块是卡的密码和权限控制字专用块,第0~14块为数据块,每块16个字节,共有个字节可用。
二、对非接触式CPU卡的认识
非接触式CPU卡芯片内部都有双重安全机制,第一重是芯片本身集成的加密算法模块,芯片设计公司通常都会将经实践检验最安全的几种加密算法集成入芯片,比较常见的安全算法有RSA,3-DES等。国内芯片设计公司还会引入国密算法(SSF33,SCB2,SM2,SM3等)来加强芯片的安全性。国密算法是不对外公开的,因此国密算法一般比其他公开算法的加密算法具有更高的安全性。第二重保护则是CPU卡芯片特有的COS(CardOperationSystem)系统,COS可以为芯片设立多个相互独立的密码,密钥以目录为单位存放,每个目录下的密钥相互之间独立,并且有防火墙功能(不同目录下密钥不会互相影响)。同时COS内部还设立密码最大重试次数以防止恶意攻击。由此可见,非接触式CPU卡比非接触式逻辑加密卡具有更高的安全性。
关于非接触式CPU卡和非接触式IC卡的区别可以阅读这里“非接触式CPU卡和非接触式IC卡的区别”
IC卡读写SDK调用
三、简化函数说明
Request:对应调用LotusCardRequest函数
Anticollission:对应调用LotusCardAnticoll函数
Select:对应调用LotusCardSelect函数
Authentication:对应调用LotusCardAuthentication函数
Read:对应调用LotusCardRead函数
Write:对应调用LotusCardWrite函数
SDK提供LotusCardLoadKey函数用于装载密码到读卡器,只能写入,不能读取,这个API可以单独使用,无需卡片,如果卡片密码有变化,需要调LotusCardLoadKey重新装载密码。密码装载到读卡器后,直接调用LotusCardAuthentication认证即可,发布到用户端的程序无需携带密码。
针对Request、Anticollission、Select三个动作,每次读写MifareOne系列卡操作都会执行,SDK提供了一个API封装上述3个动作相关函数:LotusCardGetCardNo,使用LotusCardGetCardNo函数即可一次性完成上述动作,简化API调用。
四、打开设备
参数strDeviceName:为字符长度为0使用USB通道,否则使用串口通道
参数nVID\nPID参数如果为0,动态库使用内部定义值,原则上建议使用0,除非范例有明确赋值。
特别声明:使用外部读写接口优先,参见回调函数
/**
*打开设备
*
*
paramstrDeviceName
*串口设备名称
*
paramnVID
*USB设备VID
*
paramnPID
*USB设备PID
*
paramnUsbDeviceIndex
*USB设备索引
*
paramunRecvTimeOut
*接收超时
*
parambUseExendReadWrite
*是否使用外部读写通道如果没有设备写权限时,可以使用外部USB或串口进行通讯,
*需要改造callBackProcess中相关代码完成读写工作目前范例提供USB操作
*
return设备句柄
*/
publicnativeintOpenDevice(StringstrDeviceName,intnVID,intnPID,
intnUsbDeviceIndex,intunRecvTimeOut,booleanbUseExendReadWrite);
五、关闭设备:CloseDevice
设备句柄nDeviceHandle为OpenDevice返回值。
/**关闭设备
*
paramnDeviceHandle
*设备句柄
*/
publicnativevoidCloseDevice(longnDeviceHandle);
六、读操作:Read
设备句柄nDeviceHandle为OpenDevice返回值。
特别说明:如果是NTAG系列,nAddress参数为PAGE索引,每次可以读4个PAGE,每个PAGE有4字节,共16字节。
S50:
nAddress=扇区索引(0~15)*4+块(0~3);
如读取0扇区2块,nAddress=0*4+2=2;
如读取5扇区2块,nAddress=5*4+2=22;
S70:
0~31扇区计算方式同S50;
nAddress=扇区索引(0~31)*4+块(0~3);
如读取0扇区2块,nAddress=0*4+2=2;
如读取5扇区2块,nAddress=5*4+2=22;
扇区32~39每个扇区16个块nAddress=32*4+(扇区索引-32)*16+块(0~15);
如读取32扇区2块,nAddress=32*4+(32-32)*16+2=;
如读取37扇区12块,nAddress=32*4+(37-32)*16+12=;
/**
*读指定地址数据
*
paramnDeviceHandle
*设备句柄
*
paramnAddress
*块地址
*
paramtLotusCardParam
*结果值(读写缓冲)
*
returntrue=成功
*/
publicnativebooleanRead(longnDeviceHandle,intnAddress,
LotusCardParamtLotusCardParam);
七写操作:Write
设备句柄nDeviceHandle为OpenDevice返回值。
特别说明:如果是NTAG系列,nAddress参数为PAGE索引,每个PAGE长度为4字节,不要写多了。M1为块索引,每块16字节。
S50:
nAddress=扇区索引(0~15)*4+块(0~3);
如读取0扇区2块,nAddress=0*4+2=2;
如读取5扇区2块,nAddress=5*4+2=22;
S70:
0~31扇区计算方式同S50;
nAddress=扇区索引(0~31)*4+块(0~3);
如读取0扇区2块,nAddress=0*4+2=2;
如读取5扇区2块,nAddress=5*4+2=22;
扇区32~39每个扇区16个块nAddress=32*4+(扇区索引-32)*16+块(0~15);
如读取32扇区2块,nAddress=32*4+(32-32)*16+2=;
如读取37扇区12块,nAddress=32*4+(37-32)*16+12=;
/**
*写指定地址数据
*
*
paramnDeviceHandle
*设备句柄
*
paramnAddress
*块地址
*
paramtLotusCardParam
*参数(读写缓冲)
*
returntrue=成功
*/
publicnativebooleanWrite(longnDeviceHandle,intnAddress,
LotusCardParamtLotusCardParam);
以上内容是关于诺塔斯IC卡读写器SDK调用的部分说明,由于篇幅有限,无法完整讲解,望读者海涵