CN102055759A - 一种硬件引擎的实现方法 - Google Patents
一种硬件引擎的实现方法 Download PDFInfo
- Publication number
- CN102055759A CN102055759A CN2010102144324A CN201010214432A CN102055759A CN 102055759 A CN102055759 A CN 102055759A CN 2010102144324 A CN2010102144324 A CN 2010102144324A CN 201010214432 A CN201010214432 A CN 201010214432A CN 102055759 A CN102055759 A CN 102055759A
- Authority
- CN
- China
- Prior art keywords
- interface
- engine
- certificate
- rsa
- intelligent cipher
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Abstract
本发明涉及信息安全领域,尤其是一种硬件引擎的实现方法。包括:引擎初始化接口被调用时,与智能密钥设备建立连接;引擎绑定接口被调用时,绑定硬件引擎,并加载算法密钥和证书,及设置第一数据结构;加解密接口被调用时,根据加载的算法密钥,控制智能密钥设备对传入的数据进行加/解密操作;签名接口被调用时,根据加载的算法密钥,控制智能密钥设备对传入的摘要值进行签名操作;验签接口被调用时,对传入的签名值进行解密操作,并验证解密得到的摘要值是否正确;SSL客户端认证接口被调用时,根据加载的证书,控制智能密钥设备进行SSL客户端认证,并返回认证结果;当引擎释放接口被调用时,结束与智能密钥设备的连接。
Description
技术领域
本发明涉及信息安全领域,尤其是一种硬件引擎的实现方法。
背景技术
SSL是Secure Socket Layer的英文缩写,它的中文意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。
SSL以对称密码技术和公开密码技术相结合,可以实现如下三个通信目标:
(1)秘密性:SSL客户机和服务器之间传送的数据都经过了加密处理,网络中的非法窃听者所获取的信息都将是无意义的密文信息。
(2)完整性:SSL利用密码算法和散列(HASH)函数,通过对传输信息特征值的提取来保证信息的完整性,确保要传输的信息全部到达目的地,可以避免服务器和客户机之间的信息受到破坏。
(3)认证性:利用证书技术和可信的第三方认证,可以让客户机和服务器相互识别对方的身份。为了验证证书持有者是其合法用户(而不是冒名用户),SSL要求证书持有者在握手时相互交换数字证书,通过验证来保证对方身份的合法性。
The Public-Key Cryptography Standards(PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。PKCS#11称为Cyptoki,定义了一套独立于技术的程序设计接口,用于智能卡和PCMCIA卡之类的加密设备。
OpenSSL项目是一个开源代码的安全项目,目标是用强大的加密算法来实现安全的Socket层(Secure Sockets Layer,SSLv2/v3)和传输层的安全性(Transport Layer Security,TLS v1)。它包含了完整的加密算法,数字签名算法及证书签名算法等。可以很好的保证数据的完整性、保密性和正确性。
引擎(Engine)机制的目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或硬件加密设备进行加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅是一个加密库,而且还是一个通用的加密接口,能够与绝大部分加密库或硬件加密设备协调工作。
发明内容
一种硬件引擎的实现方法,上层应用程序通过调用所述硬件引擎的引擎绑定接口,引擎初始化接口,第一数据结构中的加解密接口、签名接口、验签接口、SSL客户端认证接口,及所述硬件引擎的引擎释放接口来实现,所述方法包括:
引擎初始化接口被上层应用程序调用时,硬件引擎与智能密钥设备建立连接;
引擎绑定接口被上层应用程序调用时,绑定硬件引擎,并加载算法密钥和证书,及设置第一数据结构,所述算法密钥包括公钥和私钥;
第一数据结构中的加解密接口被上层应用程序调用时,所述硬件引擎根据所述加载的算法密钥,控制所述智能密钥设备对传入的数据进行加/解密操作,并输出操作结果;
第一数据结构中的签名接口被上层应用程序调用时,所述硬件引擎根据所述加载的算法密钥,控制所述智能密钥设备对传入的摘要值进行签名操作,并返回签名结果;
第一数据结构中的验签接口被上层应用程序调用时,所述硬件引擎根据所述加载的算法密钥,控制所述智能密钥设备对传入的签名值进行解密操作,并验证所述解密得到的摘要值是否正确,正确,则验签成功,否则,验签失败;
第一数据结构中的SSL客户端认证接口被上层应用程序调用时,所述硬件引擎根据所述加载的证书,控制所述智能密钥设备进行SSL客户端认证,并返回认证结果;
当引擎释放接口被上层应用程序调用时,所述硬件引擎结束与所述智能密钥设备的连接。
所述引擎绑定接口、引擎初始化接口、第一数据结构、引擎释放接口具体为bind_engine接口、init接口、RSA_METHOD数据结构、destroy接口。
所述硬件引擎通过硬件加密接口与所述智能密钥设备建立连接。
所述硬件加密接口包括密码令牌接口或加密服务提供程序接口。
所述绑定硬件引擎具体为:创建引擎对象;
为所述创建的引擎对象设置引擎id及引擎名称;
当上层应用程序调用所述设置的引擎id及引擎名称时,则绑定与所述引擎id及引擎名称相对应的硬件引擎。
所述加载证书和算法密钥具体是通过load_ssl_client_cert()来完成的。
当所述智能密钥设备中存在多张证书时,所述方法还包括:通过loadssl_f()接口及crtl_f()接口来加载证书和私钥,具体为:
当loadssl_f()接口被上层应用程序调用时,对智能密钥设备中所有的证书和密钥对进行遍历,并对所述智能密钥设备中的证书和密钥进行分组,使得证书与密钥对能够对应;在crtl_f()接口中实现设置证书命令,所述设置证书命令对所述智能密钥设备中的证书进行选择,并将选择的证书及与选择的证书相对应的密钥保存到所述硬件引擎的上下文中;通过所述load_ssl_client_cert()加载所述选择的证书及对应的算法密钥。
所述crtl_f()接口实现操作还包括:设置硬件加密接口的名称、设置需要的证书、登录、登出、设置PIN码。
当所述硬件加密接口为密码令牌时,所述crtl_f()接口实现的操作还包括:选择槽slot、通过智能密钥设备序列号选择智能密钥设备、获取总的智能密钥设备数量;
当所述硬件引擎为加密服务提供程序时,所述自定义命令还包括:枚举容器、选择容器、获取总的容器数量。
所述硬件引擎通过所述容器加载算法密钥及证书。
所述硬件引擎根据所述加载的算法密钥,控制所述智能密钥设备对传入的数据进行加解密操作具体包括:
对传入的数据按照设定的填充方式进行填充,所述填充方式包括:RSA PKCS1、RSA X931、RSA SSLV23或无填充方式;
进行登录检查,如果没有进行登录,则进行PIN码验证,进行登录操作,如果已登录,则控制所述智能密钥设备对所述填充后的数据进行加解密操作。
第一数据结构中的签名接口被上层应用程序调用时,所述方法还包括:创建X509_SIG摘要结构。
所述X509_SIG摘要结构用来存放摘要值和签名值。
对传入的签名值进行解密操作,并验证所述解密得到的摘要值是否正确具体为:对传入的签名值进行公钥解密,并检查解密得到的摘要值的摘要模式是否与传入的摘要模式相一致,如果一致,则将所述解密得到的摘要值与传入的摘要值进行对比,如果一致,则验签成功。
所述硬件引擎根据所述加载的证书,控制所述智能密钥设备进行SSL客户端认证具体为:在所述智能密钥设备中查找证书对象;检查所述查找得到的证书是否是用于SSL客户端认证的,如果是,根据所述查找得到的证书,在所述智能密钥设备中查找出与之匹配的公私密钥对对象,进行SSL客户端认证。
检查所述查找得到的证书是否是用于SSL客户端认证具体为:根据X509_PURPOSE数据结构来查找证书用途;
其中,所述X509_PURPOSE数据结构是上层应用程序中已有定义的。
所述硬件引擎与所述智能密钥设备通过所述硬件加密接口进行信息的交互。
本发明的效果在于:通过硬件加密引擎,将一些硬件加解密算法,尤其是一些未公开的,只能用硬件实现的加解密算法添加扩展到软件算法库中。
附图说明
图1为本发明实施例提供的引擎绑定接口bind_engine被调用时的流程图;
图2为本发明实施例提供的crtl_f()接口被调用时的流程图;
图3为本发明实施例提供的引擎初始化接口init被调用时的流程图;
图4为本发明实施例提供的公钥加密接口rsa_pub_enc被调用时的流程图;
图5为本发明实施例提供的私钥加密接口rsa_piv_enc被调用时的流程图;
图6为本发明实施例提供的签名接口rsa_sign被调用时的流程图;
图7为本发明实施例提供的验签接口rsa_verify被调用时的流程图;
图8为本发明实施例提供的加载客户端证书接口ENGINE_set_load_ssl_client_cert_function被调用时的流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式做进一步的描述。
硬件引擎作为现有软件算法库(如OpenSSL动态库)的扩展,为用户提供了一个用于增加硬件算法的接口。硬件引擎所提供的数据结构中不仅包括数据,还包括各种方法(这里所说的方法是指算法回调函数集合),所述方法是可替换的,通常情况下,硬件引擎提供一个默认方法,并通过替换该默认方法来达到增加算法的目的。
在本实施例进行说明之前,需要对硬件引擎的数据结构有所了解,该数据结构的描述如下:
typedef struct engine_st
{
const char*id;
const char*name;
const RSA_METHOD*rsa_meth;
const DSA_METHOD*dsa_meth;
const DH_METHOD*dh_meth;
const ECDH_METHOD*ecdh_meth;
const ECDSA_METHOD*ecdsa_meth;
const RAND_METHOD*rand_meth;
const STORE_METHOD*store_meth;
int(*init)(void);
int(*finish)(void);
int(*destroy)(void);
EVP_PKEY*(*load_privkey)(const char*key_id,const
char*passphrase);
EVP_PKEY*(*load_pubkey)(const char*key_id,const
char*passphrase);
int ctrl_f(ENGINE*e,int cmd,long i,void*p,void
(*f)(void));
const ENGINE_CMD_DEFN*cmd_defns;
ENGINE_SSL_CLIENT_CERT_PTR load_ssl_client_cert;
int flags;
/*reference count on the structure itself*/
int struct_ref;
/*reference count on usability of the engine type.NB:
This
*controls the loading and initialisation of any
functionlity
*required by this engine,whereas the previous count
is
*simply to cope with(de)allocation of this structure.
Hence,
*running_ref<=struct_ref at all times.*/
int funct_ref;
/*A place to store per-ENGINE data*/
CRYPTO_EX_DATA ex_data;
/*Used to maintain the linked-list of engines.*/
struct engine_st*prev;
struct engine_st*next;
}ENGINE;
具体地,本发明所提供的硬件引擎正是通过实现上述数据结构中的id、name字段,RSA_METHOD方法,init()、finish()、destroy(),ctrl-f()、load_privkey()、load_pubkey()来实现将智能密钥设备中的对称算法添加到现有的软件算法库中;
需要说明的是,在具体实现时,也可以通过替换上述数据结构中的方法DSA_METH、DH_METHOD、ECDH_METHOD、ECDSA_METHOD、RAND_METHOD、STORE_METHOD来实现将智能密钥设备中的算法添加到OpenSSL动态库中的目的,但不在本发明的说明范围,在此就不再详述了。
其中,通过设置硬件引擎id和name来确定所要加载的硬件引擎,init()用于初始化PKCS#11接口动态库,来绑定特定的函数指针,该函数指针指向的函数是根据引擎数据结构中的函数指针具体实现的,例如:智能密钥设备中的算法函数;finish()用于清除硬件引擎所占用的资源;destroy()用于清除应用资源;ctrl_f()用于实现自定义命令功能;load_privkey()用于加载私钥;load_pubkey()用于加载公钥;load_ssl_client_cert用于实现证书的加载;flags字段用于标识硬件引擎使用的算法是硬件引擎所提供的默认算法,还是自定义算法。
其中,方法RSA_METHOD的描述如下:
typedef struct rsa_meth_st
{
const char*name;
int(*rsa_pub_enc)(int flen,unsigned char
*from,unsigned char*to,RSA*rsa,int padding);
int(*rsa_pub_dec)(int flen,unsigned char
*from,unsigned char*to,RSA*rsa,int padding);
int(*rsa_priv_enc)(int flen,unsigned char
*from,unsigned char*to,RSA*rsa,int padding);
int(*rsa_priv_dec)(int flen,unsigned char
*from,unsigned char*to,RSA*rsa,int padding);
int(*rsa_mod_exp)(BIGNUM*r0,BIGNUM*I,RSA*rsa);/*
Can be null*/
int(*bn_mod_exp)(BIGNUM*r,BIGNUM*a,const BIGNUM*p,
const BIGNUM*m,BN_CTX*ctx,BN_MONT_CTX*m_ctx);/*Can be
null*/
int(*init)(RSA*rsa); /*called at new*/
int(*finish)(RSA*rsa); /*called at free*/
int flags; /*RSA_METHOD_FLAG_*things
*/
char*app_data; /*may be needed!
*/
/*New sign and verify functions:some libraries don′t allow arbitrary data to be signed/verified:this allows them to be used.Note:for this to work the RSA_public_decrypt()and RSA_private_encrypt()should*NOT*be used RSA_sign(),RSA_verify()should be used instead.Note:for backwards compatibility this functionality is only enabled if the RSA_FLAG_SIGN_VER option is set in′flags′.*/
int(*rsa_sign)(int type,unsigned char*m,unsigned int m_len,unsigned char*sigret,unsigned int*siglen,RSA*rsa);
int(*rsa_verify)(int dtype,unsigned char*m,unsigned int m_len,unsigned char*sigbuf,unsigned int siglen,RSA*rsa);
}RSA_METHOD;
由上述描述可知,RSA_METHOD数据结构定义了初始化/结束接口init/finish、RSA公钥加/解密接口rsa_pub_enc/rsa_pub_dec、RSA私钥加/解密接口rsa_priv_enc/rsa_priv_dec、RSA签名/验签接口rsa_mod_exp/bn_mod_exp,实现RSA_METHOD实质上就是实现上述八个函数接口;
需要说明的是,上述八个函数接口是可以有选择地实现的,即根据硬件引擎的功能有选择地实现;例如,硬件引擎用做非对称加/解密操作的,则需要实现RSA公钥加/解密接口和RSA私钥加/解密接口,并且RSA_METHOD结构中的flags标识置为RSA_FLAG_EXT_PKEY,表明是用于数据交换;再例如,引擎用做签名/验签操作,则要实现RSA签名/验签接口,并且RSA_METHOD结构中的flags标识置为RSA_FLAG_SIGN_VER,表明是用于签名操作的,等等。
其中,padding为填充方式/去填充方式,是由用户设置的;flags字段用于标识该RSA_METHOD数据结构用于哪一种操作,例如,如果flags设置为RSA_FLAG_SIGN_VER,则表明该数据结构用于签名/验签,那么,该数据结构中的rsa_sign/rsa_verify将被使用,而RSA_public_decrypt/RSA_private_encrypt则不会被使用,其中,flags的数值可以是RSA_FLAG_EXT_PKEY(用于数据交换)。
还需要说明的是,本发明实施例中初始化/结束接口init/finish设置为空值,没有使用,不做为本发明说明的范围,对其余的六个函数接口都进行了说明;
实施例1
基于上述说明,硬件引擎通过实现引擎绑定接口bind_engine()及注册在硬件引擎数据结构中的引擎初始化接口init()、引擎完成接口finish()、引擎销毁接口destroy()、自定义功能接口ctrl_f()、私钥加载接口load_privkey()、公钥加载接口load_pubkey()、证书加载接口load_ssl_client_cert()、第一数据结构RSA_METHOD中的RSA公钥加/解密接口rsa_pub_enc()/rsa_pub_dec()、RSA私钥加/解密接口rsa_priv_enc()/rsa_priv_dec()、RSA签名/验签接口rsa_mod_exp()/bn_mod_exp()来达到用智能密钥设备中的算法替换OpenSSL动态库中的RSA算法的目的,接下来,将对各个接口进行详细的描述。
在本实施例中,硬件引擎通过PKCS#11(密码令牌)接口动态库与连接到主机的智能密钥设备进行通信,实现用智能密钥设备中的RSA算法来替换现有软件算法库中的RSA算法,完成利用密钥设备中的公私密钥对进行数据加解密、身份认证等操作。所述PKCS#11接口动态库由智能密钥设备的开发者提供,PKCS#11接口动态库的内部细节不在本发明描述范围之内。
参见图1,当引擎绑定接口bind_engine()被上层应用程序调用时,硬件引擎执行如下操作:
步骤101:创建引擎对象e;
具体地,通过ENGINE_new()函数来实现;
其中,ENGINE_new()函数是OpenSSL动态库中已定义的,且通过该函数所创建的引擎对象e为空。
步骤102:为所创建的引擎对象e设置id及name;
具体地,通过函数ENGINE_set_id()、ENGINE_set_name()来实现;
例如:ENGINE_set_id(e,engine_rsaref_id);ENGINE_set_name(e,engine_rsaref_name),则上层应用程序调用该函数时,根据设置的引擎id及引擎名称加载相应的硬件引擎。
步骤103:设置crtl_f(),控制调用自定义命令功能;
具体地,通过ENGINE_set_ctrl_f_function()函数来设置ctrl_f();
其中,ctrl_f()描述如下:
int(*ctrl_f)(ENGINE*e,/*引擎*/
int cmd, /*命令号*/
long i, /*输入参数的长度*/
void*p, /*输入参数的内容*/
void(*f)());
具体地,自定义命令示例如下所述:
(1).pkcs11lib 设置PKCS#11库名称;
(2).setxcert 设置需要的证书;
(3).usetokeni 选择一个槽Slot;
(4).usetokenn 通过智能密钥设备序列号选择一个设备;
(5).setpin 设置选择的Slot的PIN码;
(6).login 登录;
(7).logout 登出;
(8).getslots 获取总的硬件加密设备数量。
本发明实施例中ctrl_f()控制实现的自定义命令包括上述示例所说的所有命令;
具体地,通过设置ctrl_f()中的命令号字段来控制实现上述示例所述的自定义命令。
步骤104:设置load_privkey();
具体地,通过ENGINE_set_load_privkey_function()函数设置load_privkey()。
需要说明是,设置的load_privkey()是空的。
步骤105:设置loadssl_f(),实现证书和公私密钥对的加载;
具体地,通过ENGINE_set_load_ssl_client_cert_function()函数来设置回调函数,在此函数中实现证书和公私密钥对的加载;上层应用程序则是通过调用load_ssl_client_cert()来实现证书和公私密钥对的加载的;
其中,loadssl_f()的描述如下:
int(*loadssl_f)(ENGINE*e, /*引擎*/
SSL*ssl, /*SSL*/
STACK_OF(X509_NAME)*ca_dn,/*CA颁发者名称*/
X509**pcert, /*用户证书*/
EVP_PKEY**pkey, /*公私密钥对*/
STACK_OF(X509)**pother,
UI_METHOD*ui_method,
void*callback_data);
具体地,通过设置回调函数ENGINE_set_load_ssl_client_cert_function()来进行客户端证书和公私密钥对的加载操作;
需要说明的是,如果智能密钥设备中存储着多张证书,相应的,也就出现多对密钥对,可以在加载私钥函数中,对智能密钥设备中所有的证书和密钥对进行遍历,按统一的CKA_ID(P11接口中对象的一个属性)进行分组,使得证书与密钥对能够对应。然后,通过crtl_f()中的设置证书命令实现证书的选择;并将选择的证书及与证书相对应的密钥保存到**pcert字段。
步骤106:设置load_pubkey();
具体地,通过ENGINE_set_load_pubkey_function()函数设置load_pubkey()。
需要说明是,设置的load_pubkey()是空的。
步骤107:设置RSA_METHOD数据结构;
具体地,可以由ENGINE_set_RSA()函数来设置RSA_METHOD数据结构;
具体地,设置RSA_METHOD数据结构是指,设置RSA_METHOD数据结构中的RSA公钥加/解密接口rsa_pub_enc()/rsa_pub_dec()、RSA私钥加/解密接口rsa_priv_enc()/rsa_priv_dec()、RSA签名/验签接口rsa_mod_exp()/bn_mod_exp()、SSL客户端认证接口的指针,当上层应用程序调用到上述指针时,程序转入RSA公钥加/解密接口rsa_pub_enc()/rsa_pub_dec()、RSA私钥加/解密接口rsa_priv_enc()/rsa_priv_dec()、RSA签名/验签接口rsa_mod_exp()/bn_mod_exp()、SSL客户端认证接口的处理流程。
需要说明的是,在步骤103中设置crtl_f()是指设置crtl_f()的函数指针,当上层应用程序调用到该设置的函数指针时,程序转入crtl_f()的处理流程,具体如下:
参见图2,当crtl_f()被上层应用程序调用时,硬件引擎执行如下操作:
103-1、设置证书;
具体地,设置enumCert命令,当该命令被调用时,返回智能密钥匙设备中的证书列表,通过选择证书setCert命令在返回的证书列表中选择证书和密钥,并将选择的证书和密钥保存到内存中;
具体地,enumCert命令是通过调用PKCS#11接口动态库中的C_FindObjectInit(),C_FindObjects()和C_FindObjectsFinal()实现的。
103-2、进行登录操作;
具体地,通过调用PKCS#11接口动态库中的C_Login(),C_GetSessionInfo()来实现;
其中,C_Login()实现登录操作,C_GetSessionInfo()实现智能密钥设备登录状态的更新;
103-3、进行登出操作;
具体地,通过调用PKCS#11接口动态库中的C_Logout,C_GetSessionInfo来实现;
其中,C_Logout()实现登出操作,C_GetSessionInfo()实现智能密钥设备登出状态的更新;
需要说明的是,在crtl_f()被调用时,还可以实现如下操作:设置PKCS#11接口动态库的名称、选择一个槽slot;通过智能密钥设备选择一个设备号;设置选择的slot的PIN码;获取总的硬件加密设备数量;等等;并将设置的PKCS#11接口动态库的名称、选择的槽slot、选择的设备号、设置的槽slot的PIN码、获取的总的硬件加密设备的数量存储在缓存中,在后续使用时,就可以直接从缓存中取出了。
参见图3,当引擎初始化接口init()被上层应用程序调用时,硬件引擎执行如下操作:
步骤201、加载PKCS#11接口动态库;
优选地,本步骤通过调用计算机的系统函数loadlibrary()来完成。
进一步地,加载与crtl_f()中控制实现的PKCS#11接口动态库的名称相对应的PKCS#11接口动态库。
步骤202、获取PKCS#11接口动态库的函数列表;
优选地,本步骤通过调用PKCS#11接口中的C_GetFunctionList()函数来完成;
进一步地,本步骤还可以先通过调用计算机系统函数GetProcAddress()尝试获取PKCS#11接口中的C_GetFunctionList()函数在PKCS#11接口的入口点,调用C_GetFunctionList()函数成功后,就可通过由C_GetFunctionList()函数获得的PKCS#11函数列表获取其他PKCS#11接口的入口点;如果尝试失败,则报错返回。
具体地,PKCS#11接口动态库的函数列表可以是CK_FUNCTION_LIST_PTR。
需要说明的是,PKCS#11接口动态库的函数列表包含PKCS#11接口动态库中函数指针的指针。
步骤203、调用PKCS#11接口动态库中定义的函数C_Initialize()来初始化PKCS#11接口动态库;
这里需要说明的是,根据PKCS#11接口的规范标准,在进行其他操作之前必须要先调用C_Initialize()。
进一步地,在此过程中,还可执行以下操作:
步骤203’、创建并启动监控线程,利用PKCS#11接口动态库中定义的函数C_WaitForSlotEvent()来监控智能密钥设备的插拔事件,以便在后续的处理过程中引擎可以根据智能密钥设备的插拔状态及时地做出相应的反应。
步骤204:获取当前连接到主机的智能密钥设备句柄;
具体地,通过调用PKCS#11接口动态库中定义的函数C_GetSlotList()来获取当前连接到主机的智能密钥设备的设备列表。
具体地,如果存在多个智能密钥设备连接到主机,优选的,选择设备列表中与crtl_f()中控制实现的智能密钥设备序列号相对应的智能密钥设备;相应的,选择设备列表中的第一个智能密钥设备。
需要说明的是,当有多个智能密钥设备连接到主机时,还可以选择设备列表中与crtl_f()中控制实现的槽slot相连接的智能密钥设备。
步骤205:与智能密钥设备建立连接;
具体地,通过调用PKCS#11接口动态库中定义的函数C_OpenSession()来与智能密钥设备建立连接。
接下来,硬件引擎与智能密钥设备之间的信息交互都是通过PKCS#11接口实现的。
参见图4,当公钥加密接口rsa_pub_enc()被上层应用程序调用时,硬件引擎执行如下操作:图中302、303都是加解密
其中,公钥加密接口rsa_pub_enc()的参数描述如下:
int(*rsa_pub_enc)(
int filen, /*加密前数据的长度*/
const unsigned char*from, /*加密前的数据*/
unsigned char*to, /*加密后的数据*/
RSA*rsa, /*RSA密钥对*/
int padding); /*RSA填充模式*/
具体地,RSA填充模式包括RSA PKCS1、RSA X931、RSA SSLV23等填充模式或无填充模式;
步骤301:将传入的RSA密钥对转换为char数组形式;
具体地,当公钥加密接口rsa_pub_enc()被上层应用程序调用时,伴随该接口的被调用,RSA密钥对将会通过rsa字段传入;
具体地,通过调用PKCS#11接口中的C_CreateObject来完成RSA密钥对的导入。
步骤302:对传入的加密前的数据进行填充;
具体地,当公钥加密接口rsa_pub_enc()被上层应用程序调用时,伴随该接口的被调用,加密前数据将会通过from字段传入;而RSA填充模式由padding字段传入;
具体地,根据传入的填充方式对加解密数据进行填充;
具体地,可以采用RSA_padding_add_none、RSA_padding_PKCS1_type_1、RSA_padding_PKCS1_type_2、RSA_padding_SSLv23等填充方式函数对传入的加解密前的数据进行填充;其中RSA_padding_PKCS1_type_1主要用于私钥加密的填充,RSA_padding_PKCS1_type_2主要用于公钥加密的填充。
步骤303:控制智能密钥设备对填充后的数据进行加密操作,并输出加密结果;
具体地,通过调用PKCS#11接口动态库中的函数C_EncryptInit,C_Encrypt来加密填充后的数据,并通过公钥加密接口rsa_pub_dec()的to字段输出加密结果。
这里需要说明是,当公钥解密接口rsa_pub_dec()被上层应用程序调用时,通过调用PKCS#11接口动态库中的C_DecryptInit,C_Decrypt来完成对数据的解密操作,其他操作与上述执行的操作类似,此处就不再赘述。
参见图5,当私钥加密接口rsa_piv_enc()被上层应用程序调用时,硬件引擎执行如下操作:
其中,私钥加密接口rsa_piv_enc()的参数描述如下:
int(*rsa_piv_enc)(
int filen, /*加密前数据的长度*/
const unsigned char*from, /*加密前数据*/
unsigned char*to, /*加密后的数据*/
RSA*rsa, /*RSA密钥对*/
int padding); /*RSA填充模式*/
具体地,RSA填充模式包括RSA PKCS1、RSA X931、RSA SSLV23等填充模式或无填充模式;
步骤401:将RSA私钥转换为char数组形式;
具体地,当私钥加密接口rsa_piv_enc()被上层应用程序调用时,伴随该接口的被调用,RSA密钥对将会通过rsa字段传入;
步骤402:对传入的加解密前的数据进行填充;
具体地,当公钥加密接口rsa_pub_enc()被上层应用程序调用时,伴随该接口的被调用,加密前数据将会通过from字段传入;而RSA填充模式由padding字段传入;
具体地,根据传入的填充方式对加解密数据进行填充;
具体地,可以采用RSA_padding_add_none、RSA_padding_PKCS1_type_1、RSA_padding_PKCS1_type_2、RSA_padding_SSLv23等填充方式函数对传入的加解密前的数据进行填充;其中RSA_padding_PKCS1_type_1主要用于私钥加密的填充,RSA_padding_PKCS1_type_2主要用于公钥加密的填充。
步骤403:进行登录检查,如果已进行登录,则执行步骤405,否则,执行步骤404;
步骤404:登录,对PIN码进行验证,验证通过后执行步骤405;
具体地,通过调用PKCS#11接口动态库中的函数C_Login来完成登录操作;
需要说明的是,登录的操作还可以在智能密钥设备与主机建立连接之时进行;
具体地,本步骤中还可以对PIN码最大输入次数进行限制,如果累计输入PIN码错误的次数超过约定的最大输入次数,则操作结束;
步骤405:控制智能密钥设备对填充后的数据进行加密操作,并输出加密结果;图中是加解密
具体地,通过调用PKCS#11接口动态库中的C_SignRecoverInit,C_SignRecover来加密填充后数据,并通过公钥加密接口rsa_pub_enc()的to字段将加密后数据输出。
这里需要说明是,当私钥解密接口rsa_piv_dec()被上层应用程序调用时,通过调用PKCS#11接口动态库中的C_VerifyRecoverInit,VerifyRecover来解密填充后的数据,其他操作与上述执行的操作类似,此处就不再赘述。
参见图6,当签名接口rsa_sign()被上层应用程序调用时,硬件引擎执行如下操作:
其中,接口rsa_sign()的描述如下:
int(*rsa_sign)(
int type, /*摘要模式*/
const unsigned char*m, /*摘要值*/
unsigned int m_length, /*摘要值的长度*/
unsigned char*sig, /*此参数返回签名结果*/
unsigned int*siglen, /*签名值的长度*/
const RSA*rsa); /*RSA密钥对*/
步骤501:根据传入的摘要模式,创建摘要结构X509_SIG;
需要说明的是,在接口rsa_sign()被上层应用程序调用时,伴随该接口的被调用,摘要模式通过该接口的type字段被传入;
其中,摘要结构X509_SIG是用来存放摘要或者签名值的,定义在crypto/x509/x509.h中,如下:
Typedef struct X509_sig_st
{
X509_ALGOR*algor;
ASN1_OCTET_STRING*digest;
}X509_SIG;
具体地,algor为摘要算法,digest用于存放摘要或者签名值。对数据进行签名时,要先对数据进行摘要计算,计算结果要通过X509_SIG结构进行DER(Distinguished Encoding Rules,可辨别编码规则)编码,然后才能用私钥进行计算,此时digest中存放的就是摘要值。
步骤502:控制智能密钥设备对传入的摘要值进行签名;
需要说明的是,在接口rsa_sign()被上层应用程序调用时,伴随该接口的被调用,摘要值通过该接口的m字段被传入;
具体地,智能密钥设备根据加载的算法密钥对传入的摘要值进行签名计算;
具体地,通过函数load_ssl_client_cert()实现算法密钥的加载。
需要说明的是,如果指定的有智能密钥设备内部的算法密钥,则使用指定ID的密钥做签名运算。
具体地,通过调用PKCS#11接口的C_SignRecoverInit()和C_SignRecover()完成签名。
需要说明的是,该传入智能密钥设备的摘要值包括进行过填充后的摘要值,硬件引擎对X509_SIG结构中经过DER编码后的摘要值进行填充,例如,1024位的RSA密钥必须填满128字节,而具体的填充方式是由用户指定的。
参见图7,验签接口rsa_verify()被上层应用程序调用时,硬件引擎执行如下操作:
其中,接口rsa_verify()的描述如下:
int(*rsa_verify)(
int type, /*摘要模式*/
const unsigned char*m, /*摘要值*/
unsigned int m_length, /*摘要值的长度*/
unsigned char*sig, /*此参数为签名值*/
unsigned int*siglen, /*签名值的长度*/
const RSA*rsa); /*RSA密钥对*/
在对具体的操作进行说明之前,需要知道的是:接口rsa_verify()被上层应用程序调用时,伴随该接口的被调用而传入的参数包括:摘要模式、摘要值、摘要值的长度、签名值、签名值的长度、RSA密钥对等。
步骤601:对传入的签名值进行公钥解密,得到摘要值;具体地,通过调用PKCS#11接口动态库中的C_DecryptInit,C_Decrypt解密传入的签名值;
步骤602:检查所获得的摘要值的摘要模式与传入的“摘要模式”是否一致,如果一致,则执行步骤603,如果不一致,操作结束;
步骤603:将加密得到的摘要值与传入的“摘要值”进行对比,一致,则验签成功,否则,验签失败。
参见图8,当加载客户端证书函数接口ENGINE_set_load_ssl_client_cert_function()被调用时,硬件引擎执行如下操作:
具体地,通过loadssl_f()函数来进行SSL客户端证书的加载和公私密钥对的操作;
代码表示如下:
int(*loadssl_f)(ENGINE*e, /*引擎*/
SSL *ssl, /*SSL*/
STACK_OF(X509_NAME)*ca_dn,/*CA颁发者名称*/
X509**pcert, /*用户证书*/
EVP_PKEY**pkey, /*公私密钥对*/
STACK_OF(X509)**pother,
UI_METHOD*ui_method,
void*callback_data);
具体地,通过设置回调函数ENGINE_set_load_ssl_client_cert_function()来进行客户端证书和公私密钥对的操作;
步骤701:从智能密钥设备中查找出证书对象;
步骤702:检查查找出的证书的用途是否是SSL客户端,如果是,执行步骤703,否则,操作结束;
这里需要说明数据结构X509_PURPOSE,该结构用于检查证书用途,定义在x509v3.h中,如下:
typedef struct x509_purpose_st
{
int purpose;
int trust;
int flags;
int(*check_purpose)(conststruct x509_purpose_st*,constX509*,int);
char*name;
char*sname;
void*usr_data;
}X509_PURPOSE;
Purpose为证书用途ID,check_purpose为检查证书用途函数;
具体地,检查证书用途时,找到对应的X509_PURPOSE,调用其check_purpose函数来判断证书用途是否合法,并通过函数X509_check_purpose(X509*x,int id,int ca)来检查证书用途,其中,x为待检查证书用途NID,ca表明x是否是ca证书。
步骤703根据查找得到的用于SSL客户端的证书,在智能密钥设备中查找到与之匹配的公私密钥对对象,如果不能找到与之匹配的证书,就报错;
步骤704:进行SSL客户端认证;
需要说明的是,在对方要求验证客户端证书时,硬件引擎才会进行SSL客户端认证的操作。
上述操作完成后,接口finish()将被上层应用程序调用,结束对智能密钥设备的使用,接口destroy_f()被上层应用程序调用,释放占用的资源;
另外,在此之后还可以通过PKCS#11接口中的函数C_CloseSession关闭硬件引擎与智能密钥设备的连接;
类似地,硬件引擎也可以通过CSP接口与智能密钥设备进行通信。如:
通过CSP接口CryptAcquireContext与智能密钥设备建立连接;
通过CSP接口CryptGetProvParam取得智能密钥设备的算法列表;
通过CSP接口CryptCreateHash(HCRYPTHASH hHash)获取签名数据的hash值;
通过CSP接口CryptSignHash进行签名;
通过CSP接口CryptVerifySignature进行验签;
通过CSP接口CryptEncrypt进行数据加密;
通过CSP接口CryptDecrypt进行数据解密;
此外,硬件引擎通过CSP接口HCRYPTKEY hKey来加载密钥;
硬件引擎通过CSP接口与智能密钥设备建立连接,在自定义命令的实现上与PKCS#11接口有少许的区别,命令如下:
(1).cspname 设置CSP名称;
(2).setxcert 设置需要的证书;
(3).setflags 设置标志;
(4).enumcontainer枚举容器(枚举签名/验签用容器或密钥交换类容器);
(5).usecontainer 选择容器;
(6).setpin 设置选择的容器的PIN码;
(7).login 登录;
(8).logout 登出;
(9).getslots 获取总的容器数量。
以上命令为自定义命令,仅供示例参考。各个命令功能需要用函数实现,由控制回调函数负责调用控制。
需要说明的是″setflags″设置标志命令。此命令设置的标志是CryptAcquireContext()函数中的标志,该标志可以是以下几个值:
1)、值说明
2)、CRYPT_VERIFYCONTEXT 设置该标志,应用不能访问私钥或公私密钥对,例如,应用只用于做哈希或对称加解密运算。
3)、CRYPT_NEWKEYSET设置该标志,创建一个新容器。
4)、CRYPT_DELETEKEYSET设置该标志,删除指定的密钥容器。
5)、CRYPT_SILENT设置该标志,CSP不显示任何用户的窗口。
需要说明的是,CSP是以容器为单位的,因此,需要提供一个枚举容器的命令,以便用户选择容器,其中,硬件引擎通过该容器来加载密钥和证书。
还需要说明的是,硬件引擎在通过CSP接口加载私钥和证书时,首先通过自定义命令所选择的容器,从该容器中取出密钥句柄,根据所述密钥句柄进行数据的加解密;
这样,通过硬件加密引擎,实现上述操作后,就可以将一些硬件加解密算法,尤其是一些未公开的,只能用硬件实现的加解密算法添加扩展到软件算法库中了。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (17)
1.一种硬件引擎的实现方法,上层应用程序通过调用所述硬件引擎的引擎绑定接口,引擎初始化接口,第一数据结构中的加解密接口、签名接口、验签接口、SSL客户端认证接口,及所述硬件引擎的引擎释放接口来实现,其特征在于,所述方法包括:
引擎初始化接口被上层应用程序调用时,硬件引擎与智能密钥设备建立连接;
引擎绑定接口被上层应用程序调用时,绑定硬件引擎,并加载算法密钥和证书,及设置第一数据结构,所述算法密钥包括公钥和私钥;
第一数据结构中的加解密接口被上层应用程序调用时,所述硬件引擎根据所述加载的算法密钥,控制所述智能密钥设备对传入的数据进行加/解密操作,并输出操作结果;
第一数据结构中的签名接口被上层应用程序调用时,所述硬件引擎根据所述加载的算法密钥,控制所述智能密钥设备对传入的摘要值进行签名操作,并返回签名结果;
第一数据结构中的验签接口被上层应用程序调用时,所述硬件引擎根据所述加载的算法密钥,控制所述智能密钥设备对传入的签名值进行解密操作,并验证所述解密得到的摘要值是否正确,正确,则验签成功,否则,验签失败;
第一数据结构中的SSL客户端认证接口被上层应用程序调用时,所述硬件引擎根据所述加载的证书,控制所述智能密钥设备进行SSL 客户端认证,并返回认证结果;
当引擎释放接口被上层应用程序调用时,所述硬件引擎结束与所述智能密钥设备的连接。
2.根据权利要求1所述的方法,其特征在于,所述引擎绑定接口、引擎初始化接口、第一数据结构、引擎释放接口具体为bind_engine接口、init接口、RSA_METHOD数据结构、destroy接口。
3.根据权利要求1所述的方法,其特征在于,所述硬件引擎通过硬件加密接口与所述智能密钥设备建立连接。
4.根据权利要求3所述的方法,其特征在于,所述硬件加密接口包括密码令牌接口或加密服务提供程序接口。
5.根据权利要求1所述的方法,其特征在于,所述绑定硬件引擎具体为:创建引擎对象;
为所述创建的引擎对象设置引擎id及引擎名称;
当上层应用程序调用所述设置的引擎id及引擎名称时,则绑定与所述引擎id及引擎名称相对应的硬件引擎。
6.根据权利要求1所述的方法,其特征在于,所述加载证书和算法密钥具体是通过load_ssl_client_cert()来完成的。
7.根据权利要求6所述的方法,其特征在于,当所述智能密钥设备中存在多张证书时,所述方法还包括:通过loadssl_f()接口及crtl_f()接口来加载证书和私钥,具体为:
当loadssl_f()接口被上层应用程序调用时,对智能密钥设备中所有的证书和密钥对进行遍历,并对所述智能密钥设备中的证书和密钥进行分组,使得证书与密钥对能够对应;在crtl_f()接口中实现设置证书命令,所述设置证书命令对所述智能密钥设备中的证书进行选择,并将选择的证书及与选择的证书相对应的密钥保存到所述硬件引擎的上下文中;通过所述load_ssl_client_cert()加载所述选择的证书及对应的算法密钥。
8.根据权利要求7所述的方法,其特征在于,所述crtl_f()接口实现操作还包括:设置硬件加密接口的名称、设置需要的证书、登录、登出、设置PIN码。
9.根据权利要求4和8所述的方法,其特征在于,当所述硬件加密接口为密码令牌时,所述crtl_f()接口实现的操作还包括:选择槽slot、通过智能密钥设备序列号选择智能密钥设备、获取总的智能密钥设备数量;
当所述硬件引擎为加密服务提供程序时,所述自定义命令还包括:枚举容器、选择容器、获取总的容器数量。
10.根据权利要求9所述的方法,其特征在于,所述硬件引擎通过所述容器加载算法密钥及证书。
11.根据权利要求1所述的方法,其特征在于,所述硬件引擎根据所述加载的算法密钥,控制所述智能密钥设备对传入的数据进行加解密操作具体包括:
对传入的数据按照设定的填充方式进行填充,所述填充方式包括:RSA PKCS1、RSA X931、RSA SSLV23或无填充方式;
进行登录检查,如果没有进行登录,则进行PIN码验证,进行登录操作,如果已登录,则控制所述智能密钥设备对所述填充后的数据进行加解密操作。
12.根据权利要求1所述的方法,其特征在于,第一数据结构中的签名接口被上层应用程序调用时,所述方法还包括:创建X509_SIG摘要结构。
13.根据权利要求1所述的方法,其特征在于,所述X509_SIG摘要结构用来存放摘要值和签名值。
14.根据权利要求1所述的方法,其特征在于,对传入的签名值进行解密操作,并验证所述解密得到的摘要值是否正确具体为:对传入的签名值进行公钥解密,并检查解密得到的摘要值的摘要模式是否 与传入的摘要模式相一致,如果一致,则将所述解密得到的摘要值与传入的摘要值进行对比,如果一致,则验签成功。
15.根据权利要求1所述的方法,其特征在于,所述硬件引擎根据所述加载的证书,控制所述智能密钥设备进行SSL客户端认证具体为:在所述智能密钥设备中查找证书对象;检查所述查找得到的证书是否是用于SSL客户端认证的,如果是,根据所述查找得到的证书,在所述智能密钥设备中查找出与之匹配的公私密钥对对象,进行SSL客户端认证。
16.根据权利要求15所述的方法,其特征在于,检查所述查找得到的证书是否是用于SSL客户端认证具体为:根据X509_PURPOSE数据结构来查找证书用途;
其中,所述X509_PURPOSE数据结构是上层应用程序中已有定义的。
17.根据权利要求1至16所述的方法,其特征在于,所述硬件引擎与所述智能密钥设备通过所述硬件加密接口进行信息的交互。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010214432 CN102055759B (zh) | 2010-06-30 | 2010-06-30 | 一种硬件引擎的实现方法 |
PCT/CN2011/072250 WO2011120421A1 (zh) | 2010-03-31 | 2011-03-29 | 加密引擎的实现方法 |
US13/635,918 US8995663B2 (en) | 2010-03-31 | 2011-03-29 | Method for implementing an encryption engine by smart key device |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010214432 CN102055759B (zh) | 2010-06-30 | 2010-06-30 | 一种硬件引擎的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102055759A true CN102055759A (zh) | 2011-05-11 |
CN102055759B CN102055759B (zh) | 2013-06-19 |
Family
ID=43959686
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201010214432 Active CN102055759B (zh) | 2010-03-31 | 2010-06-30 | 一种硬件引擎的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102055759B (zh) |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102842005A (zh) * | 2011-06-21 | 2012-12-26 | 国民技术股份有限公司 | 一种基于tsm的tspi接口的csp模块和csp实现方法 |
CN103065078A (zh) * | 2013-01-04 | 2013-04-24 | 无锡矽鼎科技有限公司 | 安卓系统用openssl引擎加载客户端证书的方法 |
CN103117862A (zh) * | 2013-02-18 | 2013-05-22 | 无锡矽鼎科技有限公司 | 用openssl的X.509数字证书验证Java证书的方法 |
CN103279715A (zh) * | 2013-05-22 | 2013-09-04 | 李凤华 | 数据库数据加解密方法及装置 |
CN103544037A (zh) * | 2013-10-29 | 2014-01-29 | 飞天诚信科技股份有限公司 | 一种支持OpenSC的软硬件驱动的实现方法 |
CN103647636A (zh) * | 2013-12-31 | 2014-03-19 | 厦门市美亚柏科信息股份有限公司 | 安全访问数据的方法及装置 |
CN104717220A (zh) * | 2015-03-25 | 2015-06-17 | 江苏物联网研究发展中心 | 基于硬件加密的控制信令安全传输方法 |
CN105122856A (zh) * | 2013-02-27 | 2015-12-02 | 惠普发展公司,有限责任合伙企业 | 为目标设备执行下一状态选择证书 |
CN105408884A (zh) * | 2013-07-26 | 2016-03-16 | 惠普发展公司,有限责任合伙企业 | 基于上下文的数据查看 |
CN105721162A (zh) * | 2016-01-30 | 2016-06-29 | 飞天诚信科技股份有限公司 | 向应用程序中自动导入数字证书的方法及装置 |
CN106060022A (zh) * | 2016-05-19 | 2016-10-26 | 杜在东 | 一种加密设备的配置方法及系统 |
CN107277018A (zh) * | 2017-06-22 | 2017-10-20 | 重庆大学 | 一种利用请求/数据聚合提高WebServer的https应用性能的方法 |
CN108234114A (zh) * | 2016-12-22 | 2018-06-29 | 中标软件有限公司 | 一种基于硬件加密算法的ssl的实现方法 |
CN109117606A (zh) * | 2018-08-08 | 2019-01-01 | 福州瑞芯微电子股份有限公司 | 设备客户端的drm标准适配方法、装置及硬件保护中间件 |
CN109981260A (zh) * | 2017-12-27 | 2019-07-05 | 航天信息股份有限公司 | 一种基于统一接口的证书密钥管理系统及方法 |
CN111800260A (zh) * | 2020-06-19 | 2020-10-20 | 深圳证券通信有限公司 | 兼容rsa及国产商用密码算法的智能密匙签名方法 |
CN111970120A (zh) * | 2020-07-27 | 2020-11-20 | 山东华芯半导体有限公司 | 一种基于openssl的加密卡安全应用机制的实现方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1592190A (zh) * | 2003-08-29 | 2005-03-09 | 三星电子株式会社 | 硬件加密引擎和加密方法 |
US20060218190A1 (en) * | 2005-03-28 | 2006-09-28 | Datallegro, Inc. | Non-invasive encryption for relational database management systems |
CN101548502A (zh) * | 2007-06-18 | 2009-09-30 | 松下电器产业株式会社 | 加密装置和加密操作方法 |
-
2010
- 2010-06-30 CN CN 201010214432 patent/CN102055759B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1592190A (zh) * | 2003-08-29 | 2005-03-09 | 三星电子株式会社 | 硬件加密引擎和加密方法 |
US20060218190A1 (en) * | 2005-03-28 | 2006-09-28 | Datallegro, Inc. | Non-invasive encryption for relational database management systems |
CN101548502A (zh) * | 2007-06-18 | 2009-09-30 | 松下电器产业株式会社 | 加密装置和加密操作方法 |
Cited By (30)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102842005A (zh) * | 2011-06-21 | 2012-12-26 | 国民技术股份有限公司 | 一种基于tsm的tspi接口的csp模块和csp实现方法 |
CN102842005B (zh) * | 2011-06-21 | 2015-06-10 | 国民技术股份有限公司 | 一种基于tsm的tspi接口的csp模块和csp实现方法 |
CN103065078A (zh) * | 2013-01-04 | 2013-04-24 | 无锡矽鼎科技有限公司 | 安卓系统用openssl引擎加载客户端证书的方法 |
CN103117862A (zh) * | 2013-02-18 | 2013-05-22 | 无锡矽鼎科技有限公司 | 用openssl的X.509数字证书验证Java证书的方法 |
CN103117862B (zh) * | 2013-02-18 | 2015-11-25 | 无锡矽鼎科技有限公司 | 用openssl的X.509数字证书验证Java证书的方法 |
CN105122856A (zh) * | 2013-02-27 | 2015-12-02 | 惠普发展公司,有限责任合伙企业 | 为目标设备执行下一状态选择证书 |
CN103279715A (zh) * | 2013-05-22 | 2013-09-04 | 李凤华 | 数据库数据加解密方法及装置 |
CN105408884A (zh) * | 2013-07-26 | 2016-03-16 | 惠普发展公司,有限责任合伙企业 | 基于上下文的数据查看 |
US10027632B2 (en) | 2013-07-26 | 2018-07-17 | Hewlett Packard Enterprise Development Lp | Data view based on context |
CN105408884B (zh) * | 2013-07-26 | 2019-03-29 | 慧与发展有限责任合伙企业 | 基于上下文的数据查看 |
CN103544037A (zh) * | 2013-10-29 | 2014-01-29 | 飞天诚信科技股份有限公司 | 一种支持OpenSC的软硬件驱动的实现方法 |
CN103544037B (zh) * | 2013-10-29 | 2016-08-17 | 飞天诚信科技股份有限公司 | 一种支持OpenSC的软硬件驱动的实现方法 |
US10133882B2 (en) | 2013-10-29 | 2018-11-20 | Feitian Technologies Co., Ltd. | Implementation method for driving of software and hardware supporting OpenSC |
CN103647636B (zh) * | 2013-12-31 | 2016-08-24 | 厦门市美亚柏科信息股份有限公司 | 安全访问数据的方法及装置 |
CN103647636A (zh) * | 2013-12-31 | 2014-03-19 | 厦门市美亚柏科信息股份有限公司 | 安全访问数据的方法及装置 |
CN104717220A (zh) * | 2015-03-25 | 2015-06-17 | 江苏物联网研究发展中心 | 基于硬件加密的控制信令安全传输方法 |
CN104717220B (zh) * | 2015-03-25 | 2018-09-21 | 江苏物联网研究发展中心 | 基于硬件加密的控制信令安全传输方法 |
CN105721162B (zh) * | 2016-01-30 | 2019-03-05 | 飞天诚信科技股份有限公司 | 向应用程序中自动导入数字证书的方法及装置 |
CN105721162A (zh) * | 2016-01-30 | 2016-06-29 | 飞天诚信科技股份有限公司 | 向应用程序中自动导入数字证书的方法及装置 |
CN106060022A (zh) * | 2016-05-19 | 2016-10-26 | 杜在东 | 一种加密设备的配置方法及系统 |
CN106060022B (zh) * | 2016-05-19 | 2019-05-10 | 北京云钥网络科技有限公司 | 一种加密设备的配置方法及系统 |
CN108234114A (zh) * | 2016-12-22 | 2018-06-29 | 中标软件有限公司 | 一种基于硬件加密算法的ssl的实现方法 |
CN107277018A (zh) * | 2017-06-22 | 2017-10-20 | 重庆大学 | 一种利用请求/数据聚合提高WebServer的https应用性能的方法 |
CN109981260A (zh) * | 2017-12-27 | 2019-07-05 | 航天信息股份有限公司 | 一种基于统一接口的证书密钥管理系统及方法 |
CN109117606A (zh) * | 2018-08-08 | 2019-01-01 | 福州瑞芯微电子股份有限公司 | 设备客户端的drm标准适配方法、装置及硬件保护中间件 |
CN109117606B (zh) * | 2018-08-08 | 2020-10-09 | 瑞芯微电子股份有限公司 | 设备客户端的drm标准适配方法、装置及硬件保护中间件 |
CN111800260A (zh) * | 2020-06-19 | 2020-10-20 | 深圳证券通信有限公司 | 兼容rsa及国产商用密码算法的智能密匙签名方法 |
CN111800260B (zh) * | 2020-06-19 | 2022-12-09 | 深圳证券通信有限公司 | 兼容rsa及国产商用密码算法的智能密匙签名方法 |
CN111970120A (zh) * | 2020-07-27 | 2020-11-20 | 山东华芯半导体有限公司 | 一种基于openssl的加密卡安全应用机制的实现方法 |
CN111970120B (zh) * | 2020-07-27 | 2024-03-26 | 山东华芯半导体有限公司 | 一种基于openssl的加密卡安全应用机制的实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102055759B (zh) | 2013-06-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102055759B (zh) | 一种硬件引擎的实现方法 | |
US8995663B2 (en) | Method for implementing an encryption engine by smart key device | |
CN110933108B (zh) | 基于区块链网络的数据处理方法、装置、电子设备及存储介质 | |
CN101459506B (zh) | 密钥协商方法、用于密钥协商的系统、客户端及服务器 | |
US6892301B1 (en) | Method and system for securely handling information between two information processing devices | |
CN101820342B (zh) | 硬件加密引擎的实现方法 | |
US20060206433A1 (en) | Secure and authenticated delivery of data from an automated meter reading system | |
US9705683B2 (en) | Verifiable implicit certificates | |
JP7232816B2 (ja) | 資産を認証する認証システム及び認証方法 | |
US20220141039A1 (en) | Certificate based security using post quantum cryptography | |
CN112398826B (zh) | 基于国密的数据处理方法、装置、存储介质及电子设备 | |
US11582045B2 (en) | Combined digital signature algorithms for security against quantum computers | |
CN107395368A (zh) | 无介质环境中的数字签名方法及解密封方法与解密方法 | |
CN109194474A (zh) | 一种数据传输方法及装置 | |
WO2022142837A1 (en) | Hybrid key derivation to secure data | |
CN101557286A (zh) | 安全传输系统及方法 | |
JP2020506627A (ja) | プログラマブル・ハードウェア・セキュリティ・モジュール及びプログラマブル・ハードウェア・セキュリティ・モジュールに用いられる方法 | |
CN115208615A (zh) | 一种数控系统数据加密传输方法 | |
CN108574687A (zh) | 一种通信连接建立方法、装置及电子设备 | |
JPH0974408A (ja) | 秘話通信方法 | |
CN111490876B (zh) | 一种基于usb key的通信方法和usb key | |
RU2707398C1 (ru) | Способ и система защищенного хранения информации в файловых хранилищах данных | |
JPS63176043A (ja) | 秘密情報通信方式 | |
KR20020087896A (ko) | 결정적 디피-헬만군에서id에 기반한 디지털 서명 및 그인증 방법 | |
McLoughlin et al. | Full Post-Quantum Datagram TLS Handshake in the Internet of Things |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |