OpenSSL对称加密算法中如何添加新算法

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

本文详细介绍OpenSSL对称加密算法中如何添加新算法

  对OpenSSL中宏的研究

  密码算法接口的定义

typedef struct evp_cipher_st EVP_CIPHER;
/* 加密算法后被names_lh来管理,可以通算法的名称或别名来检索 */
struct evp_cipher_st
{
int nid; /*加密算法的nid*/
int block_size; /*数据块的大小 */
int key_len; /* Default value for variable length ciphers */
int iv_len; /* 对于CBC,CFB,OFB的加密算法初始化矢量*/
unsigned long flags; /* Various flags */
int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key,
const unsigned char *iv, int enc); /* init key */
int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out,
const unsigned char *in, unsigned int inl);/* encrypt/decrypt data */
int (*cleanup)(EVP_CIPHER_CTX *); /* cleanup ctx */
int ctx_size; /* how big the ctx needs to be */
int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Populate a ASN1_TYPE with parameters */
int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Get parameters from a ASN1_TYPE */
int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */
void *app_data; /* Application data */
};

  如果正确定义了EVP_CIPHER变量,这个算法就可以被OpenSSL所接受了。

  下面的宏将定义ECB,CBC,CFB,OFB算法EVP_CIPHER定义。

#define BLOCK_CIPHER_defs(cname, kstruct,
nid, block_size, key_len, iv_len, flags,
init_key, cleanup, set_asn1, get_asn1, ctrl)
static EVP_CIPHER cname##_cbc = {
nid##_cbc, block_size, key_len, iv_len,
flags | EVP_CIPH_CBC_MODE,
init_key,
cname##_cbc_cipher,
cleanup,
sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),
set_asn1, get_asn1,
ctrl,
NULL
};
EVP_CIPHER *EVP_##cname##_cbc(void) { return &cname##_cbc; }
static EVP_CIPHER cname##_cfb = {
nid##_cfb64, 1, key_len, iv_len,
flags | EVP_CIPH_CFB_MODE,
init_key,
cname##_cfb_cipher,
cleanup,
sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),
set_asn1, get_asn1,
ctrl,
NULL
};
EVP_CIPHER *EVP_##cname##_cfb(void) { return &cname##_cfb; }
static EVP_CIPHER cname##_ofb = {
nid##_ofb64, 1, key_len, iv_len,
flags | EVP_CIPH_OFB_MODE,
init_key,
cname##_ofb_cipher,
cleanup,
sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),
set_asn1, get_asn1,
ctrl,
NULL
};
EVP_CIPHER *EVP_##cname##_ofb(void) { return &cname##_ofb; }
static EVP_CIPHER cname##_ecb = {
nid##_ecb, block_size, key_len, iv_len,
flags | EVP_CIPH_ECB_MODE,
init_key,
cname##_ecb_cipher,
cleanup,
sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),
(ctx_size 其中有联合的结构,如何获取EVP_CIPHER_CTX数据长度)
set_asn1, get_asn1,
ctrl,
NULL
};
EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; }

  上面的宏在经过处理之后,变成了四中加密模式的EVP_CIPHER定义,这个结构中封装了加密操作汉书,密钥初始化函数,以及密钥的清理函数。除了实现加密算法之外,还比需实现对应的密钥结构!

作者:赵治国    责编:豆豆技术应用

正在加载评论...