对称加密体制

一、概述

特征:加密密钥=解密密钥
密码的算法是公开的,安全特性取决于kk(密钥)

对称密码研究的主要课题:
密钥产生
密钥管理

二、流密码

规则:将明文划分成字符(如单个字母),或其编码的基本单元(如按位),字符分别与密钥流作用进行加密,解密时以同步产生的同样的密钥流实现。
常见的密码使用\bigoplus (异或)运算来进行加密和解密。
加密时:

ci=mikic_{i}=m_{i}\bigoplus k_{i}

解密时:

mi=cikjm_{i}=c_{i}\bigoplus k_{j}

解密时需要保证ki=kjk_{i}=k_{j} ,精确同步对齐。
密文在信道上传输,是可以被攻击者截获的。每一个密文都可以被看作一个二元一次方程。攻击者所截获的密文流可以被看作二元一次方程组,但是方程之间无法联立。
如果密钥流每一位是完全随机的,攻击者也采用随机猜测的策略,每猜对一位的概率为12\frac{1}{2},连续猜对n位,即破解长度为n的密钥流的概率为12n\frac{1}{2^n}

密码强度依赖于密钥序列的随机性和不可预测性。
密钥序列的随机与不可预测:
密钥流发生器:ff
密钥流:z=z0z1...z=z_{0}z_{1}...
其中,zi=f(k,δi)z_{i} = f(k,\delta_{i})δi\delta_{i}是加密器中的记忆元件在时刻i的状态,f是以密钥kkδi\delta_{i}作为输入参数的函数。
为了理解输入参数,可以类比rand()函数的随机数种子。C/C++中这是一个伪随机函数,如果没有给它显式地输入种子,它就会选取内存中的一个固定的地址值,得到的随机数序列每次都是相同的。为了使每次获得的随机数序列不一样,通常取取系统时间作为随机数种子。)
为了理解记忆元件在时刻i的状态,可以类比图灵机。图灵机根据上一状态和当前输入决定当前输出和当前状态。
同步流密码:加密器中记忆元件的存储状态δi\delta_{i}独立于明文字符。

密钥流生成器的设计原则:
1.足够长的周期:密钥流的周期是指在加密算法中生成的密钥流序列在不重复的情况下能够持续生成的次数。如果密钥流的周期太短,密钥流序列重复,那么相同的密钥流会被用于加密不同的数据,从而导致加密算法的弱点暴露。
2.高线性复杂度:尽管非线性变换是首选,但ff 中难以避免使用线性变换,需要保证其复杂度。
3.统计性能良好:0和1出现的比例应该在50%;长度相同的不同组合出现的概率也应该相等。
4.足够的“混乱”:强调密钥的作用,增加密钥与密文之间关系的复杂性。密钥反转时,密文反转和不反转的概率各占50%。
5.足够的“扩散”:小扰动的影响波及到全局密文没有统计特征,明文一位影响密文的多位,增加密文与明文之间关系的复杂性。
6.能够抵抗不同形式的攻击。

基于有限状态自动机(Finite Automata,FA)的密钥流产生器:
同步流密码的密钥流产生器可看为一个参数为kk的FA:
输出集ZZ,状态集Σ\Sigma,状态转移函数φ\varphi和输出函数ψ\psi,初态σ0\sigma_{0}
image-20240508163129061
通常,φ\varphi 可以是线性的,因为它只负责状态转移。ψ\psi应该是非线性的,因为它和密钥流的生成紧密相关,它需要提供计特性良好的序列。

线性部分:

