1. 程式人生 > >OpenSSL之EVP(二)——EVP系列函式介紹

OpenSSL之EVP(二)——EVP系列函式介紹

EVP系列函式

摘要函式

典型的摘要函式主要有:
1) EVP_md5
返回 md5 的 EVP_MD。
2) EVP_sha1
返回 sha1 的 EVP_MD。
3) EVP_sha256
返回 sha256 的 EVP_MD。
4) EVP_DigestInit
摘要初使化函式,需要有 EVP_MD 作為輸入引數。
5) EVP_DigestUpdate 和 EVP_DigestInit_ex
摘要 Update 函式,用於進行多次摘要。
6) EVP_DigestFinal 和 EVP_DigestFinal_ex
摘要 Final 函式,使用者得到最終結果。
7) EVP_Digest
對一個數據進行摘要,它依次呼叫了上述三個函式。

對稱加解密函式

典型的加解密函式主要有:
1) EVP_CIPHER_CTX_init
初始化對稱計算上下文。
2) EVP_CIPHER_CTX_cleanup
清除對稱演算法上下文資料, 它呼叫使用者提供的銷燬函式銷清除內部金鑰以及其他資料。
3) EVP_des_ede3_ecb
返回一個 EVP_CIPHER;
4) EVP_EncryptInit 和 EVP_EncryptInit_ex
加密初始化函式,本函式呼叫具體演算法的 init 回撥函式,將外送金鑰 key 轉換為內部金鑰形式,將初始化向量 iv 拷貝到 ctx 結構中。
5) EVP_EncryptUpdate
加密函式,用於多次計算,它呼叫了具體演算法的 do_cipher 回撥函式。
6) EVP_EncryptFinal 和 EVP_EncryptFinal_ex
獲取加密結果,函式可能涉及填充,它呼叫了具體演算法的do_cipher 回撥函式。
7) EVP_DecryptInit 和 EVP_DecryptInit_ex
解密初始化函式。
8) EVP_DecryptUpdate
解密函式,用於多次計算,它呼叫了具體演算法的 do_cipher 回撥函式。
9) EVP_DecryptFinal 和 EVP_DecryptFinal_ex
獲取解密結果,函式可能涉及去填充,它呼叫了具體演算法的do_cipher 回撥函式。
10) EVP_BytesToKey
計算金鑰函式,它根據演算法型別、摘要演算法、 salt 以及輸入資料計算出一個對稱金鑰和初始化向量 iv。
11) PKCS5_PBE_keyivgen 和 PKCS5_v2_PBE_keyivgen
實現了 PKCS5 基於口令生成金鑰和初始化向量的演算法。
12) PKCS5_PBE_add
載入所有 openssl 實現的基於口令生成金鑰的演算法。
13) EVP_PBE_alg_add
新增一個 PBE 演算法。

對稱加密過程

對稱加密過程如下:

1) EVP_EncryptInit:

設定 buf_len 為 0,表明臨時緩衝區 buf 沒有資料。

2) EVP_EncryptUpdate:

ctx 結構中的 buf 緩衝區用於存放上次 EVP_EncryptUpdate 遺留下來的未加密的資料, buf_len 指明其長度。如果 buf_len 為 0,加密的時候先加密輸入資料的整數倍,將餘下的資料拷貝到 buf 緩衝區。如果 buf_len 不為 0,先加密 buf 裡面的資料和輸入資料的一部分(湊足一個分組的長度),然後用上面的方法加密,輸出結
果是加過密的資料。

3) EVP_ EncryptFinal

加密 ctx 的 buf 中餘下的資料,如果長度不夠一個分組(分組長度不為 1),則填充,然後再加密,輸出結果。
總之,加密大塊資料(比如一個大的檔案,多出呼叫 EVP_EncryptUpdate)的結果等效於將所有的資料一次性讀入記憶體進行加密的結果。加密和解密時每次計算的資料塊的大
小不影響其運算結果。

非對稱函式

典型的非對稱函式有:
1) EVP_PKEY_encrypt
公鑰加密。
2) EVP_PKEY_decrypt
私鑰解密。
3) EVP_PKEY_assign
設定 EVP_PKEY 中具體的金鑰結構,使它代表該金鑰。
4) EVP_PKEY_assign_RSA/ EVP_PKEY_set1_RSA
設定 EVP_PKEY 中的 RSA 金鑰結構,使它代表該 RSA 金鑰。
5) EVP_PKEY_get1_RSA
獲取 EVP_PKEY 的 RSA 金鑰結構。
6) EVP_SignFinal
簽名操作,輸入引數必須有私鑰(EVP_PKEY)。
7) EVP_VerifyFinal
驗證簽名,輸入引數必須有公鑰(EVP_PKEY)。
8) int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,const unsigned
char *ek, int ekl, const unsigned char *iv,EVP_PKEY *priv)
解數字信封初始化操作,type為對稱加密演算法,ek為金鑰密文,ekl為密
鑰密文長度,iv為填充值,priv為使用者私鑰。
9) EVP_OpenUpdate
做解密運算。
10) EVP_OpenFinal
做解密運算,解開數字信封。
11) int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, unsigned char **ek,int *ekl, unsigned char *iv, EVP_PKEY **pubk, int npubk)
type為對稱演算法,ek陣列用來存放多個公鑰對金鑰加密的結果,ekl用於存放ek陣列中每個金鑰密文的長度,iv為填充值,pubk陣列用來存放多個公鑰,npubk為公鑰個數,本函式用多個公鑰分別加密金鑰,並做加密初始化。
12)EVP_SealUpdate
做加密運算。
13)EVP_SealFinal
做加密運算,製作數字信封。

BASE64 編解碼函式

1) EVP_EncodeInit
BASE64 編碼初始化。
2) EVP_EncodeUpdate
BASE64 編碼,可多次呼叫。
3) EVP_EncodeFinal
BASE64 編碼,並獲取最終結果。
4) EVP_DecodeInit
BASE64 解碼初始化。
5) EVP_DecodeUpdate
輸入資料長度不能大於 80 位元組。 BASE64 解碼可多次呼叫,注意,本函式的輸入資料不能太長。
6) EVP_DecodeFinal
BASE64 解碼,並獲取最終結果。
7) EVP_EncodeBlock
BASE64 編碼函式,本函式可單獨呼叫。
8) EVP_DecodeBlock
BASE64 解碼,本函式可單獨呼叫,對輸入資料長度無要求。

其他函式

