智能卡接口的编程
- 格式:doc
- 大小:66.50 KB
- 文档页数:7
pkcs11 卡内密钥运算-回复PKCS11是一种应用程序接口(API),用于访问安全模块(如智能卡或USB令牌)中的密钥和其他密码学功能。
PKCS11卡内密钥运算是利用PKCS11接口对于智能卡或USB令牌内部密钥进行计算操作的一种方法。
本文将一步一步介绍PKCS11卡内密钥运算的原理和步骤。
第一步,初始化PKCS11库。
运行PKCS11卡内密钥运算之前,需要先初始化PKCS11库。
这可以通过调用PKCS11提供的初始化函数来实现。
初始化函数会加载PKCS11库并准备好后续的操作。
第二步,登录到智能卡或USB令牌。
登录即是向智能卡或USB令牌进行身份验证,确保用户具备执行卡内密钥运算的权限。
登录函数需要提供访问智能卡或USB令牌的用户PIN码或其他安全凭证。
登录成功后,用户可以进行卡内密钥运算操作。
第三步,查找密钥对象。
在进行卡内密钥运算之前,需要先获得待使用的密钥的句柄。
通过PKCS11提供的函数可以根据密钥标签、密钥类型等相关信息进行搜索,并获得对应的密钥句柄。
密钥句柄是密钥在智能卡或USB令牌中的唯一标识符。
第四步,开启卡内密钥运算会话。
为了执行卡内密钥运算,需要创建一个会话对象。
会话对象可以通过调用PKCS11提供的函数来创建。
在创建会话对象时,需要指定会话类型、读写权限等参数。
第五步,引入卡内密钥到会话。
在会话中引入卡内密钥是指将步骤三中获得的密钥句柄加载到会话中,以供后续的卡内密钥运算操作。
通过调用PKCS11提供的函数,可以将密钥句柄加载到会话中。
第六步,进行卡内密钥运算。
卡内密钥运算可以是对称加密算法(如AES、DES等)的加密或解密操作,也可以是非对称加密算法(如RSA、椭圆曲线加密等)的签名或验证操作。
根据具体的密钥类型和运算需求,调用PKCS11提供的函数执行卡内密钥运算。
运算的输入和输出数据都是通过会话对象进行传递。
第七步,关闭会话和登出。
在卡内密钥运算完成后,应关闭会话对象,并登出智能卡或USB令牌。
第二部分行业间交换命令目录1范围 (3)2参考文件 (3)3定义 (3)4缩略语和记号 (5)5基本组织结构 (5)5.2 卡的安全体系结构 (9)5.3 APDU报文结构 (11)5.4 命令首标、数据字段和响应尾标用的编码约定 (13)5.5 逻辑信道 (18)5.6 安全报文交换 (19)6基本的行业间命令 (23)6.1 READ BINARY命令 (23)6.2 WRITE BINARY命令 (24)6.3 UPDATE BINARY命令 (25)6.4 ERASE BINARY命令 (26)6.5 READ RECORD命令 (27)6.6 WRITE RECORD命令 (29)6.7 APPEND RECORD命令 (31)6.8 UPDATE RECORD命令 (32)6.9 GET DATA 命令 (33)6.10 PUT DATA 命令 (35)6.11 SELECT FILE 命令 (36)6.12 VERIFY 命令 (38)6.13 INTERNAL AUTHENTICATE 命令 (39)6.14 EXTERNAL AUTHENTICATE 命令 (40)6.15 GET CHALLENGE命令 (42)6.16 MANAGE CHANNEL命令 (42)7面向传输的行业间命令 (43)7.1 GET RESPONSE 命令 (43)7.2 ENVELOPE 命令 (44)8历史字节 (45)9与应用无关的卡服务 (49)通过T=0传输APDU报文 (52)通过T=1传输APDU报文 (57)1 范围本规范规定了:——由接口设备至卡以及相反方向所发送的报文、命令和响应的内容;——在复位应答期间卡所发送的历史字节的结构及内容;——当处理交换用的行业间命令时,在接口处所看到的文件和数据的结构;——访问卡内文件和数据的方法;——定义访问卡内文件和数据的权利的安全体系结构;——安全报文交换的方法;——访问卡所处理算法的方法。
《智能卡技术及应用》实验指导书2015.05实验一存储器卡读写实验一.实验目的I2串行总线的工作原理;1.了解C2.通过实验了解存储器卡存、取数据的过程。
二.实验器材1.KEIL软件;2.PROTEUS仿真软件。
三.实验内容往24C04芯片中写入一个数据(如“129”),然后再从24C04芯片中读出刚才的数据并把它显示在数码管上。
四.实验步骤1.硬件电路仿真使用Proteus软件画出如图1所示的电路图,要求:使用两个按钮来分别模拟读卡和拔卡(清除数据)的过程,用一个发光二极管来模拟卡座上电的过程。
(注:电路图画好后,给存储器24C04导入24C04.bin文件,给51单片机导入hex文件)本次实验用到的元器件名称如下:24C04A,80C51,BUTTON,CAP,CAP-ELEC,CRYSTAL,LED-GREEN,NPN,RESPACK-8,SWITCH,7SEG-MPX4-CA-BLUE图 1 硬件电路图2.软件编写程序编写的思路见图2,请同学们自行完成。
图2 程序流程图3.实验结果刚开始运行时,单片机没有读取任何数据,此时数码管显示数字为0;当“读卡”按钮按下时,此时发光二极管亮,数码管显示预先存入24C04芯片的数值;当“清除”按钮按下时,此时此时发光二极管灭,数码管数值清零。
实验二基本对话框编程实验一、实验目的1、练习VC环境下,工程的创建、编译、调试方法2、掌握基本对话框编程的方法3、理解Windows程序的运行原理二、实验要求编写基本对话框实现计算器的功能,具体可实现两个数的加、减、乘、除等运算。
参考界面如图2所示。
图2 计算器对话框界面三、实验步骤1、建立基于MFC的基本对话框工程;2、删除、添加相关控件,设计软件界面;3、设定控件ID并关联变量;4、向工程添加实现计算器功能的类模版;5、添加消息处理函数;6、编译并运行。
四、实验结果能够正常编译运行的计算器。
实验三非接触式逻辑加密卡(M1卡)读写控制实验(一)一、实验目的1、掌握M!卡的存储结构;2、熟悉数据块操作和值块操作的方法(值块的数据格式);3、掌握第0扇区第一块(即厂商块)的数据格式;4、掌握各扇区密码操作和存取控制原理和方法。
USBCAN-I/II 智能CAN接口卡用户手册V1.2广州周立功单片机发展有限公司2003年11月26日目录一、版权信息-------------------------------------------------------1二、功能特点-------------------------------------------------------1三、硬件参数-------------------------------------------------------13.1外观-------------------------------------------------------13.2参数-------------------------------------------------------13.3软件支持---------------------------------------------------13.4产品清单---------------------------------------------------23.5典型应用---------------------------------------------------2四、设备安装-------------------------------------------------------24.1供电模式---------------------------------------------------24.2 DB9插座引脚----------------------------------------------24.3信号指示灯-------------------------------------------------34.4系统连接---------------------------------------------------44.5驱动程序安装----------------------------------------------4五、常见问题-------------------------------------------------------7六、产品服务-------------------------------------------------------86.1 保修期----------------------------------------------------86.2 保修政策包括的范围---------------------------------------86.3 保修政策不包括的范围-------------------------------------86.4 软件升级--------------------------------------------------86.5 技术支持--------------------------------------------------8附录A、ZLGCAN产品简介-------------------------------------------9 附录B、CAN2.0B协议帧格式-------------------------------------------11 附录C、SJA1000标准波特率----------------------------------------12一、版权信息USBCAN-I/II智能CAN接口卡及相关软件均属广州市周立功单片机发展有限公司所有,其产权受国家法律绝对保护,未经本公司授权,其他公司、单位、代理商及个人不得非法使用和拷贝,否则将受到国家法律的严厉制裁。
pcsc协议中文版篇一:PCSC规范介绍PC/SC规范介绍1.简介:PC/SC规范由微软公司与世界其它著名的智能卡厂商组成的PC/SC工作组提出的。
PC/SC规范是一个基于WINDOWS平台的一个标准用户接口(AP1),提供了一个从个人电脑(Personal Computer)到智能卡(SmartCard)的整合环境,虽然到目前为止,WONDOWS是唯一支持PC/SC标准的操作系统平台,但由于WINDOWS的影响力,PC/SC规范也为智能卡业界所接收。
到目前为止,PC/SC规范的最新版本是PC/SC Specifications 1.0。
PC/SC规范建立在工业标准-ISO7816和EMV标准的基础上,但它对底层的设备接口和独立于设备的应用API接口(例如用来允许多个应用共享使用系统同一张智能卡的资源管理器)做了更详尽的补充。
它的提出主要是为了达到以下目标:遵从现在ICC和PC的标准并在适当的地方予在扩充跨平台的可操作性,使该规范可在多种硬件和软件平台上实现应用程序可以采用不同厂商提供的产品(独立于厂商)建立应用级的智能卡服务接口,推广ICC在PC上的应用,并促成PC采用ICC作主标准设备。
2.PC/SC体系的主要组成:PC/SC体系由三个主要部件组成,分别规定的操作系统厂商、读写器(IFD)厂商、智能卡(ICC)厂商的职责。
(即读写器)控制器是由IFD厂商提供的可安装部件。
ii. Resource manager(资源管理器)使用Win32API函数实现,是由操作系统厂商提供的系统级部件。
iii. Service Providers(服务提供者),服务程序是由厂商提供的可安装部件,用于提供访问特殊服务的手段,其使用的是基本COM的界面方式。
3.CRW系列IC读卡器PC/SC驱程序的安装支持PC/SC规范的CRW系列IC读卡器包装盒有一个PC/SC驱动程序安装软盘。
运行安装程序SETUP.EXE 驱动程序会自动安装到系统中,就可以按PC/SC规范使用CRW系列读卡器。
VC中PC/SC智能卡接口的编程(一)2010-05-06 15:35转载自hxw1984最终编辑hxw1984[摘要]本文介绍了如何在VC中通过PC/SC接口实现对智能卡读写器的操作,并给出了详细的例子代码。
[关键词] 智能卡、PC/SC、智能卡读写器1 引言完整的智能卡应用系统由后台服务程序、主机或终端应用程序和智能卡等组成,如图1所示。
其中,后台服务程序提供了支持智能卡的服务。
例如,在一个电子付款系统中,后台服务程序可以提供到信用卡和帐户信息的访问;主机或终端应用程序一般存在于台式机或者终端、电子付款终端、手机或者一个安全子系统中,终端应用程序要处理用户、智能卡和后台服务程序之间的通讯;智能卡则存储用户的一些信息。
终端应用程序需要通过读卡器来访问智能卡,在一个系统中,通常存在多家厂商提供的读卡器,因此需要一个统一的读卡器设备驱动接口。
随着智能卡的广泛应用,为解决计算机与各种读卡器之间的互操作性问题,人们提出了PC/SC(Personal Computer/Smart Card)规范,PC/SC规范作为读卡器和卡与计算机之间有一个标准接口,实现不同生产商的卡和读卡器之间的互操作性,其独立于设备的API使得应用程序开发人员不必考虑当前实现形式和将来实现形式之间的差异,并避免了由于基本硬件改变而引起的应用程序变更,从而降低了软件开发成本。
Microsoft在其Platform SDK中实现了PC/SC,作为连接智能卡读卡器与计算机的一个标准模型,提供了独立于设备的API,并与Windows平台集成。
因此,我们可以用PC/SC接口来访问智能卡。
2 PC/SC概述PC/SC接口包含30多个以Scard为前缀的函数,所有函数的原型都在winscard.h 中声明,应用程序需要包含winscard.lib,所有函数的正常返回值都是SCARD_S_SUCCESS。
在这30多个函数中,常用的函数只有几个,与智能卡的访问流程(图2)对应,下面将详细介绍这些常用函数。
3 PC/SC的使用3.1建立资源管理器的上下文函数ScardEstablishContext()用于建立将在其中进行设备数据库操作的资源管理器上下文(范围)。
函数原型:LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext);各个参数的含义:(1)dwScope:输入类型;表示资源管理器上下文范围,取值为:SCARD_SCOPE_USER(在用户域中完成设备数据库操作)、SCARD_SCOPE_SYSTEM(在系统域中完成设备数据库操作)。
要求应用程序具有相应的操作权限。
(2)pvReserved1:输入类型;保留,必须为NULL。
(3)pvReserved2:输入类型;保留,必须为NULL。
(4)phContext:输出类型;建立的资源管理器上下文的句柄。
下面是建立资源管理器上下文的代码:SCARDCONTEXT hSC;LONG lReturn;lReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);if ( lReturn!=SCARD_S_SUCCESS )printf("Failed SCardEstablishContext\n");3.2 获得系统中安装的读卡器列表函数ScardListReaders()可以列出系统中安装的读卡器的名字。
函数原型:LONG SCardListReaders(SCARDCONTEXT hContext, LPCTSTR mszGroups, LPTSTR mszReaders, LPDWORD pcchReaders);各个参数的含义:(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄,不能为NULL。
(2)mszGroups:输入类型;读卡器组名,为NULL时,表示列出所有读卡器。
(3)mszReaders:输出类型;系统中安装的读卡器的名字,各个名字之间用’\0’分隔,最后一个名字后面为两个连续的’\0’。
(4)pcchReaders:输入输出类型;mszReaders的长度。
系统中可能安装多个读卡器,因此,需要保存各个读卡器的名字,以便以后与需要的读卡器建立连接。
下面是获得系统中安装的读卡器列表的代码:char mszReaders[1024];LPTSTR pReader, pReaderName[2];DWORD dwLen=sizeof(mzsReaders);int nReaders=0;lReturn = SCardListReaders(hSC, NULL, (LPTSTR)mszReaders, &dwLen);if ( lReturn==SCARD_S_SUCCESS ){pReader = (LPTSTR)pmszReaders;while (*pReader !='\0' ){if ( nReaders<2 ) //使用系统中前2个读卡器pReaderName[nReaders++]=pReader;printf("Reader: %S\n", pReader );//下一个读卡器名pReader = pReader + strlen(pReader) + 1;}}VC中PC/SC智能卡接口的编程(二)2010-05-06 15:36转载自hxw1984最终编辑hxw19843.3 与读卡器(智能卡)连接函数ScardConnect()在应用程序与读卡器上的智能卡之间建立一个连接。
函数原型:LONG SCardConnect(SCARDCONTEXT hContext, LPCTSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol);各个参数的含义:(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。
(2)szReader:输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。
(3)dwShareMode:输入类型;应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
(4)dwPreferredProtocols:输入类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
(5)phCard:输出类型;与智能卡连接的句柄。
(6)PdwActiveProtocol:输出类型;实际使用的协议。
下面是与智能卡建立连接的代码:SCARDHANDLE hCardHandle[2];DWORD dwAP;lReturn = SCardConnect( hContext, pReaderName[0],SCARD_SHARE_SHARED,SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCardHandle[0], &dwAP ); if ( lReturn!=SCARD_S_SUCCESS ){printf("Failed SCardConnect\n");exit(1);}与智能卡建立连接后,就可以向智能卡发送指令,与其交换数据了。
3.4 向智能卡发送指令函数ScardTransmit()向智能卡发送指令,并接受返回的数据。
函数原型:LONG SCardTransmit(SCARDHANDLE hCard,LPCSCARD_I0_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength);各个参数的含义:(1)hCard:输入类型;与智能卡连接的句柄。
(2)pioSendPci:输入类型;指令的协议头结构的指针,由SCARD_IO_REQUEST结构定义。
后面是使用的协议的协议控制信息。
一般使用系统定义的结构,SCARD_PCI_T0(T=0协议)、SCARD_PCI_T1(T=1协议)、SCARD_PCI_RAW(原始协议)。
(3)pbSendBuffer:输入类型;要发送到智能卡的数据的指针。
(4)cbSendLength:输入类型;pbSendBuffer的字节数目。
(5)pioRecvPci:输入输出类型;指令协议头结构的指针,后面是使用的协议的协议控制信息,如果不返回协议控制信息,可以为NULL。
(6)pbRecvBuffer:输入输出类型;从智能卡返回的数据的指针。
(7)pcbRecvLength:输入输出类型;pbRecvBuffer的大小和实际大小。
对于T=0协议,收发缓冲的用法如下:(a)向智能卡发送数据:要向智能卡发送n>0字节数据时,pbSendBuffer 前4字节分别为T=0的CLA、INS、P1、P2,第5字节是n,随后是n字节的数据;cbSendLength值为n+5(4字节头+1字节Lc+n字节数据)。
PbRecvBuffer将接收SW1、SW2状态码;pcbRecvLength值在调用时至少为2,返回后为2。
BYTE recvBuffer[260];int sendSize, recvSize;BTYE sw1, sw2;BYTE select_mf[]={0xC0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00};sendSize=7;recvSize=sizeof(recvBuffer);lReturn = SCardTransmit(hCardHandle[0], SCARD_PCI_T0, select_mf, sendSize, NULL, recvBuffer, &recvSize);if ( lReturn != SCARD_S_SUCCESS ){printf("Failed SCardTransmit\n");exit(1);}//返回的数据,recvSize=2sw1=recvBuffer[recvSize-2];sw2=recvBuffer[recvSize-1];(b)从智能卡接收数据:为从智能卡接收n>0字节数据,pbSendBuffer 前4字节分别为T=0的CLA、INS、P1、P2,第5字节是n(即Le),如果从智能卡接收256字节,则第5字节为0;cbSendLength值为5(4字节头+1字节Le)。