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
上一篇:HASH函数,信息摘要(Message Digest)和MD2,MD4,MD5
下一篇:对称加密算法技术概述
|