LFSR:线性反馈移位寄存器——流密码产生密钥流的主要组成部分
有两种常见的密钥流产生器,它们如下图所示:
image-20240508163300545
LFSR的基本概念

  • 级数(Stages): 存储单元数 nn
  • 状态(State): nn 个存储单元的存数 (ki,,ki+n1)\left(k_{i}, \ldots, k_{i+n-1}\right)
  • 反馈函数: f(ki,ki+1,,ki+n1)f\left(k_{i}, k_{i+1}, \ldots, k_{i+n-1}\right) 是状态 (ki,,ki+n1)\left(k_{i}, \ldots, k_{i+n-1}\right) 的函数
  • 线性反馈移位寄存器(LFSR): ff 为线性函数
  • 非线性反馈移位寄存器: ff 为非线性函数
    image-20240508163401465
    在LFSR工作时,向右移位,最右(kik_{i}) 被移出来作为输出,最左空出来的空位接收反馈。
    !image-20240508163455541
    ki+n=f(ki,,ki+n1)=c0kicn1ki+n1k_{i+n}=f\left(k_{i}, \ldots, k_{i+n-1}\right)=c_{0} k_{i} \oplus \cdots \oplus c_{n-1} k_{i+n-1}, 其中 :i0,ci=0: i \geq 0, c_{i}=011,是对应的系数 ,\oplus 是模 2 加法。
    该反馈函数是ki,...,ki+n1k_{i},...,k_{i+n-1} 的线性函数。

反馈多项式
LFSR的特征多项式: 以LFSR的反馈系数所决定的一元高次多项式,又称反馈多项式。

f(x)=1+c1x+c2x2++cn1xn1+cnxn=j=0ncjxjf(x)=1+c_{1} x+c_{2} x^{2}+\ldots+c_{n-1} x^{n-1}+c_{n} x^{n}=\sum_{j=0}^{n} c_{j} x^{j}

由于 ciGF(2)(i=1,2,,n)c_{i} \in \operatorname{GF}(2)(i=1,2, \ldots, n), 所以有 2n2^{n} 组初始状态, 即有 2n2^{n} 个递推序列,其中非恒零的有 2n12^{n}-1 个。

LFSR 周期的含义
定义:设 p(x)p(x)GF(2)\mathrm{GF}(2) 上的多项式,使 p(x)(xp1)p(x) \mid\left(x^{p}-1\right) 的最小 pp 称为 p(x)p(x) 的周期或者阶。
定理:设序列 {ki}\left\{k_{i}\right\} 的特征多项式 p(x)p(x) 定义 GF(2)\mathrm{GF}(2) 上, ppp(x)p(x) 的周期,则 {ki}\left\{k_{i}\right\} 的周期 rpr \mid p
定理:设序列 {ki}\left\{k_{i}\right\} 的特征多项式 p(x)p(x) 定义 GF(2)\mathrm{GF}(2) 上, 且 p(x)p(x) 是不可约多项式, ppp(x)p(x) 的周期,则 {ki}\left\{k_{i}\right\} 的周期为 pp
特征多项式的周期直接影响了LFSR的周期。选择合适的特征多项式可以确保LFSR的周期达到最大值,从而生成较长的密钥序列并提高加密算法的安全性。

mm 序列:
序列 {ki}0in\left\{k_{i}\right\}_{0 \leq i \leq n} 的周期达到最大 2n12^{n}-1 时, 称该序列为 mm 序列。
定理: 以 f(x)f(x) 为特征多项式的LFSR的输出序列是 mm 序列的充要条件为: f(x)f(x) 是本原的(阶为 2n12^{n}-1nn 次不可约多项式)。

mm 序列的性质

  • nnmm 序列的周期为 2n12^{n}-1, 周期随 nn 增加而指数级递增;
  • 只要知道 nn 次本原多项式, mm 序列极易生成;
  • mm 序列极不安全, 只要泄露 2n2 n 位连续数字, 就可完全确定出反馈多项式系数。
    由于m序列的性质,LFSR不能直接作为密钥流使用,通常是用在状态转移部分。

mm 序列的破译

  • 已知 ki,ki+1,,ki+2nk_{i}, k_{i+1}, \ldots, k_{i+2 n}, 由递推关系式可得出下式
    [kiki+1ki+n1ki+1ki+2ki+nki+n1ki+nki+2n][c0c1cn1]=[ki+nki+n+1ki+2n1]\left[\begin{array}{cccc}\boldsymbol{k}_{i} & \boldsymbol{k}_{i+1} & \ldots \ldots & \boldsymbol{k}_{i+n-1} \\ \boldsymbol{k}_{i+1} & \boldsymbol{k}_{i+2} & \ldots \ldots & \boldsymbol{k}_{i+n} \\ \cdot & \cdot & \cdot & \cdot \\ \cdot & \cdot & \cdot & \cdot \\ \cdot & \cdot & \cdot & \cdot \\ k_{i+n-1} & \boldsymbol{k}_{i+n} & \ldots \ldots & \boldsymbol{k}_{i+2 n}\end{array}\right]\left[\begin{array}{l}c_{0} \\ c_{1} \\ \cdot \\ \cdot \\ c_{n-1}\end{array}\right]=\left[\begin{array}{l}k_{i+n} \\ k_{i+n+1} \\ \cdot \\ \cdot \\ k_{i+2 n-1}\end{array}\right]
    式中有 nn 个线性方程和 nn 个未知量,故可惟一解出 ci,0in1c_{i}, 0 \leq i \leq n-1

