明文总是有一些不随机的冗余信息的,特别是公文、报告等格式文件。二战中,德军使用恩尼格玛ENIGMA转子密码机加密他们的电报,建立了一个在当时十分高效的加密系统。这一系统在战争前期给盟军的情报工作带来很大的麻烦。德军的一些定期报告有着固定的格式和行文模式,这些明文中的固定成分是盟军知道的。图灵发明的密钥分析机,利用了这些固定成分加速猜测过程和检验猜测结果。德国密码专家并非不知道这一点,ENIGMA密码机要求发报员先键入3个随机字符,然后才能键入明文。这三个随机字符会使密码机进入一个随机初态,以避免固定格式的报头输出相同的密文。不幸的是,德军发报员为了省事,常常使用固定的三个字符比如NNN作为扰码,这样,本来用来加强的扰码,成了盟军分析的突破口之一。固定的输入,使得输出密文完全由密钥控制。一方面攻击者能够预先造表,提高实时分析速度。另一方面,为自动破译机提供了终止条件,大大降低了分析工作量。对于有缺陷的算法,这种淡而无味的明文更是雪上加霜。
从信息论的角度,格式化的固定抬头等冗余信息的信息量是零,这样的明文(plane text)如同白开水(plane water)一样平淡无味。为了防止明文中的这种冗余性威胁密码安全,我们在明文的前面加上一段随机数,再进行加密处理。这段随机数使得相同的明文,相同的密钥仍然会输出不同的密文。这一段随机数给信息含量可能很低的明文,加入了一个确定的信息量。这段随机数使得明文不再平淡,我们把它称为盐。
盐参与加密运算,使得输出变得更难以捉摸。盐的熵决定了相同输入情况下,输出的变化可能性的量。n位长的盐,使得一个明文对应2n种可能的密文。拥有足够长的盐,将立即阻断查表攻击。盐的纯度会影响味道,加密也是如此。纯的盐来自硬随机数发生器,这不并总是为目标设备所拥有。合格的伪随机数发生器,也作为盐来源。评估加密性能时,盐的使用和来源是一个必须关注的事项。
openssl加密命令缺省会使用盐,盐值来自于openssl内置的随机数发生器。openssl 的enc对称加密命令加-p参数时,输出的salt:后面的值就是本次加密所用的盐。在程序排错过程中,相同明文对应的随机密文有时会带来不便,这时我们可以用-nosalt选项临时关闭盐,以期核对我们的输出值和格式是否合乎预期。