利用ENGINE替换OPENSSL中的加解密算法

摘要:
将OPENSSL中的文件替换为ENGINE:pkcs11_ENGINE。Zip大小:332KB下载:下载1:ENGINE用途:ENGINE是OPENSSL保留的第三方加密库。它主要包括动态库加载的代码和一系列用于加密函数指针管理的接口。这样,当您的应用程序调用加密和解密算法时,它将指向您加载的动态库中的加密和解密,而不是原始OPENSSL libeay32.dll库中的密码和解密算法。

利用ENGINE

替换OPENSSL中的

利用ENGINE替换OPENSSL中的加解密算法第1张
文件:pkcs11_engine.zip
大小:332KB
下载:下载

一:ENGINE的目的:

ENGINEOPENSSL预留的加载第三方加密库,主要包括了动态库加载的代码和加密函数指针管理的一系列接口。如果要使用Engine(假设你已经加载上该Engine了),那么首先要LoadEngine(比如ENGINE_load_XXXX),然后选择要使用的算法或者使用支持的所有加密算法(有相关函数)。这样你的应用程序在调用加解密算法时,它就会指向你加载的动态库里的加解密算法,而不是原先的OPENSSLlibeay32.dll库里的加解密算法。

二:ENGINE原理:

使用你自己编译的加解密动态库里的函数的指针或硬件接口指针来替换OPENSSL

中默认的加解密函数,类似于HOOK,这样实现动态加载第三方密码库;

三:ENGINE操作流程:

例如替换RSA

NO.1声明你要替换的函数名称和其它内部使用的函数

NO.2声明RSA_Method结构,要替换的函数就提供函数名,不提换就是NULL

了,还有其它的类型也要填上;

NO.3利用Engine_init等一系列函数初始化ENGINE库(其实上就是在初始化加

解密算法),主要是绑定特定的函数指针(自定义)和结构或初始化硬件设备等等操作;

Engine_finish也是一样,做一些清理工作;

NO.4实现真正的接口,包括RSA密钥结构的转换,如果是不能取出的私钥,要

保存硬件设备提供的指针(通常是HANDLE)等等操作。然后调用硬件的加密解密函数。

四:程序实例:(实现ENGINE

NO.1声明函数名称

static int rsaref_private_decrypt(int len, const unsigned char *from, unsigned char *to, RSA *rsa, int padding);

NO.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

};

NO.3代码实现

static int rsaref_private_decrypt(int len, const unsigned char *from, unsigned char *to, RSA *rsa, int padding)

{

//真实代码

}

NO.4初始化ENGINE

static int bind_rsaref(ENGINE *e)

{

if(!ENGINE_set_id(e, engine_rsaref_id)

|| !ENGINE_set_name(e, engine_rsaref_name)

|| !ENGINE_set_RSA(e, &rsaref_rsa)

)

return 0;

return 1;

}

int bind_helper(ENGINE *e, const char *id)

{

if(id && (strcmp(id, engine_rsaref_id) != 0))

return 0;

if(!bind_rsaref(e))

return 0;

return 1;

}

__declspec( dllexport ) void ENGINE_load_rsaref(void)

{

ENGINE *toadd = engine_rsaref();

if(!toadd)

return;

ENGINE_add(toadd);

}

五:操作ENGINE(使用ENGINE)

NO.1加载ENGINE

一般是调用动态库中的ENGINE_load_XXXX(例子中是ENGINE_load_rsare),把ENGINE对象加载到系统中,其实就是在ENGINE对象和RSA的结构里了ENGINE对象(参见RSA结构中的ENGINE定义)建立了一个关联,这样在用到RSA算法时如果RSA中的ENGINE对象为NULL,则调用默认的加解密算法,否则调用ENGINE对象里的加解密算法。

NO.2指定你所需要的ENGINE

应用程序中可能要用到不只一个ENGINE接口,它们按链表的形式组织在一起,

这样你就需要指定你需要的ENGINE接口;例:ENGINE*e = ENGINE_by_id("rsaref");

返回的ENGINE对象里就指向你自定义的加解密接口。

NO.3选择算法

ENGINE_set_default(ENGINE *e, int Flag)

Flag Description

ENGINE_METHOD_ALL使用所有存在的算法(默认)

ENGINE_METHOD_RSA 仅使用RSA算法

ENGINE_METHOD_DSA 仅使用DSA算法

ENGINE_METHOD_DH 仅使用DH算法

ENGINE_METHOD_RAND 仅使用随机数算法

ENGINE_METHOD_CIPHERS仅使用对称加解密算法

ENGINE_METHOD_DIGESTS仅使用摘要算法

NO.4使用加解密算法

使用ENGINE替换了算法后不影响原用或现用所有对加解密函数的调用操作。

免责声明:文章转载自《利用ENGINE替换OPENSSL中的加解密算法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux命令学习(2):wc 命令samba下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

X509证书中RSA公钥的提取与载入

原文链接:http://blog.chinaunix.net/uid-16515626-id-2741894.html 由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等功能。在项目模型中公私钥对是用户自己产生的,并且以16进制数的形似提交给CA。我们知道,通常利用openssl颁发证书时,公私钥对往往也是由openssl产生的,比...

Java学习资源整理(超级全面)

这里整理一些自己平常搜集的比较好的关于Java的学习资源,主要包括博客站点、书籍、课程等。 了解Java最新资讯 这部分主要是了解与Java相关的动态以及信息,能够拓展我们的视野以及寻找一些好的idea。每天早晚都可以刷一刷,可以说是每日必逛。下面列出我采取的几种方式。 1.关注twitter上的Java组织以及大牛 许多大牛或公司会在twitter上发布...

使用 openssl 生成证书

转自:http://www.cnblogs.com/littleatp/p/5878763.html使用 openssl 生成证书  一、openssl 简介 openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。官网:https://www.openssl.org/sourc...

[转]C/C++:构建你自己的插件框架

本文译自GigiSayfan在DDJ上的专栏文章。GigiSayfan是北加州的一个程序员,email:gigi@gmail.com. 本文是一系列讨论架构、开发和部署C/C++跨平台插件框架的文章的 第一篇 第一部分探索了一下现状,调查了许多现有的插件/组件库,深入研究了二进制兼容问题,并展现了一些该方案必要的一些属性。 后续的文章用一个例子展示了可用于...

fitnesse如何编辑用例

1.测试代码: 2.编写用例 (1)新建目录 点击“edit”,编辑内容: !1 测试  * '''[[算法][TestDemo]]''' * '''[[算法2][TestDemo2]]''' 上面的第一个中括号里的内容就是你在页面中可以看到的目录名称,第二个中括号的内容是将会成为url的路径   效果如下:   带有?号,如上面的“算法?”表示在算法...

OpenSSL简单介绍及在Windows、Linux、Mac系统上的编译步骤

OpenSSL介绍:OpenSSL是一个强大的安全套接字层password库,囊括基本的password算法、经常使用的密钥和证书封装管理功能及SSL协议。并提供丰富的应用程序供測试或其他目的使用。 SSL是SecureSockets Layer(安全套接层协议)的缩写,能够在Internet上提供秘密性传输。其目标是保证两个应用间通信的保密性和可靠性,...