1) EVP_add_cipher
將對稱演算法加入到全域性變數,以供呼叫。
2) EVP_add_digest
將摘要演算法加入到全域性變數中,以供呼叫
3) EVP_CIPHER_CTX_ctrl
對稱演算法控制函式,它呼叫了使用者實現的 ctrl 回撥函式。
4) EVP_CIPHER_CTX_set_key_length
當對稱演算法金鑰長度為可變長時,設定對稱演算法的金鑰長度。
5) EVP_CIPHER_CTX_set_padding
設定對稱演算法的填充,對稱演算法有時候會涉及填充。加密分組長度大於一時,使用者輸入資料不是加密分組的整數倍時,會涉及到填充。填充在最後一個分組來完成, openssl 分組填充時,如果有 n 個填充,則將最後一個分組用 n 來填滿。
6) EVP_CIPHER_get_asn1_iv
獲取原始 iv,存放在 ASN1_TYPE 結構中。
7) EVP_CIPHER_param_to_asn1
設定對稱演算法引數,引數存放在 ASN1_TYPE 型別中,它呼叫使用者實現的回撥函式 set_asn1_parameters 來實現。
8) EVP_CIPHER_type
獲取對稱演算法的型別。
9) EVP_CipherInit/EVP_CipherInit_ex
對稱演算法計算(加/解密)初始化函式, _ex 函式多了硬體 enginge 引數,EVP_EncryptInit 和 EVP_DecryptInit 函式也呼叫本函式。
10) EVP_CipherUpdate
對稱計算 (加/解密)函式, 它呼叫了 EVP_EncryptUpdate 和 EVP_DecryptUpdate函式。
11) EVP_CipherFinal/EVP_CipherFinal_ex
對 稱 計 算 ( 加 / 解 ) 函 數 , 調 用 了 EVP_EncryptFinal (_ex ) 和EVP_DecryptFinal(_ex);本函式主要用來處理最後加密分組,可能會有對稱計算。
12) EVP_cleanup
清除載入的各種演算法,包括對稱演算法、摘要演算法以及 PBE 演算法,並清除這些演算法相關的雜湊表的內容。
13) EVP_get_cipherbyname
根據字串名字來獲取一種對稱演算法(EVP_CIPHER),本函式查詢對稱演算法雜湊表。
14) EVP_get_digestbyname
根據字串獲取摘要演算法(EVP_MD),本函式查詢摘要演算法雜湊表。
15) EVP_get_pw_prompt
獲取口令提示資訊字串.
16) int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen,
ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de)
PBE 初始化函式。本函式用口令生成對稱演算法的金鑰和初始化向量,並作加/解密初始化操作。本函式再加上後續的 EVP_CipherUpdate 以及 EVP_CipherFinal_ex
構成一個完整的加密過程(可參考 crypto/p12_decr.c 的 PKCS12_pbe_crypt 函式) .
17) EVP_PBE_cleanup
刪除所有的 PBE 資訊,釋放全域性堆疊中的資訊.
18) EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8)
將 PKCS8_PRIV_KEY_INFO(x509.h 中定義)中儲存的私鑰轉換為 EVP_PKEY結構。
19) EVP_PKEY2PKCS8/EVP_PKEY2PKCS8_broken
將 EVP_PKEY 結構中的私鑰轉換為 PKCS8_PRIV_KEY_INFO 資料結構儲存。
20) EVP_PKEY_bits
非對稱金鑰大小,為位元數。
21) EVP_PKEY_cmp_parameters
比較非對稱金鑰的金鑰引數,用於 DSA 和 ECC 金鑰。
22) EVP_PKEY_copy_parameters
拷貝非對稱金鑰的金鑰引數,用於 DSA 和 ECC 金鑰。
23) EVP_PKEY_free
釋放非對稱金鑰資料結構。
24) EVP_PKEY_get1_DH/EVP_PKEY_set1_DH
獲取/設定 EVP_PKEY 中的 DH 金鑰。
25) EVP_PKEY_get1_DSA/EVP_PKEY_set1_DSA
獲取/設定 EVP_PKEY 中的 DSA 金鑰。
26) EVP_PKEY_get1_RSA/EVP_PKEY_set1_RSA
獲取/設定 EVP_PKEY 中結構中的 RSA 結構金鑰。
27) EVP_PKEY_missing_parameters
檢查非對稱金鑰引數是否齊全,用於 DSA 和 ECC 金鑰。
28) EVP_PKEY_new
生成一個 EVP_PKEY 結構。
29) EVP_PKEY_size
獲取非對稱金鑰的位元組大小。
30) EVP_PKEY_type
獲取 EVP_PKEY 中表示的非對稱金鑰的型別。
31) int EVP_read_pw_string(char *buf,int length,const char *prompt,int verify)
獲取使用者輸入的口令;buf 用來存放使用者輸入的口令,length 為 buf 長度,prompt為提示給使用者的資訊,如果為空,它採用內建的提示資訊, verify 為 0 時,不要求驗證使用者輸入的口令,否則回要求使用者輸入兩遍。返回 0 表示成功。
32) EVP_set_pw_prompt
設定內建的提示資訊,用於需要使用者輸入口令的場合。

相關推薦

OpenSSLEVP——EVP系列函式介紹

EVP系列函式 摘要函式 典型的摘要函式主要有: 1) EVP_md5 返回 md5 的 EVP_MD。 2) EVP_sha1 返回 sha1 的 EVP_MD。 3) EVP_sha256 返回 sha256 的 EVP_MD。 4)

自學系列 —— redis

    儲存配置檔案後,停止掉舊的伺服器,啟動新的伺服器,之後就能看到主伺服器上的檔案了 通常來說從伺服器只能讀取,不能寫入 也可以設定有

Angular系列表示式

本篇將介紹angularJS中的表示式的使用以及另外一個angualarJS指令ng-init的使用; 相信在這裡,對angular的指令的可能不是很瞭解,那麼什麼是angular指令,angular指令又有什麼特性,又用在何處? 其實如果在看了angular第一篇文章的

深入學習mysql表的操作

