现代密码学的任务不仅仅只限于传统密码学的“保密通信”,而是含义更广的“信息安全”,其中包括“保密通信”、“数据加密”、“数字签名”等重要的功能。现代密码学已成为信息时代无处不在不可或缺的信息安全卫士。

现代密码学的安全性主要由密钥的设计和使用决定。

按技术特征,现代密码学分为三类:

对称算法、非对称算法、摘要算法

今天主要讲讲对称算法0w0

对称算法

又称传统密码算法、秘密密钥算法或单密钥算法。加密与解密密钥一样的密码算法。该算法又分为序列密码(流密码)算法、分组密码算法

序列密码算法

序列密码也称为流密码,它是对称密码算法的一种。序列密码具有实现简单、便于硬件实施、加解密处理速度快、没有或只有有限的错误传播等特点。

在实际应用中,特别是专用或机密机构中保持着优势,典型的应用领域包括无线通信、外交通信。

1949年Shannon证明了只有一次一密的密码体制是绝对安全的,这给序列密码技术的研究以强大的支持,序列密码方案的发展是模仿一次一密系统的尝试。那神马是一次一密呢?

1、密钥和加密的消息等长

2、密钥由真正随机符号组成

3、密钥只用一次,永不对其他消息复用

这就像在一天的24小时之内,把每个时间点看成一个密钥,每一个密钥一一对应一个时间点,永不复用。

RC4加密

RC4原理

1、密钥流:RC4算法关键是依据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是相同的。假如明文有333字节,那么密钥流也要有333字节。当然,加密生成的密文也是333字节。

2、状态向量S:长度为256,S[0],S[1]…..S[255]。每一个单元都是一个字节,算法执行的不论什么时候。S都包含0-255的8比特数的排列组合,仅仅只是值的位置发生了变换。

3、暂时向量T:长度为256,每一个单元也是一个字节。假如密钥的长度是256,就直接把密钥的值赋给T,否则,轮转地将密钥的每一个字节赋给T

4、密钥K:长度为1-256字节。密钥≠密钥流!二者长度没有必然关系,通常密钥的长度为16字节

搜狗截图20210730224154

柯克霍夫原则Kerckhoffs

提出:即使密码系统的任何细节已为人悉知,只要密钥(key)未泄漏,它也应是安全的。

Kerckhoffs准则认为,一个密码系统的安全性不是取决于其算法对于攻击者来说是否保密,而是建立在它所选择的密钥对于攻击者来说是否保密。

实践

使用CrypTool对字符串进行RC4加解密操作

step1:待加密明文

Snipaste_2021-07-30_23-03-00

step2:选择RC4加密

搜狗截图20210730230527

step3:选择8bits密钥长度,并点encrypt显示密文

搜狗截图20210730230610

搜狗截图20210730230746

step4:试试24bits密钥长度加密后的密文

image-20210730230930203


—对8bits密钥长度进行穷举攻击

安全研究人员称,现在世界上近三分之一的HTTPS加密连接可被破解,并且效率极高。这种针对RC4加密的破解技术,同样也可以用来破解WiFi数据包。

研究人员很早前就发现可以利用RC4中的统计偏差,导致可对加密信息中的一些伪随机字节能进行猜测,8bits密钥长度加密的密文,几乎可以秒破解,而24bits的密钥长度可能需要几分钟,这就是之前文章所说的“时间复杂度”

step1:按RC4分解

1

step2:8bits长度密钥加密密文

2

step3:秒破解穷举结果

3


分组密码算法

把明文分成了确定长度的数据块(字节块),用同一密钥和算法加密每一明文块后得到等长的密文块,然后把密文块按顺序组合起来得到密文。反之也可以得到明文。

IDEA加密算法

IDEA是International Data Encryption Algorithm的缩写,即国际数据加密算法,广泛的应用在安全电子邮件PGP中。

IDEA加密算法是一个分组长度为64位的分组密码算法,密钥长度为128位,同一个算法即可用于加密,也可用于解密。发展IDEA也是因为感到DES具有密钥太短等缺点。IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。这是基于“相异代数群上的混合运算”设计思想,算法运用硬件与软件实现都很容易,而且比DES算法在实现上快的多。IDEA自问世以来,已经经历了大量的详细审查,对密码分析具有很强的抵抗能力,在多种商业产品中被使用。

IDEA加密算法的原理

64-位数据分组被分成4个16-位子分组:xl,X2,x3,x4。

这4个子分组成为算法的第一轮的输入,总共有8轮。

在每一轮中,这4个子分组相列相异或,相加,相乘,且与6个16-位子密钥相异或,相加,相乘。

在轮与轮间,第二和第二个子分组交换。最后在输出变换中4个子分组与4个子密钥进行运算。

以下表述中的相加,指的是:(a + b) mod p,其结果是a+b算术和除以p的余数。例如对于下列表述中的“(2)X2和第二个子密钥相加”就是指用X2与第二个子密钥的和除以2^16(即65536)后的余数。

以下表述中的相乘,指的是:(a × b) mod p,其结果是 a × b算术乘法除以p的余数。例如对于下列表述中的“(1)X1和第一个子密钥相乘。”就是指用X1和第一个子密钥相乘后的积除于(2^16+1)(即65537)后的余数。

异或指的是不进位加法。

(1)X1和第一个子密钥相乘。

(2)X2和第二个子密钥相加。

(3)X3和第三个子密钥相加。

(4)X4和第四个子密钥相乘。

(5)将第(1)步和第(3)步的结果相异或。·

(6)将第(2)步和第(4)步的结果相异或。

(7)将第(5)步的结果与第五个子密钥相乘。

(8)将第(6)步和第(7)步的结果相加。

(9)将第(8)步的结果与第六个子密钥相乘。

(10)将第(7)步和第(9)步的结果相加。

(11)将第(1)步和第(9)步的结果相异或。

(12)将第(3)步和第(9)步的结果相异或。

(13)将第(2)步和第(10)步的结果相异或。

(14)将第(4)步和第(10)步的结果相异或。

每一轮的输出是第(11)、(12)、(13)和(14) 步的结果形成的4个子分组。将中间两个分组分组交换(最后一轮除外)后,即为下一轮的输入。

经过8轮运算之后,有一个最终的输出变换:

(1) X1和第一个子密钥相乘。

(2) X2和第二个子密钥相加。

(3) X3和第三个子密钥相加。

(4) X4和第四个子密钥相乘。

最后,这4个子分组重新连接到一起产生密文。

DES对称加密算法

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法

DES算法就是一个把64位的明文输入块变为64位密文输出块的算法,它所使用的密钥也是64位(其实只使用到了56位,其余8位为奇偶校验位

DES算法的入口参数有三个:Key、Data、Mode。

Key(密钥):为7个字节共56位,是DES算法的工作密钥(若说密钥为64位,其指的也是56位的秘钥加上8位奇偶校验位,奇偶校验位为第8,16,24,32,40,48,56,64位)

Data(数据):为8个字节64位,是要被加密或被解密的数据

Mode(模式): 为DES的工作方式,有两种:加密或解密。

DES加密过程

DES算法的流程图

IP置换(初始置换)

初始置换的原理其实很简单,根据一个初始置换表,对照表中的数值,将明文数据相应位置的数据移动到该数据所在的位置即可

现在假设我们按照以下顺序置换

先置换a,在原来1的位置,在置换b,在原来2的位置,以此类推,直到按照上表的顺序全部置换完毕

至此我们便得到了初始置换之后的数据Data=“5XPHzrjb7ZRJBtld91TLDvnf=3VNFxph4WOGyqia6YQI(i)Askc80SKCume+2UMEwog”

1
2
L0 = “5XPHzrjb7ZRJBtld91TLDvnf=3VNFxph”
R0 = “4WOGyqia6YQI(i)Askc80SKCume+2UMEwog”
函数f运算

我们上面说到的16轮完全相同的运算,指的是运算所使用的函数或者说算法是一样的,但是参数L、R以及K是不相同的,而这是什么相同的运算呢?看下图↓

函数f流程图

从上图我们可以知道,函数f主要对数据的右半部分R进行了操作。下面对这个运算进行一定解释说明

扩展置换E

扩展置换的作用对象是我们在初始置换后,将数据拆分为两部分(L,R)中的右半部分R。扩展置换表如下:

中间的4*8组是数据R(32位),左右两列黑色的是扩展时添加的数据。黑32是上一列最后一位蓝32的数据,黑4是上一列最后一位蓝4的数据,以此类推

我们得到上面的 R0=“4WOGyqia6YQI(i)Askc80SKCume+2UMEwog”

分组后扩展:

之后得到48位的R0 “g4WOGYGYqia6a6YQI(i)AI(i)Askc8c80SKCKCume+e+2UMEMEwog4”

子密钥K的生成

子秘钥K的生成过程中,又有两次置换,称为压缩置换1和压缩置换2

而循环左移的位数按照下表进行

S盒替换

在扩展置换E结束之后,进行K1与R0的异或运算后得到的48位数据压缩为32位数据,S盒一共有8个,每一个都是一个4行16列的数组

我们前面扩展置换后得到的R0是48位的数据,我们的S盒有8个,那么我们就需要将得到的R0平均分为8组,每组对应一个S盒。

每一组的数据长度为6位,假设第一组的二进制数据为:“100110”

那么,我们取第一位与最后一位,组成行数:“10”=2

取中间四位,组成列数:“0011”=3

那么,在对应的S1盒中,取2行3列的数据(第3行第4列):8

转换为2进制:“1000”

那么就将这个得到的4位二进制数据,代替原来第一组的6位数据,这样一来,等8个S盒全部代替完毕,我们就得到32位的数据。

P盒置换

S盒置换完成之后,要进行的就是P盒置换了,输入32位的数据,得到32位的输出,置换表如下:

至此我们便得到了f(R0,K1),只要再与L0进行异或运算,就得到了第一轮运算最终的R1,然后再将R0的值赋给L1,就完成了第一轮的运算,得到了L1,R1。

末置换

经过16次的运算,我们在函数f的最后,会得到L16、R16

然后将L16与R16合并,但是与之前的步骤中的合并不同,此次合并需要先交换二者的位置,也就是应该是R16L16

合并之后我们就得到了长度为64位的数据,在用这64位数据进行末置换,最终得到的数据就是加密后的数据。

传送门DES加解密

AES加密算法

高级加密标准(Advanced Encryption Standard ),采用的一种区块加密标准。这个标准用来替代原先的DES。

AES的加密过程是在一个4×4的字节矩阵上运作,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:

1、 字节替代(SubBytes)—透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。

2、行移位(ShiftRows)—将矩阵中的每个横列进行循环式移位。

3、列混淆(MixColumns)—为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

4、轮密钥加(AddRoundKey)—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。

AES的解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16字节的明文、密文和轮密钥都以一个4x4的矩阵表示。

下面从网上找了几张图来直观说明

字节代替

行移位

在AES中(区块大小128位),第一行维持不变,第二行里的每个字节都向左循环移动一格,第三行里的每个字节都向左循环移动二格,第四行里的每个字节都向左循环移动三格。经过行移位之后,矩阵中每一竖列,都是由输入矩阵中的每个不同列中的元素组成。

列混淆

轮密相加

密钥将会与原矩阵合并。在每次的加密循环中,都会由主密钥产生一把回合密钥

密钥扩展