ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分组密码总结

2021-12-15 17:58:01  阅读:195  来源: 互联网

标签:总结 加密 字节 比特 明文 密码 分组 密钥


分组密码

分组密码就是将明文消息序列划分成长为n的组,各组分别在密钥k控制下,变成等长的输出序列。

  • 代换: 明文分组到密文分组的可逆变换为代换。
  • 扩散和混淆: 扩散和混淆是Shannonon提出的设计密码系统的两个基本方法,目的是抗击敌手对密码系统的统计分析。扩散是将明文的统计特性散布到密文中,使密文中的每一位由明文中多位产生。混淆是使密文和密钥之间的统计关系变得尽可能的复杂,使敌手无法获得密钥。

Feistel密码结构

很多分组密码的本质是Feistel结构。是一种代换-置换网络。其结构如下

在这里插入图片描述

如图,加密算法输入是分组长为2w的明文和一个密钥K。将每组明文分为左右两半L0和R0,在进行为n轮迭代后,左右两半合在一起产生密文分组。其第i轮迭代为:
L i = R i − 1 L_i = R_{i-1} Li​=Ri−1​

R i = L i − 1 ⨁ F ( R i − 1 , K i ) R_i = L_{i-1}\bigoplus F(R_{i-1},Ki) Ri​=Li−1​⨁F(Ri−1​,Ki)

Feistel网络的安全性与以下参数有关:

  1. 分组大小
  2. 密钥大小
  3. 轮数
  4. 子密钥产生算法
  5. 轮函数
  • Feistel解密结构

Feistel解密结构和加密本质一样,算法使用密文作为输入,但使用密钥Ki的次序与加密的过程相反。如上图右边。

数据加密标准DES

在这里插入图片描述

如上图是DES的算法框图,其中明文分组长为64比特,密钥长为56比特。左边是明文处理过程,分为3个阶段。

  1. 初始置换IP

用于重排64比特明文数据,规则如下表:

在这里插入图片描述

如:第1位用第58位替换

  1. 轮变换

进行具有相同功能的16轮变换,每轮都有置换和代换运算。具体结构如下:

在这里插入图片描述

(其中右边为密钥的生成)

将64比特分组的明文分为左右两部分,记为L,R和Feistel网络结构一样。右半部分R为32比特,首先经过选择扩展运算E,扩展为48比特。选择扩展运算E规则如下表:

在这里插入图片描述

扩展后的48比特在于子密钥Ki异或,然后在经过S盒,由48比特变为32比特的输出。S盒运算如下:

将48比特的数据分为8个6比特的分组分别通过s1,s2,...,s8的转换。

在这里插入图片描述

将通过S盒运算产生的32比特数据再经过置换运算P输出32比特,置换运算P规则如下:

在这里插入图片描述

接下来就按照上面图示进行。

  1. 密钥的产生

接下来讲解图中右边的密钥产生算法。输入算法的56比特首先经过一个置换运算PC-1,产生56比特输出,规则如下:

在这里插入图片描述

然后将置换后的56比特分为各为28比特的左右两部分,记为C,D,在第i轮分别对Ci-1和Di-1进行循环左移,移位数由上表所示。移位的结果作为下一轮的子密钥的输入,同时也作置换选择2的输入。通过置换选择2产生48比特的Ki,作为本轮的子密钥参与加密的轮变换。置换选择2由上图所示。

解密

Feistel结构一样,DES加密和解密使用同一算法,而子密钥使用顺序相反。

二重DES

为了提高DES的安全性,可使用二重DES,其中P为明文,K1K2为两个加密密钥。密文为
C = E K 2 [ E K 1 [ P ] ] C=E_{K_2}[E_{K_1}[P]] C=EK2​​[EK1​​[P]]
解密
P = D K 1 [ D K 2 [ C ] ] P = D_{K_1}[D_{K_2}[C]] P=DK1​​[DK2​​[C]]
对二重DES可以采用中途相遇攻击:

如果已知一个明文密文对,首先用所有的256个可能的`K1`对明文加密,将加密结果存入一个表,然后用256个所有可能的K2对密文解密,在上述的表中找到与解密结果相匹配的项,找到就可以确定K1K2是所要找的密钥。

三重DES

为了抵抗中途相遇攻击,可以使用三重DES,使用两个密钥作三次加密
C = E K 1 [ D K 2 [ E K 1 [ P ] ] ] C=E_{K_1}[D_{K_2}[E_{K_1}[P]]] C=EK1​​[DK2​​[EK1​​[P]]]

差分密码分析和线性密码分析

差分密码分析是迄今已知攻击迭代密码最有效的方法之一,其基本思想是:通过分析明文对的差值对密文对的差值的影响来恢复某些密钥比特。

线性密码分析是对迭代密码的一种已知明文攻击,它利用的是密码算法中的“不平衡的线性逼近”。

分组密码的运行模式

分组密码在加密时明文分组的长度是固定,而实用中待加密消息的数据量是不定的,数据格式可能多种多样,所以产生了4中分组密码的运行模式。

  1. 电码本模式ECB

每个分组独立的以同一密钥加密。用于传送短数据。

在这里插入图片描述

