密码学总结(一)ofb和cfb区别
七月 18, 2025 [网络与安全] #obsidian #密码学密码学总结(一)ofb和cfb区别
一、密码常识
1.1 信息安全面临的问题以及解决方案
记住:
- 不要过于依赖密码保证信息安全,因为任何密码都会有被破解的一天;
- 不要使用低强度的密码;
- 不要使用保密的密码算法;
- 信息安全是一个系统的问题,密码只是信息安全的一部分;
1.2 加密三要素
明文和密文:加密处理的数据。
秘钥(key):用于生成明文的一串数字。
算法(algorithm):用于解决复杂问题的步骤。从明文生成密文的步骤,也就是加密的步骤,称为“加密算法",而解密的步骤则称为“解密算法"。

1.3 凯撒密码
恺撒密码(Caesar cipher)是一种相传尤利乌斯·恺撒曾使用过的密码。恺撒于公元前100年左右诞生于古罗马,是一位著名的军事统帅。
恺撤密码是通过将明文中所使用的字母表按照一定的字数“平移”来进行加密的。
为了讲解方便,我们用小写字母(a,b,c,…)来表示明文,用大写字母(A,B,C,…)来表示密文。
现在我们将字母表平移3个字母,于是,明文中的a在加密后就变成了与其相隔3个字母的D,以此类推。b变成E,c变成F,d变成G…v变成Y,w变成Z,而x则会回到字母表的开头而变成A,相应地,y变成B,z变成C。通过下图我们可以很容易地理解“平移"的具体工作方式。
比如英文hello,加密后的数据变为KHOOR。
恺撒密码的解密过程是使用与加密时相同的密钥进行反向的平移操作。比如上面例子,只要反向平移3个字母就可以解密了。
二、对称加密
2.1 什么是对称加密
对称加密是指在加密和解密时使用相同的秘钥。

2.2 分组密码
一般来说,以分组为单位进行处理的密码算法称为分组密码(blockcipher)。一个分组的比特数就称为分组长度(blocklength)。例如,DES和三重DES的分组长度都是64比特。这些密码算法一次只能加密64比特的明文,并生成64比特的密文。
2.3 分组模式
分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码模式。
比较常见的分组模式有:ECB、CBC、CFB、OFB、CTR等模式。
2.3.1 ECB模式
ECB(Electronic Code Book, 电子密码本模式),是最简单的分组模式。明文消息被分成固定大小的块(分组),并且每个块被单独加密。如果最后一个明文分组的内容小于分组长度时,需要用一特定的数据进行填充(padding)。
特点: 每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,所以效率较高。但是,由于密文有规律,如果有一个块被破解,那么使用相同的方法可以解密其他块中的数据,所以安全性较低,容易被破解。
2.3.2 CBC模式
2.3.2.1 XOR
XOR的全称是exclusive or,在中文里叫作异或。由于XOR和加法运算很相似,因此一般用+和O组合而成的符号⊕来表示XOR。
如果两个比特序列执行异或运算,只要对其中每个相对应的比特进行XOR运算就可以了(如下图)。
由于两个相同的数进行XOR运算的结果一定为0,因此如果将A⊕B的结果再与B进行XOR运算,则结果会变回A。也就是说,两个公式中的B会相互抵消。
通过上面的运算公式与加密解密非常相似:
- 将明文A用密钥B进行加密,得到密文A⊕B
- 将密文A⊕B用密钥B进行解密,得到明文A
实际上,只要选择一个合适的B(相当于秘钥),仅仅使用XOR就可以实现一个高强度的密码。
2.3.2.2 CBC模式
CBC - Cipher Block Chaining, 密码块链模式,它是一种最常见的加密模式。CBC模式中的每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密。而第一个数据块需要用初始化向量IV进行异或操作后再进行加密。
初始化向量:当加密第一个明文分组时,由于不存在前一个密文分组,因此需要事先准备一个长度为一个分组的比特序列来代替前一个密文分组,这个比特序列称为初始化向量(initialization vector),通常缩写为 IV。一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
特点:明文分组在加密之前一定会与前一个密文分组进行 XOR 运算,即便明文分组1和2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了。但是,由于CBC加密是连续的,不能并行处理,因此效率较低。
明文分组:是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。 密文分组:是指使用分组密码算法将明文分组加密之后所生成的密文。
如果将一个分组的加密过程分离出来,我们就可以很容易地比较出ECB模式和CBC模式的区别 。ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。

2.3.3 CFB模式
CFB - Cipher FeedBack, 密文反馈模式。在CFB模式中,前一个分组的密文被送回到密码算法的输入端进行加密,然后再把加密后的秘钥流和当前分组的明文进行异或操作生成当前分组的密文。
由密码算法所生成的比特序列称为
密钥流。密码算法就相当于用来生成密钥流的伪随机数生成器,而初始化向量就相当于伪随机数生成器的种子。
CFB模式的解密流程与加密流程是非常相似的。
通过对比CBC模式与CFB模式发现,在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤,而在CFB模式中,明文分组和密文分组之间则只有XOR。
在CFB模式中,由于密码算法的输出是通过计算得到的,并不是真正的随机数,因此CFB模式不可能具各理论上不可破译的性质。
2.3.4 OFB模式
OFB - Output-Feedback, 输出反馈模式。在OFB模式中,密码算法的输出会反馈到密码算法的输入中, 即上一个分组密码算法的输出是当前分组密码算法的输入。
和CBC模式、CFB模式一样,OFB模式中也需要使用初始化向量(IV)。一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
通过CFB和OFB模式对比发现,CFB和OFB模式的区别仅仅在于密码算法的输入。CFB式中,密码算法的输人是前一个密文分组,OFB模式中,密码算法的输入则是密码算法的前一个输出(如下图)。
相对地,在OFB模式中,XOR所需的密钥流可以事先通过密码算法生成,和明文分组无关。只要提前准备好所需的密钥流,就可以将明文与密钥流进行XOR操作即可,不需要动用密码算法。换个角度看,生成密钥流的操作和进行XOR运算的操作是可以并行的。
2.3.5 CTR模式
CTR - CounTeR, 计数器模式,它是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码(如下图)。
CTR模式中,每个分组对应一个计数器,并通过对计数器进行加密来生成密钥流,然后再与明文分组进行XOR操作得到密文分组。
- 计数器生成方法:
每次加密时都会生成一个随机数(nonce)作为计数器的初始值。当分组长度为128比特(16字节)时,计数器的初始值的格式为:
其中,前面8个字节为nonce,每次加密都会生成一个新的none值。后面8位位分组序号,这部分会逐次累加。
由于计数器的值是不相同的,因此每个分组中将计数器进行加密所得到的密钥流也是不同的。也是说,这种方法就是用分组密码来模拟生成随机的比特序列。
如果我们将单个分组的加密过程拿出来,那么OFB模式和CTR模式之间的差异还是很容易理解的(下图)。
OFB模式是将加密的输出反愦到密码算法的输入,而CTR模式则是将计数器的值用作密码算法的输入。
由于CTR模式在加密和解密时所需要计数器的值可以有none和分组序号计算出来,因此它能够以任意顺序处理分组。这也就意味着在支持并行计算的系统中,CTR模式的速度是非常快的。

