




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OPENSSL ENGINE 机制1.概念OpenSSL 项目Ope nSS是一个开放源代码安全项目,它的目标是开发一个健壮的、商业级的、完整的开 放源代码的工具包,用强大的加密算法来实现安全的Socket层(Secure Sockets Laye,SSLv2/v3)和传输层的安全性(Tran sport Layer Security, TLS v1 )。它包含了完整的加密算法, 数字签名算法及证书算法等。可以很好地保证数据的完整,保密和正确性。Ope nSSL可以和于商业用途,但是使用者应该考虑自己所使用的算法有没有受到本国专利的限制以及考虑是 否符合国家制定的标准。Engine机制Engi
2、ne机制的出现是在 OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持 Engine的版本分 开的,到了 OpenSSL的0.9.7版,Engine机制集成到了 OpenSSL的内核中,成为了 OpenSSL不可缺少的 一部分。Engine机制目的是为了使 OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行 加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加 密设备更OpenSSL协调工作,需要写少量的接口代码,
3、但是这样的工作量并不大,虽然还是需要一点密码 学的知识。Engine机制的功能跟Windows提供的CSP功能目标是基本相同的。目前,OpenSSL的0.9.7版本支持的内嵌第三方加密设备有 8种,包括:CryptoSwift、 nCipher、Atalla、Nuron、UBSEC、Aep、SureWare 以及 IBM 4758 CCA 的硬件加密设备。现 在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。 当然,所有上述Engine接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。表1是OpenSSL-0.9.7版本支持的硬件及其
4、对应的简要描述名称,这个简要描述名称在很多时候是要使用的,如编程或执行命令的时候,简要密钥名称是大小写敏感的,目前一般都 是采用小写字符。Open SSL支 持的 En gi ne 接口简要名称Engine接口描述dyn amic动态加载Engine设备的接口cswiftCryptoSwift 的硬件加密设备 Engine支持chilnChipher硬件加密设备Engine支持atallaAtalla 硬件加密设备Engine支持nuronNuron硬件加密设备Engine支持ubsecUBSE(硬件加密设备Engine支持aepAep硬件加密设备Engine支持surewareSureWar
5、e硬件加密设备Engine支持4758ccaIBM 4758 CCA硬件加密设备 Engine支持2.实现ENGINE是OPENSS预留的用以加载第三方加密库引擎,主要包括了动态库加载的代码和 加密函数指针管理的一系列接口。如果要使用Engine (假设你已经加载上该 Engine 了),那么首先要加载该Engine(比如ENGINE_load_XXXX)然后选择要使用的算法或者使用支持的 所有加密算法(有相关函数)。这样你的应用程序在调用加解密算法时,它就会指向你加载 的动态库里的加解密算法,而不是原先的OPENSS的库里的加解密算法。上面提到的一些 engine的实现在openssl/cr
6、ypto/engine/目录下可以找到,来分析一下具体的实现:首先,每一个ENGINEoad_XXX其实就是一个Engine的加载过程:如:void ENGINEoad_rtl8651b(void)ENGINE *en gi ne = ENGINE_new();if (en gi ne = NULL)return;if (!ENGINE_set_id(e ngi ne, "rtl8651b") |!ENGINE_set_name(e ngi ne, "BSD rtl8651b en gi ne") |!ENGINE_set_ciphers(e ngi n
7、e, rtl8651b_e ngin e_ciphers)|!ENGINE_set_digests(e ngine, rtl8651b_e ngin e_digests)|!ENGINE_set_ctrl_fu nctio n(en gi ne, rtl8651b_ctrl) |!ENGINE_set_cmd_defns(e ngi ne, rtl8651b_defns)ENGINE_free(e ngi ne);return;if(!ENGINE_set_default(engine, ENGINE_METHOD_DIGESTS) )ENGINE_add(engine);ENGINE_fre
8、e(engine);ERR_clear_error();类似ENGINE_set_xxxx的函数是对engine机制各个方面的设定注册,有下面这些:int ENGINE_set_id(ENGINE *e, const char *id);int ENGINE_set_name(ENGINE *e, const char *name);int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth);int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth);int ENGINE_set_D
9、H(ENGINE *e, const DH_METHOD *dh_meth);int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth);int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f);int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f);int ENGINE_set_finish_function(ENGINE *e, ENGINE_G
10、EN_INT_FUNC_PTR finish_f);int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f);int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f);int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f);int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHER
11、S_PTR f);int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f);int ENGINE_set_flags(ENGINE *e, int flags);int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns); 由此可知,具体的(RSA, DSA , DH , RAND , CHIPHERS, DIGESTS)算法实现主要是这 些函数实现的。以DIGEST助例:首先要声明一个对应的数据结构(MD5 :const EVP_MD rtl8651b_hash_md
12、5=NID_md5,NID_md5WithRSAEncryption,MD5_DIGEST_LENGTH,NULL,rtl8651b_digest_init,rtl8651b_digest_update,rtl8651b_digest_final,NULL,NULL,EVP_PKEY_RSA_method,MD5_CBLOCK,sizeof(RTL_DIGEST_CTX)/* how big does the ctx->md_data need to be */;具体的各项的含义,请参考 EVP_M数据结构。这里 rtl8651b_digest_init, rtl8651b_digest
13、_update, rtl8651b_digest_final,就是具体的算法实现。如果都完成了,则可以调用动态库中的ENGINE_load_XXXX例子中是ENGINE_load_rtl8651b),把ENGINE对象加载到系统中,即在 ENGINE对象和DIGESTS勺结构里的ENGINE 对象建立了一个关联,使用这种方法,使ENGINE能够智能的判断是使用自定义的加解密算法, 还是使用默认的加解密算法。ENGINE_load_ rtl8651b 中,我们可以使用下面的方法来使用你所定义的算法。ENGINE_set_default(ENGINE *e, int Flag)其中 Flag 的说明如下:ENGINE_METHOD_A使用所有存在的算法(默认)ENGINE_METHOD_R仅使用 RSA算法ENGINE_METHOD_DS使用 DSA算法ENGINE_METHOD_D使用 DH算法ENGINE_METHOD_RAN使用随机数算法EN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025企业购车借款合同模板
- 009、基础钢筋施工方案
- 预算执行监督制度计划
- 2024年12月物流行业合同台账异常事件响应流程
- 民宿安全管理与客户保障方案计划
- 吸收行业知识的阅读计划
- 2025年聚L-乳酸项目建议书
- 降低企业财务成本的策略计划
- 职业培训的课程开发与安排计划
- 数字遗产保护与图书馆的角色计划
- 学前儿童游戏自考复习资料考纲
- 儿童抽动症的诊断与治疗
- 《村居》获奖版 教学课件
- 无菌技术操作PPT
- 周版正身图动作详解定稿201503剖析
- 第6章工厂布局设计课件
- 叉车定期检验研究分析报告
- 雷达生命探测仪培训-PPT课件
- 光缆和管道的施工规范标准
- (高清版)建筑工程裂缝防治技术规程JGJ_T 317-2014
- 陕西沉积钒矿勘查规范(1)
评论
0/150
提交评论