初始化向量(IV)中的数字全为零
Numbers in initialization vector (IV) are all zeros
我无法理解以下句子:“初始化向量 (IV) 中的数字全为零(不是 ASCII 字符‘0’)。
我的目标是使用 openssl enc 命令使用 aes-128-cbc 和密钥 K(比如 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 吗?
对于 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 太短,它会用零填充它直到达到正确的大小。
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。
请注意,使用常量 - 特别是 "typical",例如全零 - IV 是一种糟糕的安全做法; Wikipedia article 解释原因。
我无法理解以下句子:“初始化向量 (IV) 中的数字全为零(不是 ASCII 字符‘0’)。
我的目标是使用 openssl enc 命令使用 aes-128-cbc 和密钥 K(比如 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 吗?
对于 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 太短,它会用零填充它直到达到正确的大小。
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。
请注意,使用常量 - 特别是 "typical",例如全零 - IV 是一种糟糕的安全做法; Wikipedia article 解释原因。