分享

openssl之EVP系列之2---对称加密算法概述

 MikeDoc 2011-01-04
对称加密算法封装的函数系列名字是以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,intenc);
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*,inttype,intarg,void*ptr);/*Miscellaneousoperations*/
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文件则是真正实现了各种算法的加解密功能,当然它们其实也是一些封装函数,真正的算法实现在各个算法同名目录里面的文件实现。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多