一种动态创建并使用功能对象的方法转让专利

申请号 : CN201310493406.3

文献号 : CN103544011B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陆舟于华章

申请人 : 飞天诚信科技股份有限公司

摘要 :

本发明公开了一种动态创建并使用功能对象的方法,涉及通信领域。该方法包括:当中间件监控到有卡片插入时,获取该卡片所支持的算法数据,在内存中构建生成一张与所述卡片对应的算法映射表,中间件根据获取的所述算法数据创建功能对象,并将创建好的功能对象更新到内存中与当前卡片对应的算法映射表中,即将算法映射表中的软算法对象更新为硬算法对象;当中间件被上层应用程序调用访问卡片时,中间件从当前卡片对应的算法映射表中获取算法对象,根据密钥对象和算法对象对待处理数据执行相应操作;当中间件监控到所述卡片拔出时,中间件自动销毁内存中与所述卡片对应的算法映射表。

权利要求 :

1.一种动态创建并使用功能对象的方法,其特征是:

当中间件监控到有卡片插入时,执行步骤S1-S5,

步骤S1:中间件接收卡片应答信息;

步骤S2:中间件判断卡片的类型是否为所支持的类型,是则执行步骤S3,否则结束操作;

步骤S3:中间件向卡片下发查询所支持的算法数据指令并接收卡片返回的应答信息;

步骤S4:中间件从所述应答信息中获取卡片所支持的算法数据,并在内存中构建生成一张与所述卡片对应的算法映射表;

所述构建生成的所述算法映射表中包含的是软算法和软算法对象,所述软算法和所述软算法对象一一对应;

步骤S5:中间件根据获取的所述算法数据创建功能对象,并用创建的所述功能对象更新所述算法映射表中的软算法对象;

执行步骤S5之后所述算法映射表中包含的是软算法和硬算法对象,所述软算法和所述硬算法对象一一对应;

当中间件被上层应用程序调用访问所述卡片时,执行步骤S6-S10,步骤S6:中间件接收到上层应用程序要执行的具体操作指令,中间件根据所述具体操作指令得到预设算法、密钥对象和待处理数据;

步骤S7:中间件从内存中获取一张与所述卡片匹配的算法映射表;

步骤S8:中间件在所述算法映射表中查找是否存在与所述预设算法匹配的软算法,若存在则执行步骤S9,否则向上层应用程序返回错误;

步骤S9:中间件获取所述算法映射表中与所述软算法对应的算法对象;

步骤S10:中间件根据所述密钥对象和所述算法对象对所述待处理数据执行相应操作;

当中间件监控到所述卡片拔出时,自动销毁内存中与所述卡片对应的所述算法映射表。

2.如权利要求1所述的方法,其特征是:所述步骤S2具体为,第一步:中间件将接收到的所述卡片应答信息的长度与内部定义的所有产品应答信息分别进行长度匹配,如果全部不相等,则所述卡片为中间件所不支持的类型,如果存在相等则记录长度匹配的产品应答信息并继续下一步;

第二步:中间件将接收到的所述卡片应答信息的第12、13字节上的数据分别与0x00做与运算,其余字节数据分别与0xFF做与运算,并用与运算结果替换原所述卡片应答信息的相应字节上的数据,得到运算后的卡片应答信息;

第三步:中间件将记录的所述长度匹配的产品应答信息与所述运算后的卡片应答信息做比较,如果不相等,则所述卡片为中间件所不支持的类型,如果相等,则所述卡片为中间件所支持的类型。

3.如权利要求1所述的方法,其特征是:所述步骤S3还包括,所述中间件判断接收到的所述应答信息中是否包含预设状态码字节,是则执行步骤S4,否则结束操作。

4.如权利要求1所述的方法,其特征是:所述算法数据包含有算法的数目以及多组算法的信息,所述算法的信息包括算法名称、密钥最小长度、密钥最大长度和算法标志位。

