openssl之EVP系列之2---对称加密算法概述
openssl之EVP系列之2---对称加密算法概述
---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.doc部分翻译和自己的理解写成
(作者:DragonKing, Mail: wzhah@263.net ,公布于:http://gdwzh.126.com之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)系列的两个基本结构,它们的其他一些列函数都是以这两个结构为基础实现了。
文件evp/evp_enc.c是最高层的封装实现,各种加密的算法的封装在p_enc.c里面实现,解密算法的封装在p_dec.c里面实现,而各个e_*.c文件则是真正实现了各种算法的加解密功能。当然它们事实上也是一些封装函数。真正的算法实如今各个算法同名文件夹里面的文件实现。
openssl之EVP系列之2---对称加密算法概述的更多相关文章
- openssl之EVP系列之1---算法封装
openssl之EVP系列之1---算法封装 ---依据openssl doc/crypto/EVP.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah ...
- openssl之EVP系列之12---EVP_Seal系列函数介绍
openssl之EVP系列之12---EVP_Seal系列函数介绍 ---依据openssl doc/crypto/EVP_SealInit.pod翻译和自己的理解写成 (作者:Dra ...
- openssl之EVP系列之13---EVP_Open系列函数介绍
openssl之EVP系列之13---EVP_Open系列函数介绍 ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成 (作者:Dra ...
- openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例
openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例 ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay. ...
- openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)
openssl之EVP系列之5---EVP_Encrypt系列函数详细解释(二) ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.t ...
- openssl之EVP系列之9---EVP_Digest系列函数的一个样例
openssl之EVP系列之9---EVP_Digest系列函数的一个样例 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译 (作者:Drago ...
- openssl之EVP系列之8---EVP_Digest系列函数具体解释
openssl之EVP系列之8---EVP_Digest系列函数具体解释 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作 ...
- openssl之EVP系列之7---信息摘要算法结构概述
openssl之EVP系列之7---信息摘要算法结构概述 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作者:Dragon ...
- openssl之EVP系列之11---EVP_Verify系列函数介绍
openssl之EVP系列之11---EVP_Verify系列函数介绍 ---依据openssl doc/crypto/EVP_VerifyInit.pod翻译和自己的理解写成 (作者 ...
随机推荐
- Serializable-源码分析
package java.io; public interface Serializable { } 代码很简单,功能也很简单,对象通过这个接口来实现序列化和反序列的.下面来看看小例子. import ...
- JS form 表单收集 数据 formSerialize
做后台系统的时候通常会用到form表单来做数据采集:每次一个字段一个字段的去收集就会很麻烦,网站也有form.js插件可以进行表单收集,并封装成一个对象,通过ajax方法传到后台:现在介绍一种直觉采集 ...
- 代码实现wordpress彩色标签云的最简单的方法
首先在wordpress主题文件夹内找到并用编辑器打开 functions.php 文件,随意找个位置不到插到别的函数里,“?>” 之前加入以下代码: //彩色标签云 function colo ...
- HTML实现图片360度循环旋转
<style> .header{ -webkit-animation:rotateImg 5s linear infinite;<!--修改旋转周期--> border: 1p ...
- 修改织梦plus目录名
1.修改plus目录名 修改inlclude文件夹下common.inc.php 140行 //插件目录,这个目录是用于存放计数器.投票.评论等程序的必要动态程序 $cfg_plus_dir = $c ...
- 使用jQuery对图片进行居中设置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ACM___数学___九的余数
九的余数 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数整除九之后的余 ...
- Oracle中的SAVEPOINT
学习存储过程中使用断点回滚事务时,发现目前网络上存在一个问题,那就是使用断点回滚后,都忘记了一个很重要的事情,提交事务.虽然使用了断点回滚,但是断点回滚不像rollBack或commit一样结束当前事 ...
- CaptCha的现状与未来
2011年的老文.................转自于伯乐在线:http://blog.jobbole.com/4655/ 有一个机会,朋友推荐一个创业的哥们给我认识,方向就是验证码识别 ...
- 路飞学城Python-Day59(第五模块思维导图)