非线性部分:

非线性函数 J-K触发器

JK\mathbf{J}-\mathbf{K} 触发器是一个非线性器件, 有两个输入端 jjkk, 输出为 qiq_{i} 输出不仅依赖于输入, 还依赖于前一个输出位 qi1q_{i-1}, 即

qi=(x1+x2)qi1+x1, 其中 x1,x2 分别为 J 和 K 的输入。 q_{i}=\overline{\left(x_{1}+x_{2}\right)} q_{i-1}+x_{1} \text {, 其中 } x_{1}, x_{2} \text { 分别为 } J \text { 和 } K \text { 的输入。 }

J K qkq_k
0 0 qk1q_{k-1}
0 1 0
1 0 0
1 1 qk1\overline{q_{k-1}}

序列密码

密码算法RC4(序列密码簇)

1.应用场
流密码常用按位运算,非常快。实际应用中,用于实时性要求高、传输量大的加密场景,比如视频加密。
使用安全套接字层SSL协议的Internet通信
无线通信领域的信息安全
作为无线局域网标准IEEE 802.11(无线网络协议)中WEP协议的一部分
2.核心思想:
工作模式:OFB模式。
随机密钥
密钥调度算法KSA
伪随机数生成算法PRGA
算法基本流程
密钥调度算法将一个随机密钥变换成一个初始置换
随机数生成算法PRGA利用初始置换生成一个伪随机输出序列
用该伪随机序列与待处理字节异或——加密/解密
待处理字节——明文/密文

初始置换
初始化 SS
线性填充: S0=0,S1=1,,S255=255S_{0}=0, S_{1}=1, \ldots, S_{255}=255
SS 盒置换
交换 SiS_{i}SjS_{j}
不断重复密钥 K\mathrm{K} (长度为 LL 字节)直至扫描完整个数组 S[255]\mathrm{S}[255]
对于 i=0i=0 至255: j=(j+Si+KimodL)mod256jj=\left(j+S_{i}+K_{i \bmod L}\right) \bmod 256 ( j 初始值为 00 )
伪随机序列的生成

  • 创建两个计数器: iijj (初始值为 0 )
  • i=(i+1)mod256i=(i+1) \bmod 256
  • j=(j+Si)mod256j=\left(j+S_{i}\right) \bmod 256
  • 交换 SiS_{i}SjS_{j}
  • t=(Si+Sj)mod256t=\left(S_{i}+S_{j}\right) \bmod 256
  • K=StK=S_{t}
    加密/解密
    message K\oplus K

三、分组密码

将明文分成等长的块,对每个块执行相同变换

电子编码薄模式(EBC):

每组64位,用同样的密钥加密各个分组。

特点:
1.操作简单,不同分组可以并行处理。
2.由于使用同一密钥,当M1=M2时,C1=C2 ,不安全。特别是对于图像数据(有固定数据格式说明)和明文变化较少的数据。弱点源于每个明文分组时分离处理的,
3.不具备错误传播特性。如果一个分组中出现传输错误,不会影响其他分组。加密时有一位明文错误,只影响对应位置的密文。解密同理,有一位密文错误只影响对应位置的明文。
4.主要用于内容较短的报文的加密。当密文较短时,不一定有M2=M2,仍然适合。

image-20240508164451796

密码分组链接模式(CBC)

