【发布时间】:2016-11-02 16:13:23
【问题描述】:
我在一个文件中生成了一个随机的 256 位对称密钥,用于使用 OpenSSL 命令行加密一些数据,稍后我需要使用 OpenSSL 库以编程方式对其进行解密。我没有成功,我认为问题可能出在我正在使用(或未使用)的初始化向量中。
我使用这个命令加密数据:
/usr/bin/openssl enc -aes-256-cbc -salt -in input_filename -out output_filename -pass file:keyfile
我正在使用以下调用来初始化数据的解密:
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, keyfile.data(), nullptr))
keyfile 是一个 vector<unsigned char>,它保存了 32 个字节的密钥。我的问题是关于最后一个参数。它应该是密码算法的初始化向量。加密时我没有指定 IV,所以必须使用一些默认值。
为该参数传递 nullptr 是否意味着“使用默认值”?默认为null,第一个密码块什么都不加?
我应该提一下,我可以在不提供 IV 的情况下从命令行解密。
【问题讨论】:
-
不使用 IV(或固定默认值)不会严重破坏加密强度吗?据我了解,IV 的重点是确保相同的明文不会生成相同的密文。所以需要有一个 IV,它不需要是秘密的,它只需要对你加密的所有东西都是唯一的。不使用一个(或固定的)听起来是个非常糟糕的主意。
-
我不是密码学家,也没有在电视上玩过密码,所以我真的没有资格回答(因此为什么上面只是一个评论)。作为一个非专家我会猜只要密钥每次都是唯一的那么它可能没问题,但是作为一个知道他对加密知之甚少的实用主义者我可能会使用随机IV 也是,无论如何,并将其与加密数据一起存储。
-
那里接受的答案似乎与我最初的直觉一致,即使用固定 IV 会降低强度(在攻击者试图暴力破解密钥的情况下)。因此,即使密钥是唯一的,我也会每次都使用(真正的)随机 IV。
-
@JesperJuhl - 每种模式通常有不同的要求。 CBC 通常需要不可预测的 IV。我更新了我的答案以提供参考。
标签: c++ encryption openssl aes block-cipher