C OpenSSL块大小

时间:2009-11-20 08:00:50

标签: c openssl

我的代码:

    EVP_DecryptInit (&ctx, EVP_des_cbc (), key, iv);
    if (EVP_DecryptUpdate (&ctx, outbuf, &olen, inbuff, in_length) != 1)
    {
        fprintf (stderr, "error in decrypt update\n");
        return -1;
    }
    if (EVP_DecryptFinal (&ctx, outbuf + olen, &tlen) != 1)
    {
        fprintf (stderr, "error in decrypt final\n");
        return -1;
    }
    olen += tlen;

如果我的SIZE =从10001到10007,那么olen总是10008.我认为它是填充的b / c。但是,即使我的SIZE是10000,olen仍然是10008.我在这里不明白。由于10000%8 = 0,为什么我们需要再填充8个字节?同样,SIZE = 10008到10015,olen是10016。

1 个答案:

答案 0 :(得分:2)

总是需要至少一个填充字节 - 所以这意味着如果您的输入大小是块大小的精确倍数,那么您将拥有整个填充块。

需要至少一个字节的原因是当解密操作完成时,您需要检查填充以确定剥离多少。如果没有填充,那么你将检查 data 的最后一个字节 - 这可能看起来像填充,导致你错误地剥离它。