将上组密文与当前明文按位异或,再用相同的密钥加密得到密文。
加密:
C1=Ek(M1IV)(j=1,2,,N)C_{1}=E_{k}(M_{1} \oplus IV)(j=1,2, \cdots, N)
Cj=Ek(MjCj1)(j=1,2,,N)C_{j}=E_{k}(M_{j} \oplus C_{j-1})(j=1,2, \cdots, N)
解密:
M1=Dk(C1)IV(j=1,2,,N)M_{1}=D_{k}\left(C_{1}\right)\oplus IV(j=1,2, \cdots, N)
Mj=Dk(Cj)Cj1(j=1,2,,N)M_{j}=D_{k}\left(C_{j}\right)\oplus C_{j-1}(j=1,2, \cdots, N)
(解密,代入即可证明。)

特点:
1)同一个消息中的两个相同的明文被加密成不同的密文;
2)不同消息的前若干个分组相同,且加密时使用相同的IV,这些分组的加密结果将一致,此时以时间戳作为IV较好;
3)如果密文分组CjC_{j}有一位传输错误,解密时可能导致对应明文分组PjP_{j}中多位出错,但密文分组中的这一位出错只会导致明文分组Mj+1M_{j+1}中对应位置的一位出错,其后的明文分组不再受影响,因此,密文分组中的一位出错具有自恢复能力;
如果明文分组MjM_j出现一位传输错误,将影响CjC_{j}以及之后的密文分组。

4)CBC模式可用于加密和认证。用于加密时不能并行处理,也不能用于加密或解密可随机访问的文件记录(因为CBC模式需要访问以前的记录)。

密码的扩散和混乱:前面的差错传递到后面。
可以用于认证:认证数据的完整性——最后的一个输出可以作为验证码,收到消息之后做同样的运算得到C‘。只要中间有差错,C’!=C,认为消息在传输过程中被干扰。
image-20240508170017816
(上图中IV=0。)

计数器模式(CTR)

计数器模式(CTR,Counter Mode)使用与明文分组规模相同的计数器长度,但要求加密不同的分组所用的计数器值必须不同。典型地,计数器从某一初值(IV)开始,依次递增 1。计数器值经加密函数变换的结果再与明文分组异或,从而得到密文。解密时使用相同的计数器值序列,用加密函数变换后的计数器值与密文分组异或,从而恢复明文。
加密:Cj=PjEk(CTR+j)(j=1,2,,N)\left.C_{j}=P_{j} \oplus E_{k}(C T R+j)\right(j=1,2, \cdots, N)
解密:Pj=CjEk(CTR+j)(j=1,2,,N)\left.P_{j}=C_{j} \oplus E_{k}(C T R+j)\right(j=1,2, \cdots, N)

计数器模式实际上是一种流密码,密文的一位传播错误只影响明文的对应位。计数器模式对实时性和速度要求较高的场合很适合。其优点有以下几点。
1)处理效率。计数器模式能够对多块报文的加、解密进行并行处理,不必等到前一块数据处理完才进行当前数据的处理,这种并行特征使其吞吐量大大提高,改善了处理效率。
2)预处理。在计数器模式中,进行异或之前的基本加密处理部分并不依赖于明文或密文的输入,因此可以提前进行预处理,这也可以极大地提高吞吐量。
3)随机访问特性。可以随机地对任意一个密文分组进行解密处理,对该密文分组的处理与其他密文无关。
4)实现的简单性。与电码本(ECB)模式和密码分组链接(CBC)模式不同,计数器模式只要求实现加密函数,不涉及解密函数,即CTR模式的加、解密阶段都使用相同的基本加密函数,从而体现出其简单性。

image-20240508173103131

密码反馈模式(CFB)

它将前一个密文块加密后与明文块异或得到当前密文块。j位密码反馈将 j位的密文用于反馈输入,即前一个密文分组(j位)被填入64位移位寄存器的低 j位,组成当前分组加密函数的输入参数之一。在CFB模式中密文单元被反馈回移位寄存器,正因如此,传输中出现的差错将会传播引起后续所有消息的损坏。(这个特性适合做消息完整性认证。)
加密:
$C_{1}=P_{1} \oplus S_{j}\left[E_{k}(I V)\right] C_{i}=P_{i} \oplus S_{j}\left[E_{k}\left(S R_{j} | C_{i-1}\right)\right](i=2, \cdots, N)解密: 解密: P_{1}=C_{1} \oplus S_{j}\left[E_{k}(I V)\right] P_{i}=C_{i} \oplus S_{j}\left[E_{k}\left(S R_{j} | C_{i-1}\right)\right](i=2, \cdots, N)式中, 式中,S_{j} [x]表示x的最左边j位;表示x的最左边 j位;{SR}_ {j}$表示移位寄存器SR左移 j位;||表示连接关系。

