openssl之EVP系列之2---對稱加密演算法概述 (轉)
openssl之EVP系列之2---對稱加密演算法概述 (轉)[@more@]open之EVP系列之2---對稱演算法概述
---根據openssl doccryptoEVP_EncryptInit.pod和docssleay.txt cipher.doc部分翻譯和自己的理解寫成
(作者:DragonKing, : wzhah@263 ,釋出於:之openssl專業論壇,版本:openssl-0.9.7)
對稱加密演算法封裝的系列名字是以EVP_Encrypt*...*開頭的,其實,這些函式只是簡單了EVP_Cipher*...*系列的同名函式,換一個名字可能是為了更好的區別和理解。除了實現了對稱加密演算法外,EVP_Encrypt*...*系列還對塊加密演算法提供了緩衝功能。以後我們可能會更多使用EVP_Cipher的術語,因為它是真正的實現結構。
EVP_Cipher*...*得以實現的一個基本結構是下面定義的一個演算法結構,它定義了EVP_Cipher系列函式應該採用什麼演算法進行資料處理,其定義如下(evp.h):
typedef struct evp_cipher_st
{
int nid;
int block_size;
int key_len;
int iv_len;
unsigned long flags;
int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc);
int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl);
int (*cleanup)(EVP_CIPHER_CTX *);
int ctx_size;
int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *);
int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *);
int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */
void *app_data;
}EVP_CIPHER;
下面對這個結構的部分成員的含義作一些解釋:
nid——是演算法型別的nid識別號,openssl裡面每個都有一個內部唯一的識別ID
block_size——是每次加密的資料塊的長度,以位元組為單位
key_len——各種不同演算法預設的金鑰長度
iv_len——初始化向量的長度
init——演算法結構初始化函式,可以設定為加密還是模式
do_cipher——進行資料加密或解密的函式
cleanup——釋放EVP_CIPHER_CTX結構裡面的資料和設定。
ctx_size——設定ctx->cipher_data資料的長度
set_asn1_parameters——在EVP_CIPHER_CTX結構中透過引數設定一個ASN1_TYPE
get_asn1_parameters——從一個ASN1_TYPE中取得引數
ctrl——其它各種操作函式
app_data——應用資料
透過定義這樣一個指向這個結構的指標,你就可以在連線的時候只連線自己使用的演算法;而如果你是透過一個整數來指明應該使用什麼演算法的話,會導致所有演算法的程式碼都被連線到程式碼中。透過這樣一個結構,還可以自己增加新的演算法。
在這個基礎上,每個EVP_Cipher*...*函式都維護著一個指向一個EVP_CIPHER_CTX結構的指標。
typedef struct evp_cipher_ctx_st
{
const EVP_CIPHER *cipher;
ENGINE *engine;
int encrypt;
int buf_len;
unsigned char oiv[EVP_MAX_IV_LENGTH];
unsigned char iv[EVP_MAX_IV_LENGTH];
unsigned char buf[EVP_MAX_BLOCK_LENGTH];
int num;
void *app_data;
int key_len;
unsigned long flags;
void *cipher_data;
int final_used;
int block_mask;
unsigned char final[EVP_MAX_BLOCK_LENGTH];
} EVP_CIPHER_CTX;
下面對這個結構部分成員做簡單的解釋:
cipher——是該結構相關的一個EVP_CIPHER演算法結構
engine——如果加密演算法是ENGINE提供的,那麼該成員儲存了相關的函式介面
encrypt——加密或解密的標誌
buf_len——該結構緩衝區裡面當前的資料長度
oiv——初始的初始化向量
iv——工作時候使用的初始化向量
buf——儲存下來的部分需要資料
num——在cfb/ofb模式的時候指定塊長度
app_data——應用程式要處理資料
key_len——金鑰長度,演算法不一樣長度也不一樣
cipher_data——加密後的資料
上述兩個結構是EVP_Cipher(EVP_Encrypt)系列的兩個基本結構,它們的其它一些列函式都是以這兩個結構為基礎實現了。evpevp_enc.c是最高層的封裝實現,各種加密的演算法的封裝在p_enc.c裡面實現,解密演算法的封裝在p_dec.c裡面實現,而各個e_*.c檔案則是真正實現了各種演算法的加解密功能,當然它們其實也是一些封裝函式,真正的演算法實現在各個演算法同名目錄裡面的檔案實現。
---根據openssl doccryptoEVP_EncryptInit.pod和docssleay.txt cipher.doc部分翻譯和自己的理解寫成
(作者:DragonKing, : wzhah@263 ,釋出於:之openssl專業論壇,版本:openssl-0.9.7)
對稱加密演算法封裝的系列名字是以EVP_Encrypt*...*開頭的,其實,這些函式只是簡單了EVP_Cipher*...*系列的同名函式,換一個名字可能是為了更好的區別和理解。除了實現了對稱加密演算法外,EVP_Encrypt*...*系列還對塊加密演算法提供了緩衝功能。以後我們可能會更多使用EVP_Cipher的術語,因為它是真正的實現結構。
EVP_Cipher*...*得以實現的一個基本結構是下面定義的一個演算法結構,它定義了EVP_Cipher系列函式應該採用什麼演算法進行資料處理,其定義如下(evp.h):
typedef struct evp_cipher_st
{
int nid;
int block_size;
int key_len;
int iv_len;
unsigned long flags;
int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc);
int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl);
int (*cleanup)(EVP_CIPHER_CTX *);
int ctx_size;
int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *);
int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *);
int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */
void *app_data;
}EVP_CIPHER;
下面對這個結構的部分成員的含義作一些解釋:
nid——是演算法型別的nid識別號,openssl裡面每個都有一個內部唯一的識別ID
block_size——是每次加密的資料塊的長度,以位元組為單位
key_len——各種不同演算法預設的金鑰長度
iv_len——初始化向量的長度
init——演算法結構初始化函式,可以設定為加密還是模式
do_cipher——進行資料加密或解密的函式
cleanup——釋放EVP_CIPHER_CTX結構裡面的資料和設定。
ctx_size——設定ctx->cipher_data資料的長度
set_asn1_parameters——在EVP_CIPHER_CTX結構中透過引數設定一個ASN1_TYPE
get_asn1_parameters——從一個ASN1_TYPE中取得引數
ctrl——其它各種操作函式
app_data——應用資料
透過定義這樣一個指向這個結構的指標,你就可以在連線的時候只連線自己使用的演算法;而如果你是透過一個整數來指明應該使用什麼演算法的話,會導致所有演算法的程式碼都被連線到程式碼中。透過這樣一個結構,還可以自己增加新的演算法。
在這個基礎上,每個EVP_Cipher*...*函式都維護著一個指向一個EVP_CIPHER_CTX結構的指標。
typedef struct evp_cipher_ctx_st
{
const EVP_CIPHER *cipher;
ENGINE *engine;
int encrypt;
int buf_len;
unsigned char oiv[EVP_MAX_IV_LENGTH];
unsigned char iv[EVP_MAX_IV_LENGTH];
unsigned char buf[EVP_MAX_BLOCK_LENGTH];
int num;
void *app_data;
int key_len;
unsigned long flags;
void *cipher_data;
int final_used;
int block_mask;
unsigned char final[EVP_MAX_BLOCK_LENGTH];
} EVP_CIPHER_CTX;
下面對這個結構部分成員做簡單的解釋:
cipher——是該結構相關的一個EVP_CIPHER演算法結構
engine——如果加密演算法是ENGINE提供的,那麼該成員儲存了相關的函式介面
encrypt——加密或解密的標誌
buf_len——該結構緩衝區裡面當前的資料長度
oiv——初始的初始化向量
iv——工作時候使用的初始化向量
buf——儲存下來的部分需要資料
num——在cfb/ofb模式的時候指定塊長度
app_data——應用程式要處理資料
key_len——金鑰長度,演算法不一樣長度也不一樣
cipher_data——加密後的資料
上述兩個結構是EVP_Cipher(EVP_Encrypt)系列的兩個基本結構,它們的其它一些列函式都是以這兩個結構為基礎實現了。evpevp_enc.c是最高層的封裝實現,各種加密的演算法的封裝在p_enc.c裡面實現,解密演算法的封裝在p_dec.c裡面實現,而各個e_*.c檔案則是真正實現了各種演算法的加解密功能,當然它們其實也是一些封裝函式,真正的演算法實現在各個演算法同名目錄裡面的檔案實現。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993244/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 非對稱加密與OpenSSL加密
- .NET Core加解密實戰系列之——對稱加密演算法解密加密演算法
- Java安全之對稱加密、非對稱加密、數字簽名Java加密
- 密碼學之對稱加密密碼學加密
- 對稱塊加密演算法加密模式詳解 (轉)加密演算法模式
- openssl之BIO系列之13---Socket型別BIO (轉)型別
- 對稱加密演算法----DES加密演算法加密演算法
- openssl之BIO系列之21---Base64型別的BIO (轉)型別
- openssl之BIO系列之11---檔案(file)型別BIO (轉)型別
- 加密解密技術—對稱演算法加密加密解密演算法
- 20.3 OpenSSL 對稱AES加解密演算法解密演算法
- 密碼學系列之:blowfish對稱金鑰分組演算法密碼學演算法
- 密碼學系列之:twofish對稱金鑰分組演算法密碼學演算法
- 對稱加密與非對稱加密加密
- netty系列之:對聊天進行加密Netty加密
- 【Java小工匠聊密碼學】–對稱加密–概述Java密碼學加密
- 實現HTTPS系列第二彈之【非對稱加密,公鑰私鑰,數字簽名,OpenSSL及HTTPS等概念簡介】HTTP加密
- 00、React系列之--React 系列概述React
- 00、React系列之 React 系列概述React
- 資料加密(對稱加密和非對稱加密)加密
- 20.2 OpenSSL 非對稱RSA加解密演算法解密演算法
- 非對稱加密演算法-RSA演算法加密演算法
- DES--------Golang對稱加密之模式問題實戰Golang加密模式
- 非對稱加密演算法的思考加密演算法
- 編碼與加密(對稱加密與非對稱加密)加密
- 對稱加密、非對稱加密、RSA(總結)加密
- 對稱加密和非對稱加密(一)初步理解加密
- 應用加密1;非對稱加密演算法揭祕加密演算法
- RSA非對稱加密演算法淺析加密演算法
- 密碼學系列之:bcrypt加密演算法詳解密碼學加密演算法
- Android Native C/C++ 使用OpenSSL EVP介面AndroidC++
- 加密原理詳解:對稱式加密VS非對稱式加密加密
- Flutter系列之Dart語言概述FlutterDart
- https中的對稱加密和非對稱加密HTTP加密
- PHP中使用OpenSSL生成RSA公鑰私鑰及進行加密解密示例(非對稱加密)PHP加密解密
- 第四篇:非對稱加密及RSA加密演算法加密演算法
- Android 安全加密:對稱加密Android加密
- Android安全加密:對稱加密Android加密