我有任何错误吗?
是的,你需要所有这些东西。
盐(和“迭代计数”)用于从密码中派生密钥。有关详细信息,请参阅PKCS#5。用于密钥派生的盐和迭代计数不必保密。然而,盐应该是不可预测的,并且最好随机选择。
CBC模式需要初始化向量。这是由加密随机数生成器为每个消息生成的一块随机数据。它充当虚拟的初始密文块。与派生密钥的盐一样,它不必保密,并且通常与密文一起传输。
密码及从密码派生的密钥必须保密。即使攻击者具有密钥派生和加密参数以及密文,没有密钥也无法做任何事情。
更新:
密码不是随机选择的;某些密码比其他密码更容易。因此,攻击者不是生成给定长度的所有可能密码(穷举暴力搜索),而是维护一个按概率降序排序的密码列表。
从密码派生加密密钥相对较慢(由于密钥派生算法的迭代)。对几百万个密码进行密钥派生可能需要数月时间。这会促使攻击者从他的最可能密码列表中派生密钥并存储结果。具有这样的列表,他可以快速尝试使用列表中的每个密钥解密,而不是花费数月计算时间再次派生密钥。
但是,每个盐位将导致存储派生密钥所需的空间加倍,并且需要更长时间来为其每个可能的密码派生密钥。一些字节的盐,就很快变得不可行,无法创建和存储这样的列表。
盐是防止预计算攻击的必要条件。
初始化向量(或计数器模式中的nonce)使相同的明文产生不同的密文。这可以防止攻击者利用明文中的模式从一组加密消息中收集信息。
初始化向量是隐藏消息模式的必要条件。
一个用于增强密钥安全性,另一个用于增强使用该密钥加密的每个消息的安全性。两者必须共同使用。