特点:
1)加密和解密时只使用所选定分组加密方法(如DES、AES)中的加密函数;
2)该模式可用于加密较小的分组(如一次加密一个字符或一位),不需要进行填充,因为分组的大小 j通常取决于待加密的数据单元的位数;
3)因为针对字符选用分组加密方法的加密函数进行处理,因此,效率相对较低;
4)CFB实际上是一个非同步的流加密模式,其与明文异或前的密钥流取决于加密密钥和前一个密文分组;
5)可以用同一个密钥加密多个消息,但每一个消息的初始向量IV应不同;
6)如果密文分组CjC_{j}有一位传输错误,解密时将导致对应明文分组PjP_{j}相同位置的一位出错,但只要CjC_{j}中的各位没有全部移出寄存器,后续明文分组中大多数位有50%的出错概率,只有当移位寄存器被全部刷新之后,系统才会从错误中恢复。

速度快,转送数据流
image-20240508203805693

image-20240508171523325

输出反馈模式(OFB)

将前一个加密块的输出作为密钥流与明文块异或得到当前密文块。

在输出反馈模式(OFB,Output Feedback Mode)中,加密函数的输入是64位的移位寄存器SR,对第一个分组的处理需要使用初始向量IV。每处理完一个分组,移位寄存器就左移 j位,加密函数64位输出的高 j位被反馈回64位的移位寄存器的低 j位,剩余64-j位被丢弃。这种模式主要用于面向字符的流密码加密传送,假设传输单元是 j位(j通常为8,代表一个字符,此时明文被分成 j位的片段而不是以64位作为处理单元)。OFB的加、解密原理如下图所示。
加密:
C1=P1Sj[Ei(IV)]C_{1}=P_{1} \oplus S_{j}\left[E_{i}({IV})\right]
$ C_{i}=P_{i} \oplus S_{j}\left[E_{i}\left(S R_{j} | S_{j}^{i-1}\right) \right](i=2, \cdots, N).解密: 解密: P_{1}=C_{1} \oplus S_{j}[E_{k}({IV )}] P_{i}=C_{i} \oplus S_{j}\left[E_{i}(S_{i} | S_{j}^{i-1})\right](i=2, \cdots, \cdots, N)$

式中,Sj[x]S_{j}[x]表示x的最左边 j位;SRj{SR}_{j}表示移位寄存器SR左移 j位; sji1s^{i-1}_{j}表示处理第i-1个分组时得到的 j位选择丢弃处理结果;||表示连接关系。

特点:
1)发送方(加密)和接收方(解密)都只使用所选定密码算法的加密函数;
2)没有错误传播,如果传输中出现错误,不会影响其后各位;
3)OFB是一种同步流密码,与明文异或前的密钥流独立于明文和密文;
4)密文中的一位传输错误只影响明文中的相应位。

image-20240508203940190

image-20240508171549457

问题:

1.为什么cfb和ofb都适合传数据流而cbc适合传输数据分组?

CFB和OFB模式适合传输数据流的原因在于它们可以实现实时加密和解密,而无需等待整个数据块的到达。在这两种模式中,加密和解密使用的是前一个加密块的输出结果,而不是前一个明文块。这种特性使得CFB和OFB模式可以处理连续的数据流,适合于需要即时加密处理的场景,比如网络传输或实时通信。
相比之下,CBC模式适合传输数据分组的主要原因在于其加密和解密过程是基于整个数据块的。在CBC模式中,每个数据块的加密依赖于前一个数据块的加密结果,因此需要等待整个数据块的到达后才能进行解密操作。这种特性使得CBC模式更适合于以块为单位传输数据的场景,如文件传输或数据库加密。

2.与cfb相比,为何ofb适合有扰信道上(无线通讯)传送数据流?
明文错误只影响当前密文块对应位,没有错误传播特性,抗干扰性更强。

