http://www.paper.edu.cn
用 ENGINE 替换 OPENSSL 中的加解密算法
廖德强1 迟忠先2
1大连理工大学 软件学院 软件工程实验室,大连,116024
2大连理工大学 电信学院 软件工程实验室,大连,116024
Email:kprc@163.com
摘 要:在使用 OPENSSL 进行加解密开发时,会用到一些特殊目的的算法,但这个算法往往
在 OPENSSL 加解密库中无法找到。本文介绍一种利用 ENGINE 加载你自己设计的加解密算法
库的方法,来实现特殊目的的加解密。实验表明,利用这种方法能有效的使用算法,并能避
开一些算法的专利,符合国家对加解密算法的标准。
关键词:ENGINE,OPENSSL,加密,解密。
1. 介绍
OpenSSL 项目是一个开放源代码安全项
目,它的目标是开发一个健壮的、商业级的、
完整的开放源代码的工具包,用强大的加密
算 法 来 实 现 安 全 的 Socket 层 ( Secure
Sockets Layer,SSL v2/v3)和传输层的安
全性(Transport Layer Security,TLS v1)。
它包含了完整的加密算法,数字签名算法及
证书算法等。可以很好地保证数据的完整,
保密和正确性。OpenSSL 可以和于商业用途,
但是使用者应该考虑自己所使用的算法有
没有受到本国专利的限制以及考虑是否符
合国家制定的标准[1]。
OpenSSL ENGINE 能使用用户自己编译
的加解密动态库里的函数的指针或硬件接
口指针来替换 OPENSSL 中默认的加解密函
数,类似于 HOOK 的原理,用这种方法实现
动态加载第三方密码库[1,4]。
ENGINE 是 OPENSSL 预留的用以加载第
三方加密库引擎,主要包括了动态库加载的
代 码 和 加 密 函 数 指 针 管 理 的 一 系 列 接 口
[2]。如果要使用 Engine(假设你已经加载
上 该 Engine 了 ) , 那 么 首 先 要 加 载 该
Engine(比如 ENGINE_load_XXXX),然后选择
要使用的算法或者使用支持的所有加密算
法(有相关函数)。这样你的应用程序在调
用加解密算法时,它就会指向你加载的动态
库里的加解密算法,而不是原先的 OPENSSL
的 libeay32.dll 库里的加解密算法[3]。
2. 传统方法
1
传统方法是开发者自定义一种加解密
算法,做成一个库文件,在使用时,用户不
能使用 OPENSSL 提供的方法进行初始化,提
取密钥等已经定义好的函数,这等于抛弃了
OPENSSL 现有的一套开发框架,这种开发方
法,开发时间长,风险高,不利于项目的预
期[1]。
在 文 章 的 下 面 , 将 介 绍 一 种 利 用
OPENSSL ENGINE 的方法的开发方法,这种方
法,完全在 OPENSSL 的框架内实现,使得开
发加解密项目更快,更合理。
3. 使用 ENGINE 的步骤
(1)声明你要替换的函数名称和其它内部
使用的函数;
(2)声明 Method 结构,要替换的函数就提
供函数名,不替换可以用 NULL,填上其
它类型;
(3)利用 Engine_init 等一系列函数初始
化 ENGINE 库(即初始化加解密算法),
主要是绑定特定的函数指针(自定义)
和结构或初始化硬件设备等操作;
Engine_finish 也是一样,做一些清理
工作;
(4)实现真正的接口,包括密钥结构的转
换,如果是不能取出的私钥,要保存
硬件设备提供的指针(通常是 HANDLE)
等等操作。然后调用硬件的加密解密
函数。
4. 实现 ENGINE
在开发加解密及数字认证时,经常要把
自己开发的到算法加到应用中。下面以替换
RSA 为例,介绍一种可靠的方法。
4.1 声明函数名称
static int rsaref_private_decrypt
(int len, const unsigned char *from,
unsigned char *to, RSA *rsa, int
padding);
4.2 声明 RSA_Method 结构
static RSA_METHOD rsaref_rsa ={
"RSAref PKCS#1 RSA",
NULL,
NULL,
rsaref_private_encrypt,
NULL,
NULL,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
NULL
};
4.3 代码实现
static int rsaref_private_decrypt
(int len, const unsigned char *from,
unsigned char *to, RSA *rsa, int
padding)
{
//Real Code
}
4.4 初始化 ENGINE
static int bind_rsaref(ENGINE *e){
if(!ENGINE_set_id(e, engine_rsaref_id)
||!ENGINE_set_name(e,engine_rsaref_na
me)
|| !ENGINE_set_RSA(e, &rsaref_rsa)
)
return 0;
return 1;
}
int bind_helper(ENGINE *e, const char
*id)
2
http://www.paper.edu.cn
(strcmp(id,
&&
{
if(id
engine_rsaref_id) != 0))
return 0;
if(!bind_rsaref(e))
return 0;
return 1;
}
__declspec(
dllexport
ENGINE_load_rsaref(void)
{
ENGINE *toadd = engine_rsaref();
if(!toadd)
return;
ENGINE_add(toadd);
}
5. 使用 ENGINE
5.1 加载 ENGINE
)
void
一 般 是 调 用 动 态 库 中 的
ENGINE_load_XXXX( 例 子 中 是
ENGINE_load_rsare),把 ENGINE 对象加载
到系统中,即在 ENGINE 对象和 RSA 的结构
里的 ENGINE 对象[3]建立了一个关联,使用
这种方法,使 ENGINE 能够智能的判断是使
用自定义的加解密算法,还是使用默认的加
解密算法[5,6]。
5.2 指定你所需要的 ENGINE
应 用 程 序 中 可 能 要 用 到 不 只 一 个
ENGINE 接口,它们按链表的形式组织在一
起,这样就需要指定需要的 ENGINE 接口。
如:ENGINE *e = ENGINE_by_id("rsaref"),
返回的 ENGINE 对象里就指向你自定义的加
解密接口[5,6]。
5.3 选择算法
可以使用下面的方法来使用你所定义
的算法。
ENGINE_set_default(ENGINE *e, int Flag)
其中 Flag 的说明如下:
ENGINE_METHOD_ALL 使用所有存在的算法
(默认)
ENGINE_METHOD_RSA 仅使用 RSA 算法
ENGINE_METHOD_DSA 仅使用 DSA 算法
ENGINE_METHOD_DH 仅使用 DH 算法
http://www.paper.edu.cn
ENGINE_METHOD_RAND 仅使用随机数算法
ENGINE_METHOD_CIPHERS 仅 使 用 对 称 加 解
密算法
ENGINE_METHOD_DIGESTS 仅使用摘要算法
5.4 使用加解密算法
使用 ENGINE 替换了算法后不影响原用
或现用所有对加解密函数的调用操作,详细
的操作可以查看文献[7]提供的 Demos。
6. 总结
本 文 给 出 使 用 ENGINE 有 效 替 换
OPENSSL 中现有的所有的加密算法,使用这
个特性也可以很好的加入一些 OPENSSL 中所
没有的加解密算法,这使开发加解密算法的
应用程序更加简便,相对于传统的开发方法
是一个有效稳妥的方法。
参考文献
[1] 谢冬青 冷健 编著。《PKI Principle and Technology》 PKI 原理与技术。清华大学出版社,2004
[2] Douglas E. Engert. Using OpenSSL ENGINE to get Certificate from Smartcard. http://www.stacken.kth.se/lists
/heimdal-discuss/2005-04/msg00006.html, 2004
[3] OpenSSL Documents crypto。ENGINE in RSA。http://www.openssl.org/docs/crypto/cry pto.html
[4] 王志海。《OpenSSL 与网络信息安全——基础、结构和指令》。中国 OpenSSL 专业论坛,2001
[5] Blair Christensen. Hardware Crypto Support w/ openssl-engine (ITS#1339). http://www.openldap.org/lists/
openldap-bugs/200109/msg00085.html,2001
[6] Erwann Abalea. Proposed patch to allow OpenSSL/ENGINE operations. http://www.aleksey.com/pipermail
/xmlsec/2005/002723.html, 2005
[7] OpenSSL Source Engine 中的 Demos。Openssl-engine-0.9.6
Use ENGINE to Replace De-Encrypt Algorithm in OpenSSL
DeQiang LIAO1 ZhongXian CHI2
1 Department of Electron Information engineering ,
2 DaLian University of Techonology, Dalian, PRC,116024
Abstract
This paper provides a method to replace the algorithm in OpenSSL. In software development,
usually use the encryption and decode to protect the important data. But developer are favorite to
use exceptive algorithm to protect the data. Use this method is useful and effective.
Keywords: ENGINE OpenSSL Encrypt Decode
作者简介:廖德强,男,1979 年生,硕士研究生,主要方向网络安全(PKI),嵌入式应用。
3