长度不够需要进行填充,可以用于传递DES密钥。但如果明文分组在消息中重复出现的话,密文分组也一样,这会给攻击者带来方便。

  1. 密码分组链接模式CBC

为了解决ECB的安全缺陷,CBC可以让重复的明文分组产生不同的密文分组。适用于数据分组和认证。

一次对一个明文分组加密,每次加密使用同一密钥,加密算法的输入当前明文分组和前一次密文分组的异或。

在这里插入图片描述

IV应该被保密发送给对方。

  1. 密码反馈模式CFB

利用CFB可以将分组密码转换为流密码,加密时,加密算法的输入是64比特的移位寄存器,其初始值是某个初始向量IV。加密算法输出的最左j比特于明文的第一个单元P1异或,产生的密文的第一个单元C1,并传送该单元。然后将移位寄存器的内容左移j位,并将C1送入移位寄存器的最右j位。

在这里插入图片描述

在这里插入图片描述

  1. 输出反馈模式OFB

OFB类似于CFB不同之处在于OFB模式是将加密算法的输出反馈到移位寄存器,而CFB是将密文单元反馈到移位寄存器。

在这里插入图片描述

在这里插入图片描述

优点:

不需要填充
错误不传播
抗消息流篡改攻击的能力不如CFB

AES算法

AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

在这里插入图片描述

AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。一般地,明文分组用字节为单位的正方形矩阵描述,称为状态矩阵。在算法的每一轮中,状态矩阵的内容不断发生变化,最后的结果作为密文输出。该矩阵中字节的排列顺序为从上到下、从左至右依次排列,如下图所示:
在这里插入图片描述

类似地,128位密钥也是用字节为单位的矩阵表示,矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加(下面介绍);后面40个字分为10组,每组4个字(128比特)分别用于10轮加密运算中的轮密钥加,如下图所示:
在这里插入图片描述

AES的整体结构如下图所示,其中的W[0,3]是指W[0]、W[1]、W[2]和W[3]串联组成的128位密钥。加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。最后一轮迭代不执行列混合。另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。
在这里插入图片描述

上图也展示了AES解密过程,解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。

一、字节代换

字节代换是非线性变换,独立的对每个字节进行,代换表(S盒)是可逆的,由如下两个步骤实现:

(1)首先,将字节看作GF(2^8)上的元素,映射到自己的乘法逆元。

(2)对每个字节作以下变换

在这里插入图片描述

其实可以不用进行计算,S盒是一个固定的表,可以查表得到字节代换结果。

逆字节代换通过以上的逆运算得到,也可以查逆S盒。

二、行移位

行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示:

在这里插入图片描述

行移位的逆变换是将状态矩阵中的每一行执行相反的移位操作,例如AES-128中,状态矩阵的第0行右移0字节,第1行右移1字节,第2行右移2字节,第3行右移3字节。

三、列混合

列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:在这里插入图片描述

状态矩阵中的第j列(0 ≤j≤3)的列混合可以表示为下图所示:

在这里插入图片描述

其中,矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法。这里涉及到一些信息安全上的数学知识,不过不懂这些知识也行。其实这种二元运算的加法等价于两个字节的异或,乘法则复杂一点。对于一个8位的二进制数来说,使用域上的乘法乘以(00000010)等价于左移1位(低位补0)后,再根据情况同(00011011)进行异或运算,设S1 = (a7 a6 a5 a4 a3 a2 a1 a0),刚0x02 * S1如下图所示:
在这里插入图片描述

也就是说,如果a7为1,则进行异或运算,否则不进行。
类似地,乘以(00000100)可以拆分成两次乘以(00000010)的运算:

在这里插入图片描述

乘以(0000 0011)可以拆分成先分别乘以(0000 0001)和(0000 0010),再将两个乘积异或:

在这里插入图片描述

列混合逆运算

在这里插入图片描述

四、轮密钥加

轮密钥加是将128位轮密钥Ki同状态矩阵中的数据进行逐位异或操作,如下图所示。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节,他们的生成算法下面在下面介绍。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。

在这里插入图片描述

密钥扩展

AES首先将初始密钥输入到一个4*4的状态矩阵中,如下图所示。
在这里插入图片描述

这个44矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为"abcdefghijklmnop",则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”。
接着,对W数组扩充40个新列,构成总共44列的扩展密钥数组。新列以如下的递归方式产生:
1.如果i不是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁W[i-1]
2.如果i是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁T(W[i-1])
其中,T是一个有点复杂的函数。
函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
b.字节代换:对字循环的结果使用S盒进行字节代换。
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。
轮常量Rcon[j]是一个字,其值见下表。
列由如下等式确定:
W[i]=W[i-4]⨁T(W[i-1])
其中,T是一个有点复杂的函数。
函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
b.字节代换:对字循环的结果使用S盒进行字节代换。
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。
轮常量Rcon[j]是一个字,其值见下表。
在这里插入图片描述
AES的讲解参考了https://blog.csdn.net/qq_28205153/article/details/55798628

标签:总结,加密,字节,比特,明文,密码,分组,密钥
来源: https://blog.csdn.net/weixin_44109140/article/details/121957760

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有