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定义,这个结构中封装了加密操作汉书,密钥初始化函数,以及密钥的清理函数。除了实现加密算法之外,还比需实现对应的密钥结构!
作者:赵治国 责编:豆豆技术应用
正在加载评论...
- Linux/Unix 新闻
- Linux/Unix 入门
- Linux/Unix 命令
- Linux/Unix 安装
- Linux 嵌入式系统
- Linux/Unix 编程
- Linux/Unix 管理
- Linux/Unix 桌面
- Linux/Unix 内核
- Linux/Unix 软件
- SCO Unix
- NetBSD
- OpenBSD
- Redhat/Fedora Linux
- 手机
- Linux/Unix find 搜索命令
- Linux/Unix vi 命令
- Linux/Unix kde 桌面环境
- Linux/Unix GNOME 桌面环境
- Linux/Unix Make 命令
- Linux/Unix crontab 命令
- Linux/Unix ext3 文件系统
- Linux/Unix 文件系统详解
- Linux/Unix ADSL 拨号设置
- Linux/Unix GRUB 配置及应用
- Linux/Unix nfs配置
- Linux/Unix 硬件信息查看及管理
- Linux/Unix 优化
- Linux/Unix 交换分区Swap管理及应用
- Linux/Unix 用户管理
- Linux/Unix Ramdisk
- Linux/Unix 密码恢复管理
- Linux/Unix 文件删除恢复
- Linux/Unix fdisk分区
- Linux/Unix lvs负载均衡管理
- Linux/Unix root用户
- Linux/Unix 集群
- Linux/Unix 日志
- 更多Linux/Unix专题……