分组密码

概述

明文消息,编码成二元数字序列后,划分为长度为m的一个个组块。

加密:每个长度为m的明文组块分别在密钥K的控制下变成一个个长度为n的密文组块

解密:每个长度为n的密文组块通过密钥K还原成一个个长度为m的明文组块

分组密码通常研究以下三种情况:

  1. 如果m>n 说明密文比明文短,存在数据压缩

  2. 如果m<n 说明密文比明文长,存在数据拓展

  3. 如果m=n 说明既没有数据压缩,也没有数据拓展

分组密码的常见设计方法

当今绝大多数的分组密码都是乘积密码。

所谓乘积密码,就是以某种方式连续执行两个或者多个密码。

常见的乘积密码都是迭代密码。

以下是两种用迭代法设计分组的常用方法

Feistel结构

DES采用此结构

上一轮的右半部分成为这一轮的左半部分。

上一轮的左半部分和一个复杂的值(右半部分和每一轮的密钥Ki进行运算)进行异或,异或后的结果成为这一轮的右半部分。

image-20231225163739451

SPN结构

AES采用此结构

这种结构分两层:
第一层:S层,也称为替换层,主要起到扰乱的作用。

第二层:P层,也称为置换层,主要起到扩散的作用。

image-20231225164159452

数据加密标准——DES

此加密方案由IBM公司提交,被美国国家标准局于1976年采纳。

算法描述

明文分组64位,有效密钥56位,输出密文64位,迭代16轮

算法流程

初始置换、16轮迭代、左右部分换位、初始逆置换

image-20231225194612910

轮函数

上一轮的右半部分作为这一轮的左半部分,上一轮的右半部分再与轮密钥k进行指定的运算得到一个结果,这个结果再与上一轮的左半部分异或,得到这一轮的右半部分。(看图更直接)

子密钥

DES每一轮都使用不同的、从初始密钥K导出的48位子密钥。密钥是一个64位的分组,但是其中8位是用于奇偶校验的,所以密钥有效位只有56位。

子密钥的生成过程如下:

首先:

给定一个64比特的密钥K,删掉8个校验比特并利用一个固定的置换PC-1置换剩下的56位。把这56位分成两部分:C、D 各28位。

然后进入如下循环:

  • 把上一轮生成的C和D两部分按照LS表中 每一轮对应的值 进行循环左移,得到本轮的C和D
  • 把这一轮的C和D,根据PC-2置换表,置换得到本轮的轮密钥Ki

image-20231225202241232

image-20231225202314634

f函数

不难看出,DES加密每一轮其实只对左半部分做了打乱的操作,而对右半部分,只是简单地放到了这一轮的左边

image-20231225203309753

f函数的过程如下:

image-20231225203629216

先把右半部分32位进行位拓展,拓展为48位

image-20231225204256037

再与轮密钥K进行异或运算。

运算结果分成8部分,每部分6比特。每部分进入到对应的S盒得到一个输出

假设6比特为:h1 h2 h3 h4 h5 h6

则(h1 h6)作为行号,(h2 h3 h4 h5)作为列号(转二进制)

image-20231225205108385

结果转换成二进制(6比特进,4比特出)

高级加密标准——AES

1997年提出,代替DES,比DES更安全

AES的数学基础

AES算法的总体描述

分为AES128、 AES192 、AES256

方便二进制运算的算法

加解密使用相同的密钥,但不同的算法

整体属于SP结构

AES的算法流程分析

感谢B站的这个视频,讲的很透彻,演示很生动

【【AES加密算法】| AES加密过程详解| 对称加密| Rijndael-128| 密码学| 信息安全】 https://www.bilibili.com/video/BV1i341187fK/?share_source=copy_web&vd_source=73f97624c2b3ff1eb41ea26fb86c72ee

以AES128为例(10轮)

AES加解密主要有以下操作:

  1. 输入明文
  2. 初始变换
  3. 9轮循环运算
    • 字节代换(SubBytes)
    • 行移位(ShiftRows)
    • 列混合(MixColumns)
    • 轮密钥加(AddRoundKey)
  4. 1轮最终轮
    • 字节代换(SubBytes)
    • 行移位(ShiftRows)
    • 轮密钥加(AddRoundKey)
  5. 输出密文
  • 轮密钥加
  • 字节代换
  • 行位移
  • 列混合

算法前九轮包含以上所有操作,最后一轮不进行列混合

初始变换

将明文生成的4*4矩阵(16字节)与密钥生成的4*4矩阵按字节进行异或操作

image-20231226105522075

9轮循环

字节代换

把输入的矩阵,按照代换表逐个替换,替换规则如图所示

image-20231226110106453

行移位

过程比较简单,第0行左移0位,第1行左移1位,第2行左移2位,第三行左移3位。

image-20231226110404849

列混合

将输入的矩阵左乘一个给定的矩阵

image-20231226110720821

按照给定的二进制乘法公式进行运算,其中的所有加法都是异或加法

轮密钥加(每轮的关键加密部分,只有这部分用到了轮密钥)

输入矩阵和轮密钥矩阵逐列进行异或运算

image-20231226111107682

1轮最终轮

操作和前9轮一样,但是不进行列混合

密钥拓展

先把初始密钥填入如下矩阵,并设定第0列为W0

image-20231226113246137

往后每一列的值按照如下公式运算

image-20231226113436321

如果i不是4的倍数,运算比较简单;如果i是4的倍数,则要进行一个T函数的运算。

密钥拓展的中的T函数

  • 字循环

    把传入的Wi列进行如下变换

    image-20231226114720008

  • 字节待换

    image-20231226114753472

  • 轮常量异或

    把上面的结果和本轮给定的轮常量Rcon[j](j表示轮数)进行异或

    image-20231226115141702

    image-20231226115158721

分组密码的工作模式

电子密码本模式 ECB

用相同的密钥对明文分组单独加密

一段明文 分成几个明文分组,每个分组使用同样的密钥进行加密

密文分组链接模式 CBC

将前一个密文块和当前明文块进行异或运算后再加密

image-20231226132152167

优点:每个分组加密依赖前一个密文块,具备数据完整性保护

缺点:但是一旦出错,后面所有的分组都会出错

密文反馈模式 CFB

将前一个密文块作为输入进行加密,生成一个密钥流,再与当前明文块进行异或运算得到密文块。

明文本身没有进入到加密算法当中,而是与加密算法的输出进行了异或

image-20231226132336746

优点:加密操作长度可变、可以部分解密数据

缺点:一步错,步步错、不适合并行处理,需要保证初始向量的唯一性和完整性

输出反馈模式 OFB

将前一个加密算法的输出进行加密,生成一个密钥流,再与当前明文块进行异或运算得到密文块

image-20231226132953382

优点:加密操作长度可变、对密文分组的错误不敏感

缺点:传输错误不可恢复、无法提供数据完整性保护、不支持并行加密

计数器模式 CTR

每一个明文分组都与一个经过加密的计数器进行异或。对后续每个分组,计数器+1

image-20231226133351029

优点:并行处理、随机访问、不受错误传播影响

缺点:计数器必须唯一、密钥流和明文相关性弱

其他分组密码

IDEA

RC6