初始化向量(IV)中的数字都是零

时间:2015-10-08 10:14:05

标签: openssl initialization-vector

我无法理解以下句子:"初始化向量(IV)中的数字都是零(不是ASCII字符' 0')。

我的目标是使用openssl enc命令来加密文件,使用带有密钥K的aes-128-cbc(让我们说1234567890)和满足这些要求的iv。

到目前为止,我已经尝试过不使用-iv选项了,但是它然后说" iv undefined"因为如果使用选项-K,则必须提供选项-iv。我曾尝试使用 -iv 0 ,但我不确定它是否正确。

对于实例,我使用了:

openssl enc -aes-128-cbc -e -in input.txt -out output.txt -K 1234567890 -iv 0

请您帮我说明符合上述要求的正确iv吗?

2 个答案:

答案 0 :(得分:2)

AES-CBC的OpenSSL实现要求IV与块大小相同 - 即在您的情况下为128位。 enc手册页说:

-iv IV
    the actual IV to use: this must be represented as a string comprised only of hex digits.

它没有说,如果在命令行中给出的IV较短,如何获得所有128位 - 如示例命令中所示。

幸运的是,OpenSSL的源代码可用。我们可以在enc.c中看到IV被初始化为全零,然后从命令行参数填充起始字节:

[hiv is the value of the command-line option -iv:]

if ((hiv != NULL) && !set_hex(hiv, iv, sizeof iv)) {
    BIO_printf(bio_err, "invalid hex iv value\n");

[...]

int set_hex(char *in, unsigned char *out, int size)
{
    int i, n;
    unsigned char j;

    n = strlen(in);
    if (n > (size * 2)) {
        BIO_printf(bio_err, "hex string is too long\n");
        return (0);
    }
    memset(out, 0, size);
    for (i = 0; i < n; i++) {
    .......

所以,你正在做的事情 - 为'-iv'提供一个零 - 恰好会产生你需要的全零IV。

请注意,使用常量 - 尤其是“典型”,例如全零 - IV是一种糟糕的安全措施; Wikipedia article解释了原因。

答案 1 :(得分:1)

对于模式CBC,CFB或OFB,您需要初始化向量,其长度等于特定密码的块大小。对于AES,您有128位。

您可以使用-p检查命令,例如:

openssl enc -aes-128-cbc -e -in test.txt -out output.txt -K 1234567812346578 -iv 0 -p

会给你:

salt=A086E8DE00000000
key=12345678123456781234567812345678
iv =00000000000000000000000000000000

如果您的钥匙或IV太短,它会用零填充,直到达到正确的尺寸。