四种工作模式的对比

image-20240508164548875

分组密码的扩散与压缩

将明文x和密文y表示成分别小于2m2^m2n2^n的整数,并用分量形式描述。每个分量分别用xi,yiGF(2)x_{i},y_{i}\in GF(2) 表示,即:
x=0m1xi2ix=(x0,x1,,xm1)y=0n1yi2iy=(y0,y1,,yn1)\|x\|=\sum_{0}^{m-1} x_{i} 2^{i} \leftrightarrow x=\left(x_{0}, x_{1}, \ldots, x_{m-1}\right) \quad\|y\|=\sum_{0}^{n-1} y_{i} 2^{i} \leftrightarrow y=\left(y_{0}, y_{1}, \ldots, y_{n-1}\right)
n>mn>m,密文长度>明文长度,则为有数据扩展的分组密码;通常是线性。
n<mn<m,密文长度<明文长度,则为有数据压缩的分组密码;通常是非线性。(非线性部分决定密码强度。)
分组密码就是将x||x||映射为y||y||(x0,1,,2m1,y0,1,,2n1)(||x| |\in {0,1,…,2m-1},||y||\in {0,1,…,2n-1})即为到其自身的一个置换π\pi,即$$ y = \pi(x)$$压缩算法.

无损压缩:对文本,可以用字典库,用特殊编码(通常长度更短)替换高频出现的字符。
有损压缩:适配笔记本的图片,去适配移动端设备,损耗一定的信息。

分组密码的置换

为了使加密运算可逆,每一个明文对应的密文唯一,这样的变换是可逆的,称这样明文到密文的变换为置换。

Feistel网络

nn bit明文分成为左右各半、长为 n2\frac{n}{2}bit的段, 以 LLRR 表示。然后进行多轮迭代, 其第 ii 轮迭代的输出为前轮输出的函数:

Li=Ri1Ri=Li1f(Ri1,ki)L_{i}=R_{i-1} \quad R_{i}=L_{i-1} \oplus f\left(R_{i-1}, k_{i}\right)

式中, kik_{\mathrm{i}} 是第 ii 轮用的子密钥, ff 是任意密码轮函数。
![[Pasted image 20240315081423.png]]
迭代分组密码:以一个简单函数ff进行多次迭代。每一次迭代被成为一轮(round),相应的函数ff被称为轮函数。每一轮的输出都以上一轮的输出yi1y_{i-1}和当前的子密钥kik_{i}作为轮函数的输入参数,得到输出。

可见迭代分组密码对每一轮变换并没有很多信心 ,需要进行多次迭代来保证密码的安全。

分组密码的填充问题

每一个分组的长度是固定的,但是明文的长度不一定是分组长度的整数倍。为了把最后一点明文凑成一个分组,所以需要填充。填充必须是可逆的。当接收者收到密文,将其解密时,必须要识别出哪一部分是密文,哪一部分是填充的字符。
一种可行的填充方法:
用文件结束字符表示明文分组的最后一个字节;
每一个分组都必须以0、1或者0、1交替的模式填充,即使明文以分组的边界结束,也必须添加一个整分组(一个结束符+其他填充)。
然而如果明文本身包含文件结束符,这样的方法是不实用的。另一种填充方法是在填充的末尾64位,记录明文的真实长度。接收者读取密文末尾的64位并解密,即可获得明文部分的长度。

分组密码评估

1.密钥空间足够大,防止强力攻击。
2.通过随机测试。
雪崩条件(avalanche condition)
任何输入位或密钥位与输出位之间不应有任何联系,即密文中不能有内容含有关于密钥或明文的提示。
精确密文雪崩标准:无论密文块的任意一位有变,密文块每个位发生改变的概率为50%;
精确密钥雪崩标准:对于一个长度固定的明文块,当密钥的任意一位发生改变时,密文块每个位发生改变的概率为50%。

在密码学中,如果一个加密算法具有良好的雪崩效应,那么即使只改变输入数据中的一个比特,也会导致输出数据中的大部分比特发生变化,且变化是随机的。
有一位密文在加密/解密的过程中参与了其他所有位的加密/解密,就有可能有这样的效应。