0


现代密码学复习

密码学总结

第一章——只因础模型与概念

1.1 密码学五元组(结合🐏皮卷)

明文、密文、加密、解密、秘钥

  • 明文:🐏皮纸裹紧在密码棒上的信息
  • 密文:单纯的🐏皮纸
  • 密钥:密码棒(Scytale)
  • 加密:将空白的🐏皮纸卷在密码棒上,再写信息
  • 解密:将含有信息的🐏皮纸裹紧在密码棒上

1.2 Dolev-Yao威胁模型

  • 他能获得经过网络的任何信息
  • 他是网络的一个合法使用者,所以可以跟任何用户对话
  • 他可以成为任何主题发出信息的接收者
  • 他能冒充任何人,给任何人发消息

1.3 攻击类型

唯密文攻击:只有密文,攻击者尽可能多的恢复明文,最好能获取密钥。

已知明文攻击:除了有截获的密文外,还有一些已知的“明文—密文对”来破译密码

选择明文攻击:密码分析者不仅可得到一些“明文—密文对”,还可以选择被加密的明文,并获得相应的密文

自适应选择明文攻击:不仅可得到一些“明文—密文对”,还可以选择被加密的明文,并获得相应的密文

选择密文攻击:可以选择一些密文,并得到相应的明文

1.4 柯克霍夫原则(Kerckhoffs's principle)

密码学上的柯克霍夫原则(Kerckhoffs's principle):即使密码系统的任何细节已为人悉知,只要密匙未泄漏,它也应是安全的。 所以现代密码学(基于柯克霍夫原则)的安全性,是密钥而非算法的安全性。

1.5 对称、非对称加密

1.5.1 对称加密(DES、AES)

传统密码算法,加密密钥能从解密密钥推出来,反之也成立。

对称加密算法可以分为两类,序列算法和分组算法。

序列算法:一次对明文中的一个bit或Byte运算

分组算法:对明文中的一组bit进行运算(经典分组长度为64位)

1.5.2 非对称加密(RSA)

公开密钥算法,加密的密钥不同于解密的密钥,而且解密密钥不能根据加密密钥计算出来。

1.5.3 对称加密的优缺点(不同)

优点:方便记忆;计算量小,速度快,适合对海量数据进行加密

缺点:

  • 密钥传输不安全,密钥易泄露
  • 用户增加导致密钥数量激增,管理困难
  • 无不可抵赖性,不能进行数字签名

1.6 密码的目标

密码协议在安全系统中,其关键目的是安全(而不是算法不可破译),借助这些安全的密码算法,达到:

  • 机密性:信道上信息的明文不被截获(先加密后传输)
  • 完整性:可以检测数据是否被有意无意地修改过
  • 认证性:身份认证,确认信息确实是XX发出的,而不是冒名顶替的
  • 抗抵赖性:对于一个正在进行的行为,参与的主体不可否认(即不能虚假的否认他发出过XX信息)

1.7 保密通信模型

如图,秘密信道(安全信道)可以将秘钥k提前传给Bob,这里我们不论他们是怎样传输的。

Alice用秘钥k和加密机,加密明文m产生密文c,密文c在公开信道(不安全信道)传给解密机,解密机通过刚刚安全信道传来的k,将解密的m传给Bob。其实整个过程中,只有密文c传输的信道是不安全的,如果不能完全理解,还可以看看网上的图。

对应的攻击和得出

唯密文攻击:只知道密文,推出明文或密钥

已知明文攻击:知道部分的明文和密文对,推出密钥和加密算法。

在这里插入图片描述

选择明文攻击:知道明文就知道密文,目标为推出密钥。 在这里插入图片描述

自适应选择明文攻击:在选择明文攻击中,密码分析者还可以选择一大块被加密的明文。而在自适应选择明文攻击中,可以选择较小的明文块,然后再基于第一块的结果选择另一个明文块,以此类推。所以其实和选择明文攻击区别不大。

选择密文攻击:知道密文就知道明文,目标为推出密钥。

在这里插入图片描述

第二章——古典密码

2.1 仿射密码

该密码运用了乘法逆元和模运算,az 对应于 025, 将明文的每个字符转为对应的数字

  • 加密函数:\small D(x) = (a*x+b) \mod 26,这里a,b变量就是密钥,注意 a必须和26互素
  • 通过加密函数得到密文的数字,在查表,组合在一起就构成了密文。
  • 解密过程与加密类似
  • 解密函数:\small E(x) = a^{-1}(x-b) \mod 26, 这里\small a^{-1}是a关于26的乘法逆元。

注:仿射密码不能抵抗唯密文攻击(也就是什么都不能抵抗),具体原因比较复杂。我们可以根据大数据字母统计类型,判断他的移位b,之后同余列方程求解a(好像是这样🙂)

2.2 Hill密码

希尔密码和仿射密码一样,是域上的线性运算。和仿射密码不同的是,这里的线性运算是矩阵乘法,因此他是多表替换的古典密码。

Step0 选取秘钥K

这一步是事先做的,随便选一个秘钥K:\small \begin{pmatrix} 1 & 2 \\ 0 & 1 \\ \end{pmatrix}

二阶矩阵求逆:

\small \begin{pmatrix} a & b \\ c & d \\ \end{pmatrix}^{-1} \equiv (ad-bc)^{-1} \begin{pmatrix} d & -b \\ -c & a \\ \end{pmatrix} \mod 26

\small K^{-1} = \begin{pmatrix} 1 & -2 \\ 0 & 1 \\ \end{pmatrix}

Step1 译码

先将明文串对应英文字母编码表进行数字转化

dloguszijluswogany--> 4 12 15 7 21 19 26 9 10 12 21 19 23 15 7 1 14 25

,然后两两一组写成矩阵形式:

\small \begin{pmatrix} 4 & 15 & 21 & 26 & 10 & 21 & 23 & 7 & 14\\ 12 & 7 & 19 & 9 & 12 & 19 & 15 & 1 & 25\\ \end{pmatrix}

Step2 加密

\small K*\begin{pmatrix} 4 & 15 & 21 & 26 & 10 & 21 & 23 & 7 & 14\\ 12 & 7 & 19 & 9 & 12 & 19 & 15 & 1 & 25\\ \end{pmatrix} = \begin{pmatrix} 1 & 2 \\ 0 & 1 \\ \end{pmatrix} \begin{pmatrix} 4 & 15 & 21 & 26 & 10 & 21 & 23 & 7 & 14\\ 12 & 7 & 19 & 9 & 12 & 19 & 15 & 1 & 25\\ \end{pmatrix}

模26后结果即为加密信息

Step3 解密

\small K^{-1}*\begin{pmatrix} 4 & 15 & 21 & 26 & 10 & 21 & 23 & 7 & 14\\ 12 & 7 & 19 & 9 & 12 & 19 & 15 & 1 & 25\\ \end{pmatrix} = \begin{pmatrix} 1 & -2 \\ 0 & 1 \\ \end{pmatrix} \begin{pmatrix} 4 & 15 & 21 & 26 & 10 & 21 & 23 & 7 & 14\\ 12 & 7 & 19 & 9 & 12 & 19 & 15 & 1 & 25\\ \end{pmatrix}

模26后结果即为解密信息

注意译码、读取结果的顺序如下:

\begin{pmatrix} 1 & 3 & 5 & ... \\ 2 & 4 & 6 & ... \\ \end{pmatrix}

例题0 ——解同余方程组

ax \equiv b\mod m 怎样求解

Step1 有没有解?有几个解?

解的个数为(a,m),例如 13x \equiv 1 \mod 25 只有一个解,而 12x \equiv 1 \mod 26 有两个解(这里的一个解是0-m里的一个解,在实数范围内有无数个解)

Step2 a,b,m 同时除以 (a.m)

这一步可以很大程度上的化简运算,这样方程就只会有一个解,之后再把解扩大到 0~m 的范围。但有时候没必要,因为(a.m)有时为1

Step3 求化简后的 ax \equiv 1\mod m

欧几里得算法,如果m小应该直接试,解出来的x记作x_0

Step4 加入b

如果(a,m)=1,则x = x_0*b \mod m

如果 (a,m)>1, x \equiv \frac{b}{(a,m)}*x_0+\frac{m}{(a,m)}*t,t = 0,1...,(a,m)-1,注意a,b,m都是题目里最开始给出的值,,不是化简后的嗷!

例题1——仿射密码

明文E(4),H(7)对应的密文F(5),W(22),求出仿射密码的秘钥

f(x) = kx+b 代入可得方程

\left\{\begin{matrix} 4k+b \equiv 5 \mod 26 & 1. \\ 7k+b \equiv 22 \mod 26& 2. \\ \end{matrix}\right.

①x7,②x4得

\left\{\begin{matrix} 28k+7b \equiv 35 \equiv 9 \mod 26 & 1. \\ 28k+4b \equiv 88 \equiv 10 \mod 26& 2. \\ \end{matrix}\right.

3b \equiv -1 \mod 26 \equiv 51 , b \equiv 17 \mod 26

将b代入①中,同理可得k \equiv 23 \mod 26

秘钥为f(x) \equiv (23x+17) \mod 26

例题2——希尔密码

FRIDAY(5,17,8,3,0,24) --> PQCFKO(15,16,2,5,10,20)

,求秘钥矩阵K

|K| \equiv | 5 \times 3- 8 \times 17 | \mod 26 = 9 \mod 26

\begin{pmatrix} 5 & 17 \\ 8 & 3 \\ \end{pmatrix}^{-1} \equiv 9^{-1} \begin{pmatrix} 3 & -17 \\ -8 & 5 \\ \end{pmatrix} \equiv 3 \begin{pmatrix} 3 & -17 \\ -8 & 5 \\ \end{pmatrix}\equiv \begin{pmatrix} 9 & 1 \\ 2 & 15 \\ \end{pmatrix} \mod 26

\begin{pmatrix} 5 & 17 \\ 8 & 3 \\ \end{pmatrix} * K \equiv \begin{pmatrix} 15 & 16 \\ 2 & 5 \\ \end{pmatrix} \mod 26

\therefore K \equiv \begin{pmatrix} 5 & 17 \\ 8 & 3 \\ \end{pmatrix}^{-1}\begin{pmatrix} 15 & 16 \\ 2 & 5 \\ \end{pmatrix}\equiv \begin{pmatrix} 9 & 1 \\ 2 & 15 \\ \end{pmatrix} \begin{pmatrix} 15 & 16 \\ 2 & 5 \\ \end{pmatrix} \equiv \begin{pmatrix} 7 & 19 \\ 8 & 3 \\ \end{pmatrix} \mod 26

第三章——DES算法

DES属于对称密码算法中的分组加密(块加密),和流密码相对应。DES算法将明文分为若干个64位块(不足补充),秘钥为56位(8位校验位)。DES算法流程图如下

接下来,进行DES算法关键步骤的逐步解析:

IP置换

IP置换和IP逆置换,还有后面提到的P置换逻辑都是一样的。例如下图IP置换矩阵的第一行 n 第一列为58,含义即为将第58个元素位置换为第一个。置换完后密文长度不变,仍为64位。

E扩展

64位字段可以分为前32位和后32位,前32位不变,后32位进行E扩展置48位,具体扩展方法如下:

例如图中原本的32位字段为,将32位字段分为8组,每组前后各加两个比特,组成新的 6 \times 8 = 48 位字段。新加的两位分别是前一组字段的最后一位和后一组字段的第一位,见下所示。

1101 0001 0011 0100 原文本

011010 100010 100110 101001 E扩展文本

S盒压缩

S盒是精心设计的8个矩阵,是DES算法中混淆的关键部分,他的质量(随机性)很大程度影响DES的加密效果。

之后,我们要再将E扩展后的48位后半字段,通过S盒压缩为32位,具体压缩方法如下:

先将48位分为8组,每组6位。6位取出前两位和中间四位,拼成2进制数,再将2进制转化为十进制,即经过一系列操作,将6位数变为2个十进制数。将这两个十进制数当作横纵坐标,寻找S盒中对应的十进制数,再将这个十进制数用4位2进制表示。至此,我们将48位文本压缩为了32位。

(3,15) 在S盒中对应的元素为13(查表得),之后转换为二进制1011,所以通过S盒我们将111111压缩为了1011。

P盒置换

P盒压缩和IP置换思路大致相似,例如第一行第一列元素为16,即将第16位置换到第一位,剩余以此类推。

秘钥生成

秘钥生成思路流程图如下:

如图中的流程,首先需要进行一次PC-1的选择置换,即去掉密钥中的校验位(8,16,...,64)。去掉8位校验位还剩下56位密钥,将56位分为C_0 (前28位)和D_0 (后28位) ,根据下表进行密钥的循环左移(如图中密钥表的计算逻辑)。得到的C_i D_i 进行合并后,再进行一次PC-2的选择置换,将密钥流变为48位。

分组加密

到现在完成了一套DES算法加密,但还存在很严重的一个问题:上述算法每次只能加密固定的64bit数据,但如果给出的明文不是64bit怎么办呢??

为了解决这个问题,提供了下面的两种方案(也就是模式):

ECB模式

ECB模式∶Electronic CodeBook mode(电子密码本模式)

CBC模式

CBC模式∶Cipher Block Chaining mode(密码分组链接模式)

这两者最大的区别即是,在发生错误时,对整个的解密加密会产生多大的影响。由加解密的流程图可见,ECB模式一旦某组出现错误,只会影响自己;但CBC模式一旦某组出现错误,会影响自己本组和后面的所有组,因为后面的密文、明文都需要和前一组进行异或操作,因此这种模式的可靠性更高。

在解密过程中,假设有一个密文分组损坏了,只要密文分组的长度没有变化,则解密时最多只会有2个分组受到数据损坏的影响。

假设密文分组中有一些比特缺失了,那么会导致密文分组的长度发生变化,此后的分组发生错位,则缺失比特的位置之后的密文分组就全部无法解密了。

CFB模式

密码反馈模式(Cipher Feedback, CFB):CFB模式不直接加密明文,而是将前一个密文使用密钥Key再加密后,与明文异或,得到密文。同样,第一个密文需要初始向量IV加密得到。

与CBC模式比较:在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤;而在CFB模式中,明文分组和密文分组之间只有XOR。

OFB模式

输出反馈模式(Output Feedback, OFB):OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。在这一点上OFB模式和CFB模式非常相似。

和CBC模式、CFB模式一样,OFB模式中也需要使用**初始化向量(IV)**。

CTR模式

计数器模式(Counter, CTR):CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。

计数器的生成方法:每次加密时都会生成一个不同的值来作为计数器的初始值。其中前8个字节为nonce,这个值在每次加密时必须都是不同的。后8个字节为分组序号,这个部分是会逐次累加的。

场景应用

首先,ECB模式是绝对不建议采用的,因为安全性太差。

其次,在有噪声的信道中,建议采用CTR模式。CTR模式使用了计数器对明文进行加密,加密后的密文与明文长度相同,可以防止填充攻击,同时也不需要向CBC模式一样进行初始化向量的传输,因此在噪声干扰较大的情况下具有更好的容错能力。

在没有噪声的信道中,除了ECB的任何模式都可以。CBC、CFB、OFB都提高了安全性。此外,CTR模式具有并行加密解密的优势,在性能方面表现较好

在混合网络模型中,应采用CBC模式和CTR模式,由于它们具有前向安全性和随机性,能够提供良好的保密性和完整性保护。

扩散与混淆

扩散

所谓扩散就是让明文中的每一位影响密文中的许多位,或者说让密文中的每 一位受明文中的许多位的影响。这样可以隐蔽明文的统计特性。

在DES算法中,扩散的代表步骤是P盒置换,将S盒输出的 32 位数据打乱重排,32 位->32 位;结果为一轮 f 函数输出。这样明文中的每一位就 可以影响密文中的许多位,达到了扩散的目的。

混淆

所谓混淆就是将密文与密钥之间的统计关系变得尽可能复杂,使得攻击者即 使获取了关于密文的一些统计特性,也无法推测密钥,使用复杂的非线性代替变 换可以达到比较好的混淆效果,例如乘积与迭代。

在DES算法中,混淆的代表步骤是 S 盒替换,S 盒替换中使用了 8 个 S 盒, 每个 6 位输入,4 位输出,起到混淆作用,48 位->32 位。这让明文密文之间的关系尽可能复杂,达到了混淆的目的。

3DES

由于DES算法密钥太短,尽管算法上安全,但容易被暴力破解。因此,为了 加长密钥使用了 3DES 算法。 对于 3DES,明文块通过加密算法进行加密;然后结果再次通过同一加密算法;第二次加密的结果第三次通过同一加密算法。

通常,第二阶段使用解密算法 而不是加密算法。 第二阶段的解密在 3DES 算法的加密上没有任何加密意义。 它的唯一优点是允许 3DES 用户通过 重复密钥 来解密由旧的单个 DES 用户 加密的数据。

第四章——高级加密标准

4.1 x乘法

使用x乘法计算f(x) \times g(x)

\\ f(x)=x^6+x^4+x+1 , g(x)=x^2+x+1 \\ f(x)=x^6+x^4+x+1=01010011 , g(x)=x^2+x+1=00000111 \\ a_1 = f(x)\times1=01010011 \\ a_2=f(x)\times x = 10100110 \\ a_3=f(x)\times x^2=(10100110 \times 00000010) \bigoplus 00011011 = 01001100 \bigoplus 00011011=01010111 \\ \therefore f(x)\times g(x) = a_1 \bigoplus a_2 \bigoplus a_3 = 10100010 = x^7+x^5+x

注:当b_7=1 ,也就是最前面的数字为1,乘x后的结果需要异或 00011011,具体原因类似溢出(课本P72)

练习题:

f(x)=x6+x3+x2+1, g(x)=x7+x4+x3+1,求 f(x) \times g(x)

\\ f(x)*x: (01001101)*(00000010)=(10011010) \\ f(x)*x^2: (01001101)*(00000100)=(00110100) \oplus (00011011)=(00101111) b_7=1 \\ f(x)*x^3: 00101111*00000010=01011110 \\ f(x)*x^4: 10111100 \\ f(x)*x^5: 01001101*00100000=01111000\oplus00011101=01100011 b_7=1 \\ f(x)*x^6: 01001101*01000000=10101010 \\ f(x)*x^7: 10001100\oplus00011011=10010111 \\ f(x)*g(x)=01001101\oplus01011110\oplus10111100\oplus10010111 =00111000

4.2 AES算法

AES 属于分组加密 算法 明文长度固定为128位 密钥长度可以是128、192、256位,算法流程图如下:

注:最后一轮没有列混合,下面的算法默认明文密文为16字节(128位)

初始变换

将明文矩阵和子秘钥矩阵进行异或,得到新的矩阵,这一步称为初始变换

字节代换

跟DES算法中几乎一模一样,例如得到新矩阵的第一行第一列元素为 19,我们将1看做行,9看做列,在S盒中查找元素(假设找到为d4),那么这个19就替换为d4,整个矩阵的16个元素依次类推。

S盒如下:

行移位

按照如下规则进行行移位:

  1. 第一行不变
  2. 第二行整体向左1个字节(一个块)
  3. 第三行整体向左2个字节(一个块)
  4. 第四行整体向左3个字节(一个块)

列混合

将得到的矩阵左乘一个固定的矩阵,得到的结果为列混合的结果。

注:列混合不是普通的进行矩阵乘法,而是基于有限域上,具体过程如下

乘法如4.1,加法即异或,注意a_7=1要异或00011011 ,这即为列混合算法(乘法加法如4.1)。

轮秘钥加

得到的矩阵,每一列和每一列对应的与一个给定的矩阵进行异或。这个给定的矩阵来自之前的子秘钥矩阵,通过秘钥扩展可以得到10个这样的“给定的矩阵”。

秘钥扩展

如图,我们设列从w_0开始计数,要求的列为w_i ,求法如下:

如果i不是4的倍数,那么第i列由如下等式确定: W[i]=W[i-4]⨁W[i-1]

如果i是4的倍数,那么第i列由如下等式确定: W[i]=W[i-4]⨁T(W[i-1])

函数T由3部分组成:字循环、字节代换和轮常量异或。

1.字循环:将1个字中的4个字节循环左(上)移1个字节。即将输⼊字[b0, b1, b2, b3]变换成 [b1,b2,b3,b0],如下图

2.字节代换:对字循环的结果使⽤S盒进行字节代换,如上S盒cf应该被替换为8a,依次类推

3.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。

如上图轮常量表在右上角已经给出,蓝色一列表示W[i-4] ,橘黄色一列表示刚刚得到的结果,浅黄色表示第一轮的轮常量Rcon[1] ,这三者异或就能得到i为4倍数情况下的扩展W[i] 。

最终秘钥扩展的结果如下图(共10组)

总结

扩散与混淆

扩散

所谓扩散就是让明文中的每一位影响密文中的许多位,或者说让密文中的每 一位受明文中的许多位的影响。这样可以隐蔽明文的统计特性。

在AES算法中,扩散的具体实现是行移位+列混淆,因为列混淆使用有限域上的矩阵乘法,让每一字节的输出密文受到多个字节影响。

混淆

所谓混淆就是将密文与密钥之间的统计关系变得尽可能复杂,使得攻击者即 使获取了关于密文的一些统计特性,也无法推测密钥,使用复杂的非线性代替变 换可以达到比较好的混淆效果,例如乘积与迭代。

在AES算法中,混淆是通过字节代换实现的,这样可以让明文、密文间的关系尽量复杂。

第五章——RSA与公钥加密

通信开销对比

RSA算法基于因素分解,ElGamal算法基于离散对数问题。这里的比较基于安全性相同,同时满足80bit安全特性。

80bit安全特性含义是:非对称加密的秘钥取多长,可以达到对称加密算法 80bit 密钥的强。他只是一个人为规定的东西,不用在意为什么这样规定。

  • 对于RSA算法,需要选取两个大素数 p、q ,要传输的内容为 M^e \mod N \equiv C,要求N=p\times q \geq 1024bit
  • 对于ElGamal公钥加密,需要选取一个大素数 p ,要传输的内容是 c =(c_1,c_2),其中算法为了达到同样的安全级别 p 要取160bit。

尽管ElGamal公钥加密要传输两个密文,但大素数 p 远远小于RSA算法的大素数N,因此传输的内容比RSA算法更少。

因此,在安全等级相同的情况下,ElGamal公钥加密比RSA算法的通信开销更小。

加密过程

  1. 选择一对不相等的大质数,记作p、q
  2. 计算N = p \times q
  3. 计算 \phi(N) = (p-1)\times(q-1)
  4. 选择一个与\phi(N)互质的整数e
  5. 计算出e对于\phi(N)的模反元素d
  6. 公钥 KU = (e,N) ,私钥KR = (d,N) 注意这括号不是最大公约数,而是表达形式,具体见例题!

如果两个正整数e和φ(n)互质,那么⼀定可以找到⼀个整数d,使得ed-1被φ(n)整除,或者说ed除以φ(n)所得余数为1。 此时,d就叫做e的模反元素。

加密 M^e \mod N \equiv C

解密 C^d \mod N \equiv M

证明

你可能现在比较疑惑,为什么 C^d \mod N \equiv M 就能得到明文,下面是证明:

先将C代入,即:(M^e \mod N)^d \mod N \equiv M

根据D-H部分的证明可得,M^{ed} \mod N \equiv M

代入 ed-1 \equiv k\phi(N) ,M^{k\phi(N)+1}\equiv M^{k\phi(N)}M \equiv M \mod N

下面的证明目标即为 M^{k\phi(N)}\equiv1 \mod N,根据欧拉定理,在 (a,N)=1 的情况下,a{^\phi(N)} \equiv 1\mod N 所以只要证明 (M^k,N)=1,即M、N互素即可。

N的构成是两个大素数p、q的乘积,所以明文M的k次幂是不可能跟两个大素数有关的,再加上本身p、q的值都非常大,即便M是长串明文,也可能通过分组的方式避免这种微乎其微的可能。

例题

  1. 取p=3、q=11;
  2. N=p \times q = 33
  3. \phi(N) = (p-1)(q-1) = 20
  4. 选择一个与\phi(N)互素的数,我们选择e=3
  5. 找到一个d使得ed \equiv 1 \mod \phi(N),解得d \equiv 7 \mod 20
  6. 公钥KU = (e,n) = (3,33),私钥KR = (d,n) = (7,33)

假如明文M=20,加密即为 20^3 \mod 33 = 14,解密即为 14^7 \mod 33 = 20

第六章——离散对数与数字签名

DH算法属于公钥加密算法,他产生的主要原因是解决

保密通信模型

中没有绝对安全信道的问题。

6.1 离散对数问题

假设a, p均为素数,则有以下等式:{a_1 \mod p, a_2 \mod p,..., a_{(p-1)} \mod p} ={1, 2,..., p-1} //{}表示集合

对于任意⼀个数x,若0<x<p,则必定存在唯一的y(0<y<p),使得x \equiv a^y \mod p。当p值很大时,很难求出y的值。

6.2 中间人攻击

只靠公钥本身是无法防御中间人攻击的。这时候,我们就需要一个第三方的可信任的机构来解决这个公钥传递的问题,那就是证书。

6.3 Diffie- Hellman 密钥交换算法

基本原理

例题

a=3,q=17

Alice: X_A = 15;Bob: X_B = 13

Y_A = 3^{15} \mod 17 \equiv6,Y_B = 3^{13} \mod 17 \equiv 12

把6传给Bob;把12传给Alice

12^{15} \mod 17 \equiv 10,6^{13} \mod 17 \equiv 1012^{15} \mod 17 \equiv 10,6^{13} \mod 17 \equiv 10这样他们就有了共同的密钥“10”

无法抵抗中间人攻击

如上图,Alice和Bob以为自己和对方交换了秘钥,但实质上都是和Darth交换秘钥,所以Darth可以获得Alice和Bob的所有明文,这样就寄了!

6.4 Merkle's Puzzles秘钥交换协议

Alice分享一枚Eve难以破译的一次性会话密钥(One-time Session Key)给Bob,其步骤如下

  1. Alice生成N个可用的会话密钥,{sk}_1, {sk}_2, \cdots, {sk}_N ,以及N个随机生成的序列号n_1,n_2,...,n_N,每个序列号与会话密钥一一对应。
  2. Alice将每对会话密钥和序列号打包成N个谜题(puzzle),令每个谜题P_i具有如下特征:
    1. 解决谜题P_i 需要一定的计算量,比如每道谜题平均需要花1小时才能解决。2. 解决谜题P_i 后,可以得到两个值:一个是会话密钥sk_i ,另一个是序列号n_i
  3. Alice将这些谜题发送给Bob,Bob随机选择一个谜题P_s加以解决,并发回相应的序列号n_s
  4. Alice根据Bob传回的序列号,确定通信双方接下来将要使用的会话密钥{sk}_s

Ralph Merkle没有限定过协议中的谜题到底应该以何种方式生成,一个比较简单的方法是利用[对称式加密算法]。假定这个算法有64位的加密强度,我们可以用一枚随机生成的密钥将sk_in_i 加密,然后当场销毁这枚随机密钥。这样一来,想要解密这道谜题,就需要进行2^{64} 次计算,满足了Merkle's Puzzles所需的条件。

在这个交换过程中,Bob只需要解决一个谜题,Alice只需要进行一次查表,两名合法用户可以非常高效的完成密钥交换;

而攻击者Eve,虽然成功窃听到所有的谜题,以及Bob传回的序列号n_s , 然而为了从谜题的汪洋大海当中找到对应的会话密钥sk_s,Eve仍然需要解决平均 \sum_{i=1}^N \frac{i}{N} = \frac{N+1}{2}个谜题。

6.5 离散对数问题与生日攻击

离散对数问题

如果对于一个整数b和质数p的一个原根a,可以找到一个唯一的指数i,使得:

b=a^i \mod p 其中0\leq i\leq p-1成立,那么指数i称为b的以a为基数的模p的离散对数。

离散对数难题是指:当已知一个大质数p和它的一个原根a,如果给定一个b,要计算i的值是相当困难的!

生日问题

生日问题是概率论上非常经典的题目,但我只能说它比较反直觉,即:当一个班人数超过23人,会有50%以上的概率两个人的生日是同一天。即便我现在完全理解了他的原因,还是觉得比较反直觉。原因如下:

这类问题直接证明不好证明,不如反过来求解,我们假设一个班同学的生日没有一天相同,再用1减去这个概率,那么式子应该这样列(N为班级的人数):

P = 1-\frac{365!}{(365-N)!356^N}

代入N=23,概率即为接近的0.5,随着人数的增长概率变化曲线如下:

生日攻击

生日攻击解决的问题为离散对数问题,具体的内容在前面已经解释,这里讲讲实现的具体思路:

我们把离散对数问题左右都设有a项,如下:

设置两个长度为\sqrt p 的列表(为什么是\sqrt p 代码里会解释):

  • 列表 1 包含a^k\mod p,通过随机选取 \sqrt p 个k得到;
  • 列表 2 包含 \beta a^{-l}\mod p,通过随机选取\sqrt p 个l得到;

根据生日问题的原理,这两个列表很有可能包含相同的项,即a^k \equiv \beta a^{-l} \mod p,这样i就迎刃而解:

i \equiv (k+l) \mod (p-1)

小步大步算法

是一种用来求解离散对数(即模意义下对数)的算法,即给出 ax\equiv b\mod m 中a,b,m的值(这里保证a和m互质,求解m

既然保证了a和m互质,那么很容易联想到欧拉定理,我们知道a^{\phi(m)} \equiv 1\mod m,也就说明 ax 在模 m 意义下有一个长度为\phi(m)的循环节。既然后面都是循环的,我们只需要考虑x\leq \phi(m) 的情形就可以了。这就有了离散对数的朴素算法:暴力枚举。复杂度O(\phi(m)),因为当 m 是质数时\phi(m)=m-1 ,最坏时间复杂度就是O(m)。

实际上,大步小步算法就是对暴力枚举的一个简单的改进, 我们把x拆成At−B ,则原式化为 a^{At-B} \equiv b\mod m ,即 a^{At} \equiv ba^B\mod m 。然后我们预计算出右侧所有可能的取值,再固定一个 t ,计算出左边可能的值,当发现某个值已经在右边出现过,这时的At−B就是我们要求的 x 。

B可能的取值有\phi (m)\mod t 个,A可能的取值有 \frac{\phi(m)}{t} 个,不难看出,取t=\sqrt{\phi(m)} 是最好的,当然为了避免计算欧拉函数,我们直接取t=\sqrt{m},不难验证,此时取A,B∈[1,t]可以保证把x\subseteq [1,m-1] 全部枚举一遍。时间复杂度为O(\sqrt{m})

区别

基本思路不同:生日攻击是一种基于哈希碰撞概率的攻击算法,而小步大步算法是一种求解离散对数的数学算法。

联系

生日攻击和小步大步算法都可以通过选择合适的算法参数提高算法效率,并且它们的复杂度分析方法也有一定的相似之处。例如,生日攻击的时间复杂度为 O(\sqrt{n}),而小步大步算法的时间复杂度为O(\sqrt{p}),其中 n 是哈希函数输出长度,通常为\sqrt{p},p 是离散对数的模数长度。

6.6 ElGamal数字签名的实现过程

核心思想:ElGamal 签名方案的安全性在于 x 的保密性。由于离散对数问题难解,很难由 (p,g,y)确定x.

Alice 要对一个消息签名。

Alice选择一个大素数 p 和一个本原根 g。选择一个秘密整数x满足 1\leq x \leq p-2,并且计算y\equiv g^x \mod p, (p,g,y)公开。x秘密保存。

  • 使得 a^m\equiv1 \mod p 成立的最小正幂m满足m=\varphi(p) ,则称a是p的本原根。

数字签名:Alice 签署消息 m

  • 选择一个安全的随机数 k, 使得 gcd(k,p-1)=1 ;
  • 计算 r \equiv g^k \mod p
  • 计算 s \equiv k^{-1} (m-xr)\mod (p-1);
  • Alice 签署的消息是三元组(m,r,s);

验证:Bob 确认签名

  • 获取Alice 的公钥(p,g,y);
  • 计算 v_1 \equiv y^rr^s \mod p , v_2 \equiv g^m \mod p
  • 当且仅当 v1 \equiv v2 \mod p 时,签名是有效的。

RSA与ElGamal的区别

前者基于因数分解,后者基于离散对数。

RSA算法的缺点就是产生密钥较麻烦,受到素数产生限制的影响,难以做到一次一密;而ELGamal算法的缺点就是它的计算量特别大,而且密文会成倍的扩张。

第七章——秘钥管理技术

秘钥分配中心(KDC)

分配过程

对称密码的集中式密钥分配的过程如图所示:

  1. A 向 KDC 发出会话密钥请求:请求的消息由 A 和 B 的身份,惟一识别符N_1。
  2. KDC 为 A 的请求发出应答。
  3. A 存储会话密钥,并向 B 转发 EKB[KS‖IDA] 。
  4. B 用 KS 加密随机数 N_2,并将加密结果发送给 A。
  5. A 以 f(N_2)作为对 B 的应答,其中 f 是对 N_2 进行某种变换的函数,并加密后发送给 B

注意: 第3步就已完成密钥分配,第4、5两步结合第3步执行的是认证功能。可使 B 相信第3步收到的消息不是一个重放。

第八章——几个重要的密码学话题

8.1 Shamir 门限方案

门限秘密分割

秘密

s

被分成

n

份毫无相关的部分信息,每一部分信息称为一个子密钥,由一个参与者持有,只有至少拥有

k

份子密钥时才能恢复出秘密

s

,这种方案为

(k, n)-秘密分割门限方案

k

称为方案的门限值。

Shamir门限方案就是一种门限秘密分割方案,他是基于[拉格朗日插值公式]的

f(x)=\sum_{j=1}^{k}{f(i_{j}) \prod_{l=1,l!=j}^{k}{\frac{x-i_l}{i_j-i_l}}}\mod p

子密钥生成算法

  1. 秘密为S
  2. 取大素数p
  3. 确定n,作为子密钥的持有者的数量
  4. 确定k,作为门限值
  5. 在1~p的有限域中随机取k-1个数,记做 a_1,a_2, ... a_{k-1},作为k-1次多项式f(x)的非常数项的系数
  6. 写出多项式为f(x)= S +a_1x+a_2x +...+a_{k-1}x^{k-1},共n项,S是秘密,作为常数项放在多项式内
  7. n个持有者记做 P_1,P_2,....P_{n},P_i 分到的子密钥为f(i)
  8. 销毁多项式

例题

k=3,n=5,p=19f(1)=1,f(2)=5,f(3)=4,f(4)=17,f(5)=6,取(2,5),(3,4),(5,6) 来破解秘密信息S

\\ f(2) \times \frac{(x-3)(x-5)}{(2-3)(2-5)} \equiv 5(x-3)(x-5)\times 3^{-1} \mod 19 \equiv 5 \times 13 (x-3)(x-5) \mod 19 \\ f(3) \times \frac{(x-2)(x-5)}{(3-2)(3-5)}\equiv 4(x-2)(x-5)\times -2^{-1} \mod 19 \equiv 4 \times 9 (x-2)(x-5) \mod 19 \\ f(5) \times \frac{(x-2)(x-3)}{(5-2)(5-3)}\equiv 6(x-2)(x-3)\times 6^{-1} \mod 19 \equiv 6 \times 16 (x-2)(x-3) \mod 19

三者相加,系数对19取模后得到:

f(x) = 7x^2+2x+11,所以秘密S为11

第九章——密码学新技术

9.1 椭圆曲线加密(ECC)

困难问题

Q = kP中,已知k、P根据离散对数下的加法法则(见后),求Q很容易,但是已知Q、P求出前面的系数k很难

加法法则

如下图,A+B的位置如下图左所示,所以他并不是简单的加法,而是点与点直接的跳跃,同理A+2A=3A如下图右

加密解密过程

加密过程 Q = kP

  1. 选⼀条椭圆曲线E_p(a,b)(离散对数表示例子:E_{23}(2,3)\to y^2\equiv x^3+2x+3 \mod 23), 并取椭圆曲线上⼀点作为基点P。
  2. 选定⼀个⼤数k作为私钥,并⽣成公钥Q=kP。
  3. 加密:选择随机数r,将消息M⽣成密⽂C。 密⽂是⼀个点对,即C=(rP, M+rQ)。
  4. 解密:M+rQ-k(rP) = M+r(kP)-k(rP) = M

离散化

这里还有一个问题,椭圆曲线是一个连续的曲线,在应用中不适合找点,所以要把曲线离散化,即将曲线放在一个有限域中。

推导出生成秘钥k和加法公式,已知 y^2 = x^3+ax+b \mod P

注意,公式中不论P、Q两点是不是横坐标相同,只区分两点是否重合。

例题_基础

利用椭圆曲线实现**

ElGamal

**密码体制,设椭圆曲线是E_{11}(1,6),生成元 G=(2,7)

(5,2)+(2,7)

已知椭圆曲线方程为y^2 = x^3+x+6 \mod 11

\\ k\equiv\frac{7-2}{2-5}\mod 11\equiv5\times(-3)^{-1}\equiv5\times7 \mod 11 \equiv 2 \mod 11 \\ x_3 \equiv k^2-x_1-x_2\equiv2^2-5-2 \equiv 8\mod 11 \\ y_3 \equiv 2\times(5-8)-2 \mod 11\equiv 3 \mod 11

所以(5,2)+(2,7)=(8,3)

例题_复杂

利用椭圆曲线实现**

ElGamal

**密码体制,设椭圆曲线是E_{11}(1,6),生成元G=(2,7),接收方A的秘密钥n_A=7

(1)求A的公开钥P_A

解:P_A=n_AG=7G=2\times2G+3G

先求2×2G

\\ k=(3\times 5^2+1)/(2\times 2) \mod 11=10\times 3 \mod 11=8 \\ x_3=8^2-5-5 \mod 11=10,y_3=8(5-10)-2 \mod 11=2

所以2*2G=(10,2)

P_A=(10,2)+(8,3)

由于k=(3-2)/(8-10) \mod11=1\times5 \mod11=5

x_3=5^2-10-8 \mod 11=7,y_3=5(10-7)-2 \mod 11=2

所以P_A=(7,2)

(2)发送方B欲发送P_m=(10,9),选择随机数k=3,求密文C

这里符号表示有些混乱,k有时是密钥有时是随机数,但读者完全可以自行区分开。

解:C=(kG,P_m+kP_A) \\

kG=3G=(8,3),kP_A=2P_A+P_A=3G+7G=(2,7)+(7,2)

这里2P_A可以自行计算。

由于k=(2-7)/(7-2) \mod11=-1

\\ x_3=(-1)^2-2-7 \mod 11=3, y_3=-1(2-3)-7 \mod 11=5 \\ P_m+kP_A=(10,9)+(3,5) \\ k=(5-9)/(3-10) \mod11=-1 \\ x_3=(-1)^2-10-3 \mod 11=10, y_3=-1(10-10)-9 \mod 11=2 \\ C=(kG,Pm+kP_A)=((8,3),(10,2)) \\

9.2 密钥更新

定义

无论密钥多么安全,也需要定期更换。用新密钥代替原密钥的过程叫做密钥更新。一般对密钥存储区进行清除或者随机产生噪声进行重写。但产生新密钥后,旧密钥也会使用一段时间,防止更换密钥期间出现不能解密的情况。

密钥更换的越频繁,系统安全性就越高。但同时也会造成网络负担。所以在决定密钥有效期时,需要权衡两方面考虑。

面向连接的协议,在连接未建立或断开时,有效期可以很长。每次建立连接应使用新密钥,如果逻辑连接时间很长则需要定期更换密钥。

无连接协议没有确定频率。比较好的方案是在一固定周期内,或对一定数目的业务使用同一会话密钥。

前向安全性

前向安全性(forward secrecy),也称为完美前向保密(perfect forward secrecy),指的是在某个密钥泄漏的情况下,之前加密的通信内容仍然是安全的。许多基于公钥加密算法的密钥协商协议,如Diffie-Hellman密钥交换,都具有前向安全性。而对称加密算法通常不具备前向安全性。

单向函数

最典型的单向函数就是离散对数问题。在 b=a^i\mod p 中,当已知一个大质数 p 和它的一个原根a,如果给定一个b,要计算i的值是相当困难的!但一直i算出b却很简单。

像这样的单项函数还有很多,例如DES算法中的F函数,哈希函数等,这些函数保证了密码学算法的安全。

如何实现前向安全性的秘钥更新

在密钥更新过程中,通常将当前密钥和其他随机数作为单向函数的输入,生成新密钥作为输出。

由于离散对数是难解问题,b \equiv a^i\mod p 中已知b、a、p求i是非常困难的。那么我们选定一个大素数p,将需要更新的秘钥置为i,a是一个随机数,b即为更新的秘钥。即便得到当下的b、p,想要遍历随机数a求得i是非常困难的,因此这样的密钥更新保证了前向安全性。


本文转载自: https://blog.csdn.net/qq_52504945/article/details/129307813
版权归原作者 yhryhryhr- 所有, 如有侵权,请联系我们删除。

“现代密码学复习”的评论:

还没有评论