5.如权利要求4所述的方法,其特征是:所述步骤S4中所述中间件从所述应答信息中获取卡片所支持的算法数据具体为:中间件根据所述应答信息的前两个字节得到卡片所支持的算法的数目,根据预设结构将所述应答信息的其余字节分解成个数等于卡片所支持的算法的数目个单元结构体,中间件对每个单元结构体进行解析,获取多组算法的信息,所述预设结构为长度为12个字节的数据,其中前4个字节用于表示算法名称,第5和第6个字节用于表示密钥最小长度、第7和第

8个字节用于表示密钥最大长度,第9到第12个字节用于表示算法标志位。

6.如权利要求1所述的方法,其特征是:所述步骤S5中所述中间件根据获取的所述算法数据创建功能对象具体为,中间件根据所述算法数据获取算法类,所述算法类包含有指向算法类的构造函数的指针,中间件调用所述构造函数的指针创建功能对象。

7.如权利要求1所述的方法,其特征是:

所述中间件通过枚举操作系统中的读卡器监控是否有卡片插入,

当中间件监控到有卡片插入时,且所述卡片是中间件所支持的类型时,中间件记录枚举到的与所述卡片对应的读卡器,当中间件监控到所述卡片拔出时,将产生拔出事件的读卡器和已做记录的所有读卡器逐一进行比较,如果比较成功,则自动销毁内存中与所述卡片对应的所述算法映射表,如果比较不成功则不作处理。

8.如权利要求1所述的方法,其特征是:所述具体操作指令为加解密操作指令或签名操作指令。

9.如权利要求8所述的方法,其特征是:当所述具体操作指令为加解密操作指令时,所述算法对象包含实现加解密的操作方式,当所述具体操作指令为签名操作指令时,所述算法对象包含实现签名的操作方式。

10.如权利要求9所述的方法,其特征是:当所述具体操作指令为加解密操作指令,且所述算法对象是软算法对象时,所述软算法对象包含调用openssl接口实现加解密的操作方式;当所述具体操作指令为加解密操作指令,且所述算法对象是硬算法对象时,所述硬算法对象包含向卡片发送APDU指令实现加解密的操作方式。

说明书 :

一种动态创建并使用功能对象的方法

技术领域

[0001] 本发明涉及通信领域,具体涉及一种中间件动态创建并使用功能对象的方法。

背景技术

