关于openssl 分组加密 padding填充模式的说明

关于openssl 分组加密 padding填充模式的说明

现在在openssl里面AES的padding事实上只支持pkcs7/pkcs5这一种padding模式。

今天被错误的资料误导了,使用EVP接口实现对称加密的时候有个EVP_CIPHER_CTX_set_padding()函数,看上去能给加密上下文ctx设置不同的padding模式。

int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad);
但是实际上在现在的版本中它只能把默认的pkcs7/pkcs5模式改成nopadding模式, 第二个pad参数只能填0, 而不是openssl中的那几个PADDING的枚举,在changes.md里面有介绍

  • New function EVP_CIPHER_CTX_set_padding() this is used to
    disable standard block padding (aka PKCS#5 padding) in the EVP
    API, which was previously mandatory. This means that the data is
    not padded in any way and so the total length much be a multiple
    of the block size, otherwise an error occurs.

    Steve Henson

openssl的EVP接口中有五个padding模式的枚举,在evp.h里面:

/* Padding modes */
#define EVP_PADDING_PKCS7       1
#define EVP_PADDING_ISO7816_4   2
#define EVP_PADDING_ANSI923     3
#define EVP_PADDING_ISO10126    4
#define EVP_PADDING_ZERO        5

EVP_PADDING_ISO7816_4、EVP_PADDING_ANSI923、EVP_PADDING_ISO10126 现在都被废弃了。
ZeroPadding有些缺陷,如果都用0x00填充,那如果消息的最后一个字节也是00,那解密的时候就无法区分明文和padding了。

看evp_enc.c里面的实现就知道,EVP_CIPHER_CTX_set_padding这里只区分了pad是不是0,set成0就是nopadding,set成上面5个padding枚举的任何一个其实用的都是EVP_PADDING_PKCS7。

int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
{
    int ok;
    OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
    unsigned int pd = pad;
    if (pad)
        ctx->flags &= ~EVP_CIPH_NO_PADDING;
    else
        ctx->flags |= EVP_CIPH_NO_PADDING;

    if (ctx->cipher != NULL && ctx->cipher->prov == NULL)
        return 1;
    params[0] = OSSL_PARAM_construct_uint(OSSL_CIPHER_PARAM_PADDING, &pd);
    ok = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->algctx, params);

    return ok != 0;
}

其他padding模式openssl是不支持了,如果实际有需要自己给消息做好padding,然后再用EVP_CIPHER_CTX_set_padding把ctx设置成nopadding就好了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值