openssl EVP_CIPHER_CTX_set_padding 只支持 pkcs7/pkcs5


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就好了。

tags: openssl EVP_CIPHER_CTX_set_padding evp接口 padding 對稱加密 aes


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM