EVP_CIPHER_CTX加解密接口函数说明

本文详细介绍了OpenSSL中EVP_CIPHER_CTX的加密和解密过程,包括EVP_EncryptInit_ex、EVP_EncryptUpdate、EVP_EncryptFinal_ex等函数的使用。内容涵盖加密模式、填充规则以及PKCS7填充的处理。同时,讨论了加密解密时对数据块大小的要求和填充选项的设置方法。
摘要由CSDN通过智能技术生成

源码文件:/evp/evp_enc.c

EVP_CIPHER_CTX ctx;

加密函数说明:

1、EVP_CIPHER_CTX_init(&ctx)

把ctx清0

2、EVP_EncryptInit_ex(&ctx, EVP_rc4(), NULL, key, NULL);

初始化ctx
2.1、ctx->encrypt = enc;设置ctx为加密或者解密
2.2、ctx->cipher = cipher;设置ctx的加密算法为EVP_rc4()
2.3、ctx->cipher_data = OPENSSL_malloc(ctx->cipher->ctx_size);开辟算法的私有数据空间,并赋值给ctx,这个私有数据一般是秘钥,在这里是EVP_RC4_KEY。
2.4、根据算法设置ctx的其它一些成员
ctx->key_len = cipher->key_len;
ctx->flags = 0;
2.5、ctx->cipher->init(ctx, key, iv, enc) 把key设置到2.3所分配的cipher_data中
2.6、最后设置一些ctx成员
ctx->buf_len = 0;
ctx->final_used = 0;
ctx->block_mask = ctx->cipher->block_size - 1; 加密块掩码用例检测要加密的数据是否是各算法块大小的整数倍

3、EVP_EncryptUpdate()

3.1、如果要加密的数据大小是算法块大小的整数倍执行如下的if分支。直接调用EVP算法加密函数进行加密

if (ctx->buf_len == 0 && (inl & (ctx->block_mask)) == 0) {

*outl = 0;

if (ctx->cipher->do_cipher(ctx, out, in, inl)) {

*outl = inl;

return 1;

} else {

*outl = 0;

return 0;

}

}

 

3.2、如果要加密的数据大小不是算法块大小的整数倍,先只加密块大小最大整数倍大小的数据。
i = inl & (bl - 1); //计算要加密的数据大小除以块大小的余数
inl -= i;//要加密的数据最后不够块大小的数据暂时不加密
if (inl > 0) {
if (!ctx->cipher->do_cipher(ctx, out, in, inl))
return 0;
*outl += inl;
}
3.3、memcpy(ctx->buf, &(in[inl]), i);把剩余不够块大小没加密完的数据存到ctx里面
ctx->buf_len = i; 没加密完的数据大小也记录下来,在EVP_EncryptFinal_ex会用
  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值