解决OpenSSL调用EVP_EncryptUpdate进行解密,返回长度少一个block_size的问题

        最近在参考OpenSSL的man3中的调用示例调用EVP_EncryptUpdate的解密功能时,发现返回的长度总是少16字节(以AES-128-ecb为例),于是看OpenSSL源码,遂发现在evp_enc.c中的EVP_DecryptUpdate函数中在发现ctx->flags若有PADDING的情况下可能对解密返回的数据长度减去一个block_size的大小,应该是没有走EVP_CIPH_NO_PADDING的分支。因此需要调用EVP_CIPHER_CTX_set_padding函数强制设置ctx为NO_PADDING。

调用实例:

EVP_CIPHER_CTX *ctx;
unsigned char outbuf[1024];                                                       //缓冲区用于存放解密得到的明文
unsigned char inbuf[1024] = {0x01, 0x02, 0x03, 0x04............};  //这里填密文
int inlen,outlen;
inlen = 1024;                                                                                //密文长度为1024字节
ctx = EVP_CIPHER_CTX_new();
EVP_CipherInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, iv, 0);  //最后的0表示解密,key为密钥,iv为IV,在ecb模式下iv为空
EVP_CIPHER_CTX_set_padding(ctx, 0);                                     //最后的0表示不padding
EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen);                 //此时outlen应该就和inlen是一致的了
EVP_CIPHER_CTX_free(ctx);
 

        注意,使用了不padding之后,就不需要调用EVP_CipherFinal_ex函数来结束整个contex了,且每次输入的长度要满足这个算法的块大小的整数倍

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值