目录
一、什么是CBC模式
二、初始化向量
三、异或运算
四、密钥少一位会有影响吗
一、什么是CBC模式
CBC模式中,明文分组在加密前,要与前一组的密文分组进行异或运算,异或运算的结果参与加密函数的运算。
每一个密文分组,都依赖于前面所有的明文分组,包括初始化向量。
加密过程中:加密函数的输入数据是明文分组和上一次密文分组异或运算的结果。
解密过程中:解密函数的输入数据是密文分组,得到的结果是明文分组和上一次密文分组异或运算的结果,因此,要得到明文分组,还要将他们分离开来。
加密过程的初始化向量和解密过程的初始化向量必须一样,否则无法得到第一个明文分组。初始化向量只影响第一个明文分组,并不影响后续的解密过程和明文分组。
加密分组只影响它的下一个明文分组,并不影响后续的解密过程和明文分组。
而在加密过程中,每一个密文分组,都依赖于前面所有的明文分组,包括初始化向量。
二、初始化向量
如果每一次运算,初始化向量都不能重复,即使是相同的明文数据,它的加密结果也是不同的。但是,如果初始化向量重复使用,相同的明文就会有相同的密文。重复使用的初始化向量,会消解密文反馈的作用,使得CBC模式和ECB模式一样脆弱。
所以,初始化向量的唯一性在加密算法中的安全性至关重要。
初始化向量不需要保密。
三、异或运算
异或运算在密码学中应用广泛,为什么?
第一个原因:异或运算数据只与数据的位数有关,与数值无关,因此无法通过运算时间和数值的的关联来破解密码。
第二个原因:在相同的计算环境下,异或运算的复杂度,只与数据的位数相关。因而无法通过CPU的占用、电力消耗或内存消耗,来破解密码。
第三个原因:相同的数据归0,不同的数据归
归零律:如果两段数据完全相同,它们的异或运算结果,就是每一位都是零的数据;
恒等律:如果一段数据和一段全足零的数据进行异或运算,前一段数据中是要的位运算后还是零,是一的位运算后还是一。也就是说,和零进行异或运算,不改变原数据的数值。正是异或运算的归零律和恒等律,CBC模式才能成立,解密才能进行。这两个性质,还使得解密运算和加密运算具有相同的运算效率。
然而,CBC模式的主要安全问题,也来源于异或运算的这两个性质。
如果两段数据中只有一位不同,它们的异或运算结果,就是只有这一位的数据是一,其他的数据都是零。那是不是我们就可以通过构造明文分组或者密文分组,一次改变一位数据,然后把数据交给加密运算或者解密运算来处理,通过观察加密或者解密的结果展开攻击了?
比如说,一个128位的密钥,它的强度能承受2^128次的运算,是一个强度的指数级别的量级。一次改变一个字节的意思就是攻击的时候,需要一个字节一个字节的尝试。256表示,一个字节有8位,如果每次改变这个字节的一位,需要256次,才能把这个字节所有的可能数值列举完。4080表示攻击一个数据分组需要的计算量,一个字节需要256次,由于尝试了255种可能性后,最后一种可能性就不需要再尝试了,所以不是256,是最多需要255次尝试。一个数据分组16个字节,255乘以16,就是需要的计算次数。
阻断一个攻击的方式之一,就是破坏攻击依赖的路径或者条件。对于上面的攻击方式,其实只要攻击者没有办法一次改变一位数据或者少量的数据,这样的攻击就可以被有效破解了。
也就是要保证攻击者在展开攻击的时候,没有办法一次改变不少于一个数据分组的数据。对于AES来说,数据分组大小是128位,攻击者需要运算2^128次,才可以攻击得逞。
57
计算量这么大,攻击者的攻击方式就无效了。那我们怎么做才能让攻击者没办法呢?
密文分组、密钥、加密算法、解密算法,这些都是固定的数据或算法,没有考量的空间。剩下的变量,就只有明文分组和初始化向量了。要想解决掉这个安全问题,该怎么控制明文分组和初始化向量?异或运算又是怎样带来麻烦的?
四、密钥少一位会有影响吗
在分组运算中,初始化向量、密文分组和明文分组密钥的数据位数也都是固定的。所以,我们也不需要担心它们的位数的变化。加密算法和解密算法不涉及数据位数,所以我们也不担心算法。剩下的一个变量,就是密钥了。密钥的位数会变化吗?密钥的位数变化有影响吗?
出于互操作性的考虑,很多标准和协议(包括应用最广泛的TLS 1.2协议)需要把密钥的高位的零清除掉,然后再参与运算。
原来128位的密钥,可能就被清除成了127位或者126位的密钥了。2018年发布的的TLS 1.3版本,不再需要清除密钥高位的零。少一位密码,当然会带来计算性能的差异,以及由此引发的计算时间偏差。
“浣熊攻击”可以利用密钥高位清零的造成的计算时间差,通过观察,测算运算时间,运用统计学的技术破解运算密钥。因此,我们要量避免计算时间偏差和计算算力偏差,谨慎地处理不可避免的计算时间偏差和算力偏差。