uniq order fault change incr 相關 約束 設置 type 1、表:是數據庫中的存儲數據的基本單位,一個表包含若幹個字段和值 2、創建表:   CREATE TABLE 表名稱 (   字段名1  數據庫類型1  [約束條件1],   字段名2  

自動化運維saltstackstates介紹及使用

配置文件 如何 states master 根目錄 一、什麽是Salt States?Salt States是Salt模塊的擴展,主系統使用的狀態系統叫SLS系統,SLS代表Saltstack State,Salt是一些狀態文件,其中包含有關如何配置Salt子節點的信息,這些狀態被存放在一

Spring MVC 的 研發

eight 對象 files tin servlet映射 資源 研發 領域 延遲 二、web.xml的簡單配置介紹1 1、啟動Web項目時,容器回去讀web.xml配置文件裏的兩個節點<context-param>和<listener

Java面向對象編程繼承

抽象方法 oid 修飾 屬於 ... 方法的參數 要求 ring 覆蓋 在上一篇博客中,我們已經了解繼承的基本概念和語法,那麽今天我們就來聊一聊有關於繼承的其他東西。 讓我們來了解一下什麽是方法重載(overload)和方法覆蓋(override) 方法重載(overloa

SIPp常用腳本UAS

invite pcm option 響應 etime aud 服務器 esp contact 看名字就能猜出來,這是作為SIP消息服務端的存在,啟動uas,等著接受SIP消息並且給出響應。 一、uas.xml <?xml version="2.0" encoding

Java學習流程控制語句

循環 cas 學習之路 將不 乘法表 length 跳出循環 spa int if、if…else…語句 if (true) { System.out.println("為真時執行");

次元碼農的成長json到底有什麽用途

頁面 asc 語法 處理 交互 分隔 規則 stl 成長之路 寫的有問題請指出 一、什麽是json 1json指的是javaScript的表示方法 2JSON是輕量級的文本數據交換格式 3 Json是獨立語言 4 json具有自我描述性 更易理解 二、語法規則 1對

Hibernate框架一對多關系

true pre conn 關系 編寫 none isp exce dia 在下列案例中:   客戶是一;聯系人是多;客戶可以擁有多個聯系人;一個聯系人只有一個客戶   1、編寫實體類 package com.pojo; import java.util

Hibernate框架多對多多關系

-m let ble ssi gin rop assert on() odi 1、配置實體類 package cn.pojo; import java.util.HashSet; import java.util.Set; public class

基礎篇集合總結

線程不安全 emp abstract 和集 write next 不可變 叠代器 關系 1. Map集合和collection結合的區別 1》Collection一次存一個元素;Map一次存一對元素; 2》Collection是單列集合;Map是雙列集合; 3》Map中的存

JavaScript的進階函數簡介,變量、作用域和內存問題

ret 優化 person get 簡介 web瀏覽器 都是 add 是把 <h3>ECMAScript中函數不存在函數簽名的概念,沒有重載</h3><h3>無需指定返回值,可以在任何時候返回任何值。未指定返回值的函數,返回的是一個特殊

小白的linux學習

探索linux一、linux系統結構linux是一個倒樹結構linux中所有的東西都是文件這些文件都在系統頂級目錄“/” /就是根目錄/目錄以下為二級目錄這些目錄都是系統裝機時系統自動建立的二級目錄的作用/bin 二進制可執行文件也就是系統命令/sbin

java集合類源碼分析List

頻繁 null 並且 reel closed tco 默認 java集合 進行 這一節主要介紹List接口的幾個實現類的區別: 1.線程安全 Vector是線程安全的,而ArrayList和LinkedList是非線程安全的。從源碼中我們可知,Vector類中的方法大部分

(轉JavaWeb學習Servlet----Servlet的生命周期、繼承結構、修改Servlet模板

ext 核心 system 網頁 基本 麻煩 extends 用戶名 servlet對象 【聲明】 歡迎轉載,但請保留文章原始出處→_→ 文章來源:http://www.cnblogs.com/smyhvae/p/4140466.html 一、http協議回顧: 在上一

Ajax技術XMLHttpRequest【XMLHttpRequest常用方法和屬性】

tro 沒有 body htm 事件 thead 指定 response date 一、XMLHttpRequest中常用的方法: (1)open()方法:用於設置進行異步請求目標的URL、請求方法以及其他參數信息。 函數原型:open("method","URL",asy

我的C#跨平臺:開發一組標準的Restful API

ref 運行 mar margin bruce ora soft left 啟用 添加NuGet引用:Microsoft.AspNet.WebApi.Owin 在啟動類啟用WebApi; 添加一個Controller類,代碼如下: 運行程序

python學習 -- 函數、JSON、終端樣式

blog ade def 數量 通過 等於 name tuple args 函數 函數構成 定義函數:使用def即可 def __getName(idCard): return user_info[idCard].Name 其中,__get