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

2021-06-20 03:14:58 字數 2989 閱讀 9384

利用engine

替換openssl中的

檔案:pkcs11_engine.zip

大小:332kb

一:engine的目的:

engine是openssl預留的載入第三方加密庫,主要包括了動態庫載入的**和加密函式指標管理的一系列介面。如果要使用engine(假設你已經載入上該engine了),那麼首先要load該engine(比如engine_load_***x),然後選擇要使用的演算法或者使用支援的所有加密演算法(有相關函式)。這樣你的應用程式在呼叫加解密演算法時,它就會指向你載入的動態庫里的加解密演算法,而不是原先的openssl的libeay32.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_***x(例子中是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中的加解密演算法

利用engine替換openssl中的加解密演算法 一 engine的目的 engine 是openssl 預留的載入第三方加密庫,主要包括了動態庫載入的 和加密函式指標管理的一系列介面。如果要使用 engine 假設你已經載入上該 engine 了 那麼首先要 load 該engine 比如eng...

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

一 engine的目的 engine是openssl預留的載入第三方加密庫,主要包括了動態庫載入的 和加密函式指標管理的一系列介面。如果要使用engine 假設你已經載入上該engine了 那麼首先要load該engine 比如engine load x 然後選擇要使用的演算法或者使用支援的所有加密...

Linux 下利用trash替換rm

linux 下利用trash替換rm rmtrash 是linux和mac下命令列版本rm的 站,安裝後對使用者透明,符合正常使用rm的習慣 支援rm fr file哦 有了他再也不怕rm時候手顫抖了 能自動拒絕 rm fr 哦 1 wget no check certificate 2 mv rm...