OpenSSL中对称加密算法的统一接口详解

http://tech.ddvip.com   2007年04月25日    社区交流

本文详细介绍OpenSSL中对称加密算法的统一接口详解

openssl/evp/c_alle.c
void OpenSSL_add_all_ciphers(void)
{
......
#ifndef OPENSSL_NO_RC4
EVP_add_cipher(EVP_rc4());
EVP_add_cipher(EVP_rc4_40());
#endif
......

  以后外部函数要调用RC4算法,实际就是找到RC4的EVP_CIPHER结构指针,进行初始化后进行加解密处理:

  如openssl命令:

  openssl enc –rc4 –in aaa.txt –out aaa.enc

  执行顺序如下:

openssl/apps/openssl.c
main() -> do_cmd()->MAIN() (apps/enc.c) -> EVP_get_cipherbyname(), EVP_BytesToKey(), BIO_set_cipher(),
BIO_set_cipher -> EVP_CipherInit_ex -> ctx->cipher->init

  而加密算法作为BIO的一个环节被BIO_push到BIO中,这样就通过直接BIO读写操作就调用了相应的加解密算法。

  3. 块加密算法定义宏

  对于块加密算法,如AES、CAST、Blowfish等,其加解密函数都是类似的,openssl更是定义了一系列宏来简化算法的定义,如对于Blowfish算法接口:

/* openssl/evp/e_bf.c */
#ifndef OPENSSL_NO_BF
#include
#include "cryptlib.h"
#include
#include "evp_locl.h"
#include
#include
static int bf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
const unsigned char *iv, int enc);
typedef struct
{
BF_KEY ks;
} EVP_BF_KEY;
#define data(ctx) EVP_C_DATA(EVP_BF_KEY,ctx)
//定义块加密算法的宏
IMPLEMENT_BLOCK_CIPHER(bf, ks, BF, EVP_BF_KEY, NID_bf, 8, 16, 8, 64,
EVP_CIPH_VARIABLE_LENGTH, bf_init_key, NULL,
EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv, NULL)
// 显式只需要定义一个初始化密钥函数就可以了
static int bf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
const unsigned char *iv, int enc)
{
BF_set_key(&data(ctx)->ks,EVP_CIPHER_CTX_key_length(ctx),key);
return 1;
}
#endif

  在openssl/evp/evp_locl.h中该宏定义为:

责编:豆豆技术应用

正在加载评论...