[0002] The Public-Key Cryptography Standards(PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。PKCS#11称为Cyptoki,定义了应用程序与各种各样的便携式密码设备(基于智能卡、PCMCIA卡以及智能软盘)间的一种接口。
[0003] CryptoAPI(一个应用程序编程接口)就是提供开发者在Windows下使用PKI的编程接口。CryptoAPI提供了很多函数,包括编码、解码、加密、解密、哈希、数字证书、证书管理和证书存储等功能。对于加密和解密,CryptoAPI同时提供基于会话密钥和公钥/私钥对的方法。
[0004] 现有技术中,为了保证设备与应用程序之间的通信安全,应用程序通过中间件访问设备对通信数据进行加解密或签名等操作,中间件中的算法和密钥是预先绑定好的,如果设备内置算法有改动,比如增加了一种硬算法,中间件不能灵活的做出调整,这样中间件每次访问设备时只能直接调用预先绑定好的算法和密钥执行相应操作,这种方法的缺陷是密钥仅对应一种算法造成资源的浪费。

发明内容

[0005] 本发明为解决现有技术中存在的上述问题,提出了一种动态创建并使用功能对象的方法。
[0006] 本发明采取的技术方案是:一种动态创建并使用功能对象的方法,包括:
[0007] 当中间件监控到有卡片插入时,执行步骤S1-S5,
[0008] 步骤S1:中间件接收卡片应答信息;
[0009] 步骤S2:中间件判断卡片的类型是否为所支持的类型,是则执行步骤S3,否则结束操作;
[0010] 步骤S3:中间件向卡片下发查询所支持的算法数据指令并接收卡片返回的应答信息;
[0011] 步骤S4:中间件从所述应答信息中获取卡片所支持的算法数据,并在内存中构建生成一张与所述卡片对应的算法映射表;
[0012] 构建生成的所述算法映射表中包含的是软算法和软算法对象,所述软算法和所述软算法对象一一对应;
[0013] 步骤S5:中间件根据获取的所述算法数据创建功能对象,并用创建的所述功能对象更新所述算法映射表中的软算法对象;
[0014] 执行步骤S5之后所述算法映射表中包含的是软算法和硬算法对象,所述软算法和所述硬算法对象一一对应;
[0015] 当中间件被上层应用程序调用访问所述卡片时,执行步骤S6-S10,
[0016] 步骤S6:中间件接收到上层应用程序要执行的具体操作指令,中间件根据所述具体操作指令得到预设算法、密钥对象和待处理数据;
[0017] 步骤S7:中间件从内存中获取一张与所述卡片匹配的算法映射表;
[0018] 步骤S8:中间件在所述算法映射表中查找是否存在与所述预设算法匹配的软算法,若存在则执行步骤S9,否则向上层应用程序返回错误;
[0019] 步骤S9:中间件获取所述算法映射表中与所述软算法对应的算法对象;
[0020] 步骤S10:中间件根据所述密钥对象和所述算法对象对所述待处理数据执行相应操作;
[0021] 当中间件监控到所述卡片拔出时,自动销毁内存中与所述卡片对应的所述算法映射表。
[0022] 上述步骤S2具体为,
[0023] 第一步:中间件将接收到的所述卡片应答信息的长度与内部定义的所有产品应答信息分别进行长度匹配,如果全部不相等,则所述卡片为中间件所不支持的类型,如果存在相等则记录长度匹配的产品应答信息并继续下一步;
[0024] 第二步:中间件将接收到的所述卡片应答信息的第12、13字节上的数据分别与0x00做与运算,其余字节数据分别与0xFF做与运算,并用与运算结果替换原所述卡片应答信息的相应字节上的数据,得到运算后的卡片应答信息;
[0025] 第三步:中间件将记录的所述长度匹配的产品应答信息与所述运算后的卡片应答信息做比较,如果不相等,则所述卡片为中间件所不支持的类型,如果相等,则所述卡片为中间件所支持的类型。
[0026] 上述步骤S3还包括,中间件判断接收到的所述应答信息中是否包含预设状态码字节,是则执行步骤S4,否则结束操作。
[0027] 所述算法数据包含有算法的数目以及多组算法的信息,所述算法的信息包括算法名称、密钥最小长度、密钥最大长度和算法标志位。
[0028] 所述步骤S4中所述中间件从所述应答信息中获取卡片所支持的算法数据具体为:
[0029] 中间件根据所述应答信息的前两个字节得到卡片所支持的算法的数目,根据预设结构将所述应答信息的其余字节分解成个数等于卡片所支持的算法的数目个单元结构体,中间件对每个单元结构体进行解析,获取多组算法的信息,所述预设结构为长度为12个字节的数据,其中前4个字节用于表示算法名称,第5和第6个字节用于表示密钥最小长度、第7和第8个字节用于表示密钥最大长度,第9到第12个字节用于表示算法标志位。
[0030] 所述步骤S5中所述中间件根据获取的所述算法数据创建功能对象具体为,中间件根据所述算法数据获取算法类,所述算法类包含有指向算法类的构造函数的指针,中间件调用所述构造函数的指针创建功能对象。
[0031] 本发明中具体的,所述中间件通过枚举操作系统中的读卡器监控是否有卡片插入,当中间件监控到有卡片插入时,且所述卡片是中间件所支持的类型时,中间件记录枚举到的与所述卡片对应的读卡器,当中间件监控到所述卡片拔出时,将产生拔出事件的读卡器和已做记录的所有读卡器逐一进行比较,如果比较成功,则自动销毁内存中与所述卡片对应的所述算法映射表,如果比较不成功则不作处理。
[0032] 上述具体操作指令为加解密操作指令或签名操作指令。当所述具体操作指令为加解密操作指令时,所述算法对象包含实现加解密的操作方式,当所述具体操作指令为签名操作指令时,所述算法对象包含实现签名的操作方式。
[0033] 当所述具体操作指令为加解密操作指令,且所述算法对象是软算法对象时,所述软算法对象包含调用openssl接口实现加解密的操作方式;当所述具体操作指令为加解密操作指令,且所述算法对象是硬算法对象时,所述硬算法对象包含向卡片发送APDU指令实现加解密的操作方式。
[0034] 本发明的有益效果是:通过采用本发明提出的方法,可以实现中间件为当前要操作的硬件设备(例如卡片)动态创建算法映设表,当中间件访问硬件设备做具体操作应用时从动态创建的算法映设表中获取对应算法对象,与传统的预置一张绑定好的算法映射表,每次访问设备时只能直接调用预先绑定好的算法相比,本发明可以达到灵活应用的效果。

附图说明

[0035] 图1是实施例1中的中间件动态创建并使用功能对象的方法流程图;
[0036] 图2是实施例1中的中间件被上层应用程序调用访问卡片做具体操作时的方法流程图。

具体实施方式

[0037] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式做进一步详细描述。
[0038] 实施例1
[0039] 本实施例提出的一种动态创建并使用功能对象的方法,如图1所示,包括以下步骤:
[0040] 步骤101:中间件监控到有卡片插入,接收卡片应答信息;
[0041] 具体的,中间件不停枚举操作系统中的读卡器(Reader),中间件会向读卡器(Reader)发送获取卡片ATR指令,当有卡片插入时,读卡器将卡片应答信息(ATR)返回给中间件。
[0042] 步骤102:中间件判断卡片的类型是否为所支持的类型,是则执行下一步,否则结束操作;
[0043] 具体的,中间件根据接收到的卡片ATR来判断卡片的类型,一般的卡片ATR是由若干字节组成,其中有部分字节是可变的。
[0044] 本实施例中,中间件判断卡片的类型是否为所支持的类型具体包括:
[0045] 步骤102-1:中间件将获取的卡片ATR的长度与内部定义的所有产品ATR长度做比较,如果不相等,则不识别当前的卡片,如果相等则记录比较得到的长度匹配的产品ATR并继续下一步;
[0046] 步骤102-2:中间件将获取的卡片ATR的第12、13字节上的数据分别与0x00做与运算,其余字节数据分别与0xFF做与运算,并用与运算结果替换原卡片ATR的相应字节上的数据,得到运算后的卡片ATR;
[0047] 例如,中间件获取的卡片ATR为:
[0048] 0x3B,0x9F,0x95,0x81,0x31,0xFE,0x9F,0x00,0x66,0x46,0x53,0x05,0x10,0x00,0x11,0x71,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,其中的第12、13字节代表版本号,则将第12、13字节0x05,0x10分别和0x00做与运算,其余字节分别和0xFF做与运算,得到运算后的卡片ATR为:0x3B,0x9F,0x95,0x81,0x31,0xFE,0x9F,0x00,0x66,0x46,0x53,
0x00,0x00,0x00,0x11,0x71,0xDF,0x00,0x00,0x00,0x00,0x00,0x00。
[0049] 步骤102-3:中间件将记录的长度匹配的产品ATR与运算后的卡片ATR做比较,如果不相等,则不识别当前的卡片,如果相等则识别当前的卡片,即当前卡片为中间件所支持的类型,并记录当前卡片对应的读卡器(Reader)。
[0050] 步骤103:中间件向卡片下发查询所支持的算法数据指令;
[0051] 具体地,在本实施例中,中间件向卡片发送查询算法指令,这条指令是标准的APUD指令,其中INS、P2参数是可更改的,本实施例中优选地,INS=0xCA,P2=0x85。
[0052] 步骤104:中间件接收卡片返回的应答信息,判断所述应答信息中是否包含预设状态码字节,是则继续下一步,否则结束操作;
[0053] 具体地,所述预设状态码字节“9000”。
[0054] 步骤105:中间件从应答信息中获取卡片所支持的算法数据,并在内存中构建生成一张与卡片对应的算法映射表;
[0055] 具体地,算法数据包含有算法的数目以及多组算法的信息。
[0056] 所述算法的信息包括算法名称、密钥最小长度、密钥最大长度和算法标志位,本步骤构建生成的所述算法映射表中包含的是软算法和软算法对象,所述软算法和所述软算法对象一一对应。
[0057] 所述中间件从接收到的所述应答信息中获取卡片所支持的算法数据的过程具体包括:
[0058] 步骤105-1:中间件根据所述应答信息的前两个字节得到卡片所支持的算法的数目,根据预设结构将应答信息的其余字节分解成个数等于卡片所支持的算法的数目个单元结构体。
[0059] 步骤105-2:中间件对每个单元结构体进行解析,获取多组算法的信息。
[0060] 具体的:将每个单元结构体前4个字节解析为算法名称,所述算法名称包括DES的ECB算法(CKM_DES_ECB)、DES的CBC算法(CKM_DES_CBC)、产生RSA密钥对算法(CKM_RSA_PKCS_KEY_PAIR_GEN)等,第5至第6个字节解析为算法密钥最小长度,第7至第8个字节解析为算法密钥最大长度,以算法名为CKM_RSA_PKCS_KEY_PAIR_GEN为例,其密钥最小长度为512位,密钥最大长度为2048位,第9至第12个字节解析为算法标志位,中间件根据算法标志位得到算法支持的功能,比如:加密(CKF_ENCRYPT)、解密(CKF_DECRYPT)、签名(CKF_SIGN)、验签(CKF_VERIFY)、哈希(CKF_DIGEST)、硬件支持算法(CKF_HW)等。所述算法标志位也可以用于表示多个功能的组合,例如可以表示加密(CKF_ENCRYPT)、签名(CKF_SIGN)和硬件支持算法(CKF_HW)的组合。
[0061] 步骤106:中间件根据获取的所述算法数据创建功能对象;
[0062] 本实施例中具体为,中间件根据所述算法数据获取算法类,所述算法类包含有指向算法类的构造函数的指针,中间件调用所述构造函数的指针完成创建功能对象。
[0063] 所述算法数据中的算法名称与算法类的对应关系是预先在中间件中规定好的,例如,CKM_DES_ECB算法对应的算法类为DESECBHardEnc和DESECBHardDec,CKM_GENERIC_SECRET_KEY_GEN算法对应的算法类为GenerateKeyGenericHard。本实施例中根据中间件中预先规定好的上述对应关系,通过本步骤为算法数据中的所有算法分别创建算法对象。
[0064] 步骤107:中间件将创建好的功能对象更新到内存中与当前卡片对应的算法映射表中。
[0065] 具体的,用创建好的的功能对象更新所述算法映射表中的软算法对象。更新后的所述算法映射表中包含的是软算法和硬算法对象,所述软算法和所述硬算法对象一一对应,即创建的所述功能对象优选的理解为所述硬算法对象。
[0066] 本实施例中具体地,更新之前的算法映射表中包含有软算法和软算法对象,所述软算法和软算法对象一一对应。中间件针对每一张卡片,在内存中有一张与其对应的算法映射表,现有技术中当卡片升级支持新的算法时,因为在中间件中是预先写好的卡片支持哪些算法的,所以导致中间件无法访问升级后的卡片;本发明通过上述步骤103-107中间件为监控到的当前卡片在内存中创建预设算法映射表,并用动态的为当前卡片创建的硬算法对象更新预设算法映射表中的软算法对象,以便中间件在被上层应用程序调用访问卡片时可以实现从动态创建的算法映射表中调用所需算法对象,使得达到中间件的应用更加灵活的效果。
[0067] 上述步骤107可以具体为,中间件在算法映射表中查找与获取的所述算法数据中的算法的信息相同的软算法,若查找到,则将与所述软算法对应的软算法对象更新为所述创建好的功能对象,若未查找到,则所述软算法对应的软算法对象不发生改变。
[0068] 所述中间件在算法映射表中查找与获取的所述算法数据中的算法的信息相同的软算法具体为,查找与获取的所述算法数据中的算法的信息的单元结构体格式完全相同的软算法。
[0069] 本实施例中所述动态创建算法对象具体为中间件根据监控到的当前插入的卡片,动态的更新当前卡片对应的内存中的算法映射表中的算法对象,并且当卡片拔出时及时销毁当前卡片对应的算法映射表。比如卡片A插入,中间件监控到并识别,给卡片A下发查询所支持的算法数据指令,中间件获得算法数据,创建算法对象,构建卡片A的算法映射表,例如卡片A支持的RSA密钥对最小长度为512位,最大长度为2048位,卡片A不支持SHA1硬HASH算法;此时卡片B插入,中间件监控并识别,中间件给卡片B下发查询所支持的算法数据指令并构建卡片B的算法映射表,而卡片B支持的RSA密钥对最小长度为1024位,最大长度为2048位,并支持SHA1的硬HASH算法。这样当中间件监控到有多张卡片插入时,可以在内存构建生成与卡片对应的多张不同的算法映射表,以便中间件在被上层应用程序调用访问卡片时灵活的从动态创建的算法映射表中调用所需算法对象。进一步的,如果中间件监控到卡片A或B拔出时,会自动销毁卡片A或B的算法映射表。
[0070] 中间件监控到当前卡片拔出时,会自动销毁当前卡片对应的算法映射表具体为以下步骤:
[0071] 步骤108-1:中间件监控到有读卡器(Reader)产生拔出事件;
[0072] 具体的,中间件不停枚举操作系统中的读卡器(Reader)状态,当有卡片拔出时,会触发相应的读卡器(Reader)产生拔出事件。
[0073] 步骤108-2:中间件执行拔出操作处理,匹配拔出的卡片;
[0074] 具体的,中间件将产生拔出事件的读卡器(Reader)和已做记录的所有读卡器(Reader)逐一进行比较,如果比较成功,则表示拔出的卡片是识别过的卡片,则执行步骤108-3,如果比较不成功,则不处理。
[0075] 步骤108-3:中间件销毁匹配到的当前卡片对应的算法映射表;
[0076] 具体的,中间件根据匹配的拔出卡片找到拔出卡片的算法映射表,对算法映射表做销毁。
[0077] 中间件被上层应用程序调用访问卡片时,执行以下操作如图2所示:
[0078] 步骤201:中间件接收到上层应用程序想要执行的具体操作指令,中间件根据所述具体操作指令得到预设算法、密钥对象和待处理数据;
[0079] 具体地,所述具体操作指令可以为加解密操作指令或签名操作指令,比如上层应用想执行DES的ECB模式加密操作,则加密操作指令包含的参数有:预设算法、密钥对象的句柄、待处理数据以及待处理数据的长度。
[0080] 步骤202:中间件从内存中获取一张与当前卡片匹配的算法映射表;
[0081] 本实施例中具体的,中间件根据获取到的当前卡片的类型查找是否存在与之对应的记录的读卡器(Reader),如存在则可以查找到一张动态创建好的算法映射表,该动态创建好的算法映射表中包含有软算法和与卡片相关的硬算法对象,所述软算法和硬算法对象一一对应;如不存在则查找到的是一张预置的算法映射表,该预置的算法映射表中仅包含有软算法和软算法对象,所述软算法和软算法对象一一对应。
[0082] 步骤203:中间件在算法映射表中查找是否存在与所述预设算法匹配的软算法,若存在则执行下一步,否则返回错误;
[0083] 步骤204:中间件获取算法映射表中与所述软算法对应的算法对象;
[0084] 具体地,中间件从算法映射表中获取的所述算法对象可以是硬算法对象,也可以是软算法对象。
[0085] 所述算法对象包含有中间件根据接收到的具体操作指令要执行相应操作的操作方式。当所述具体操作指令为加解密操作指令时,所述算法对象包含实现加解密的操作方式,当所述具体操作指令为签名操作指令时,所述算法对象包含实现签名的操作方式。
[0086] 例如,要执行的相应操作是加密操作,且所述算法对象是软算法对象时,软算法对象包含调用openssl接口实现加密的操作方式;要执行的相应操作是加密操作,且所述算法对象是硬算法对象时,硬算法对象包含有向卡片发送APDU指令实现加密的操作方式。
[0087] 步骤205:中间件根据所述密钥对象和所述算法对象对所述待处理数据执行相应操作。
[0088] 以下两个实施例以如实施例1所述动态创建算法对象的方法在中间件中创建好映射表后,中间件接收上层应用程序下发的加密操作指令为例进行详细介绍。
[0089] 实施例2
[0090] 在实施例1基础上,本实施例提供上层应用程序调用中间件以PKCS#11接口访问卡片为例,具体包括:
[0091] 中间件给上层应用提供了C_Initialize接口,上层应用调用此接口,完成中间件的加载,中间件内部创建监控线程,不停的枚举系统的读卡器,判断是否有卡片插入,当有卡片插入时,创建卡片的算法映射表,通过上述流程实现动态创建并使用功能对象。
[0092] 步骤301:中间件接收到上层应用程序下发的加密操作指令,并从所述加密操作指令中得到预设算法、密钥对象和待处理数据;
[0093] 在步骤301之前还包括上层应用程序调用C_OpenSession接口,建立Session会话;
[0094] 本实施例中优选的,上层应用程序下发加密操作指令具体包括:
[0095] 步骤300-1:上层应用程序调用函数C_GetSlotList获取指定槽的ID;
[0096] 具体的,上层应用程序调用C_GetSlotList获取一个插入设备槽列表,从槽列表中获取指定槽的ID,如果没有卡片插入则会获取到空的槽列表,等待卡片插入。其中所述指定槽的ID是指当前卡片的槽的ID。
[0097] 本步骤还可以包括:上层应用程序调用C_GetSlotInfo获得所述指定槽的信息,所述指定槽的信息包括槽的字符串描述、槽的标志位等。
[0098] 步骤300-2:上层应用程序根据所述指定槽的ID获取当前卡片的信息;
[0099] 具体的,上层应用程序根据所述指定槽的ID调用函数C_GetTokenInfo以获取当前卡片的信息,从而判断当前卡片是否是真正想要做加密操作的卡片。所述当前卡片的信息包括卡片类型、卡片标志位、卡片用来存放密钥的空间总容量等。
[0100] 步骤300-3:上层应用程序调用函数C_GetMechanismList和C_GetMechanismInfo,从当前卡片所支持的算法列表中获取预设算法;
[0101] 具体地,上层应用程序调用C_GetMechanismList获取当前卡片所支持的算法列表,根据当前卡片的槽的ID从所述算法列表中获取预设算法,并调用C_GetMechanismInfo获取所述预设算法的信息,所述预设算法的信息包括预设算法的名称、密钥的最大长度、密钥的最小长度、标志位。
[0102] 步骤300-4:上层应用程序调用函数C_FindObjectsInit启动对密钥对象的搜寻,搜寻过程中通过一次或多次调用函数FindObjects以获得密钥对象句柄,当搜寻到密钥对象句柄时通过调用函数C_FindObjectsFinal结束搜寻操作;
[0103] 步骤300-5:根据搜寻到的密钥对象句柄,上层应用程序调用函数C_GetAttributeValue获取密钥对象的属性值从而确定一个密钥对象。
[0104] 步骤300-6:上层应用程序向中间件下发加密操作指令;
[0105] 具体的,所述加密操作指令用于上层应用程序根据密钥对象句柄调用函数C_EncryptInit初始化一个加密操作,然后调用函数C_Encrypt来加密单一部分数据,或者调用函数C_EncryptUpdate和C_EncryptFinal来加密多部分的数据。
[0106] 所述函数C_EncryptInit包含的参数有:当前的session会话句柄、算法机制(例如AES_CBC加密机制)、密钥对象句柄。
[0107] 所述函数C_Encrypt包含的参数有:指向待加密数据的指针、待加密数据字节的长度、指向接收加密数据的单元的指针、指向包含加密数据字节长度单元的指针。
[0108] 步骤302:中间件从内存中获取一张与当前卡片对应的算法映射表;
[0109] 本实施例中具体的,中间件根据当前卡片类型在内存中查找与之对应的记录的读卡器(Reader),根据查找到的Reader在内存中获取一张动态创建好的算法映射表。
[0110] 步骤303:中间件在算法映射表中查找是否存在所述预设算法,若存在则执行下一步,否则返回错误;
[0111] 本实施例中,所述预设算法为AES_CBC算法。
[0112] 步骤304:中间件从算法映射表中提取与所述预设算法一一对应的算法对象;
[0113] 本实施例中具体地,中间件从映射表中提取的所述算法对象包含有向卡片发送APDU指令实现加密的操作方式。
[0114] 步骤305:中间件利用获取的密钥对象和算法对象,对所述加密操作指令中包含的待加密数据执行加密操作。
[0115] 例如:所述密钥对象包含有执行AES_CBC加密的密钥值,所述算法对象是向卡片发送APDU指令实现加密的操作方式,则对所述加密操作指令中包含的待加密数据执行加密操作具体为:中间件通过向卡片发送APDU指令访问卡片,卡片内部执行AES_CBC加密,执行成功后返回加密结果给中间件。
[0116] 实施例3
[0117] 在实施例1基础上,本实施例提供上层应用程序调用中间件以CSP接口访问卡片为例,具体包括:
[0118] 中间件给上层应用提供了CryptAcquireContext接口,上层应用调用此接口,完成中间件的加载,中间件内部创建监控线程,不停的枚举系统的读卡器,判断是否有卡片插入,当有卡片插入时,在内存中创建卡片的算法映射表,通过上述流程实现动态创建并使用功能对象。
[0119] 步骤401:中间件接收到上层应用程序下发的加密操作指令,并从所述具体操作指令中解析得到预设算法、密钥对象和待处理数据;
[0120] 本实施例中优选的,上层应用程序下发加密操作指令具体包括:
[0121] 步骤400-1:上层应用程序调用函数CryptAcquireContext获得指定CSP的密钥容器句柄,中间件内部会创建监控线程,监控卡片插入;
[0122] 步骤400-2:根据密钥容器句柄获取当前CSP相关参数信息;
[0123] 具体的,根据所述密钥容器句柄调用函数CryptGetProvParam以获取CSP参数信息。所述当前CSP相关参数信息包括容器名字、预置算法列表、预置算法列表信息(预设算法的名称、密钥的最大长度、密钥的最小长度、标志位)等;
[0124] 步骤400-3:上层应用程序调用函数CryptGenKey产生密钥对象,得到一个密钥对象句柄;
[0125] 本实施例中具体的,所述密钥对象可以包括对称密钥和非对称密钥。
[0126] 步骤400-4:上层应用程序根据密钥对象句柄调用函数CryptGetKeyParam获取密钥对象的信息;
[0127] 本实施例中具体地,所述密钥对象的信息包括密钥的长度、算法ID等。
[0128] 步骤400-5:上层应用程序向中间件下发加密操作指令;
[0129] 具体的,所述加密操作指令用于上层应用程序通过调用函数CryptEncrypt来加密单一部分数据或者多部分的数据。所述函数CryptEncrypt包含的参数有:指向密钥对象句柄、哈希对象句柄、判断加密最后一部分数据布尔值(Final)、保留值0、指向接收加密数据的单元的指针、待加密数据字节的长度、待加密数据的字节长度。具体地,上层应用程序通过参数Final来判断是加密单一部分还多部分,Final等于true表示加密最后一部分数据。
[0130] 步骤402:中间件从内存中获取一张与当前卡片对应的算法映射表;
[0131] 本实施例中具体的,中间件根据获取到的当前卡片类型在内存中查找与之对应的记录的读卡器(Reader),根据查找到的Reader在内存中获取一张动态创建好的算法映射表。
[0132] 步骤403:中间件在算法映射表中查找是否存在所述预设算法,若存在则执行下一步,否则返回错误;
[0133] 本实施例中,所述预设算法为AES_CBC算法。
[0134] 步骤404:中间件从算法映射表中提取与所述预设算法一一对应的算法对象;
[0135] 本实施例中具体地,中间件从映射表中提取的所述算法对象包含有向卡片发送APDU指令实现加密的操作方式。
[0136] 步骤405:中间件利用获取的密钥对象和算法对象,对所述加密操作指令中包含的待加密数据执行加密操作。
[0137] 例如:所述密钥对象是执行AES_CBC的密钥值,所述算法对象是向卡片发送APDU指令实现加密的操作方式,则对所述加密操作指令中包含的待加密数据执行加密操作具体为:中间件通过向卡片发送APDU指令访问卡片,卡片内部执行AES_CBC加密,执行成功后返回加密结果给中间件。
[0138] 以上所述的实施例只是本发明较优选的具体实施方式,本领域的技术人员在本发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。