密码学03-分组密码

分组密码

分组密码的基本概念

概述

分组密码是许多系统安全的一个重要组成部分。可用于构造

  • 伪随机数生成器
  • 流密码
  • 消息认证码(MAC)和杂凑函数
  • 消息认证技术、数据完整性机制、实体认证协议以及单钥数字签字体制的核心组成部分。

应用中对于分组码的要求

安全性

  • 运行速度
  • 存储量(程序的长度、数据分组长度、高速缓存大小)
  • 实现平台(硬、软件、芯片)
  • 运行模式

分组密码的组成

明文序列 x0,x1,x2,xn1, 分组长度为 n

加密函数 E:Vn×KVm

密文分组长度为 m

这种密码实质上是字长为 n 的数字序列的代换密码

![[分组密码概述.png]]

通常取 n=m

• 若 n<m ,则为有数据扩展的分组密码。

• 若 n>m ,则为有数据压缩的分组密码。

分组密码的设计原则

分组密码设计问题

分组密码的设计问题在于找到一种算法, 能在密钥控制下从一个足够大且足够好的置换子集中, 简单而迅速地选出一个置换, 用来对当前输入的明文的数字组进行加密变换。

安全性设计原则

  1. 混淆原则(Confusion)
    • 混淆原则就是将密文、 明文、 密钥三者之间的统计关系和代数关系变得尽可能复杂,使得敌手即使获得了密文和明文,也无法求出密钥的任何信息;即使获得了密文和明文的统计规律,也无法求出明文的新的信息。
    • 可进一步理解为:
      1. 明文不能由已知的明文,密文及少许密钥比特代数地或统计地表示出来。
      2. 密钥不能由已知的明文,密文及少许密钥比特代数地或统计地表示出来。
  2. 扩散原则(Diffusion)
    • 扩散原则就是应将明文的统计规律和结构规律散射到相当长的一段统计中去(Shannon的原话)。
    • 也就是说让明文中的每一位影响密文中的尽可能多的位,或者说让密文中的每一位都受到明文中的尽可能多位的影响。
    • 如果当明文变化一个比特时,密文有某些比特不可能发生变化,则这个明文就与那些密文无关,因而在攻击这个明文比比特时就可不利用那些密文比特.

算法要求

  • 分组长度 n 要足够大:
    防止明文穷举攻击法奏效。
  • 密钥量要足够大:
    尽可能消除弱密钥并使所有密钥同等地好, 以防止密钥穷举攻击奏效。
  • 由密钥确定置换的算法要足够复杂:
    充分实现明文与密钥的扩散和混淆, 没有简单的关系可循, 要能抗击各种已知的攻击。
  • 加密和解密运算简单:
    易于软件和硬件高速实现。
  • 数据扩展:
    一般无数据扩展, 在采用同态置换和随机化加密技术时可引入数据扩展。
  • 差错传播尽可能地小。
    一个密文分组的错误尽可能少的影响其他密文分

实现原则

  • 软件实现的原则:
    使用子块和简单的运算。 如将分组n化分为子段, 每段长为8、 16或32。在以软件实现时, 应选用简单的运算, 使作用于子段上的密码运算易于以标准处理器的基本运算, 如加、 乘、 移位等实现, 避免用以软件难于实现的逐比特置换。
  • 硬件实现的原则:
    加密解密可用同样的器件来实现。

SP网络

代换概述

  • 代换:如果明文和密文的分组长都为 n 比特,则明文的每一个分组都有2n个可能的取值。为使加密运算可逆(使解密运算可行),明文的每一个分组都应产生惟一的一个密文分组,这样的变换是可逆的,称明文分组到密文分组的可逆变换代换

不同可逆变换的个数有 2n!

代换结构

![[代换结构.png]]

代换表

明文 密文 明文 密文
0000 1101
0001 0101
0010 0001
0011 0110
0100 1001
0101 1111
0110 0010
0111 0011
1000 1010
1001 1000
1010 1011
1011 1110
1100 0111
1101 0100
1110 1100
1111 0000
正向代换
密文 明文 密文 明文
0000 1101
0001 0101
0010 0001
0011 0110
0100 1001
0101 1111
0110 0010
0111 0011
1000 1010
1001 1000
1010 1011
1011 1110
1100 0111
1101 0100
1110 1100
1111 0000
反向代换

代换的弱点

  • 如果分组长度太小,如n=4,系统则等价于古典的代换密码,容易通过对明文的统计分析而被攻破。这个弱点不是代换结构固有的,只是因为分组长度太小。如果分组长度n足够大,而且从明文到密文可有任意可逆的代换,那么明文的统计特性将被隐藏而使以上的攻击不能奏效。

  • 从实现的角度来看,分组长度很大的可逆代换结构是不实际的

    • 仍以4比特的代换表为例,该表定义了 n=4 时从明文到密文的一个可逆映射,其中第2列是每个明文分组对应的密文分组的值,可用来定义这个可逆映射。
    • 从本质上来说,第2列是从所有可能映射中决定某一特定映射的密钥
    • 密钥需要64比特
  • 一般地,对n比特的代换结构,密钥的大小是 n×2n 比特。如对64比特的分组,密钥大小应是 64×264=2701021 比特,因此难以处理。

SP网络

在Shannon 1949 的文章中,介绍了替代-置换网络的思想即SP网络。这种思想形成了现代密码的基础,SP网络是替代-置换乘积密码的现代形式

SP网络是基于下列两种最基本的密码运算:替代( Substitution )、置换( Permutation )

代换网络

代换是输入集 A 到输出 A上的双射变换(一一映射):

fk:AA

式中, k 是控制输入变量,在密码学中则为密钥

实现代换 fk 的网络称作代换网络
双射条件保证在给定 k 下可从密文惟一地恢复出原明文

代换 fk 的集合: S={fk|kK}

如果网络可以实现所有可能的 2n! 个代换, 则称其为全代换网络
全代换网络密钥个数必须满足条件:#{k}2n!

密码设计中需要先定义代换集 S, 而后还需定义解密变换集, 逆代换网络 S1, 它以密文 y 作为输入矢量, 其输出为恢复的明文矢量 x
要实现全代换网络并不容易。 因此实用中常常利用一些简单的基本代换, 通过组合实现较复杂的、 元素个数较多的代换集。
实用密码体制的集合S中的元素个数都远小于2n!

在密码设计中, 可选 n=rn0, 其中 rn0 都为正整数, 将设计 n 个变量的代换网络化为设计r个较小的子代换网络, 而每个子代换网络只有 n0 个输入变量。 称每个子代换网络为代换盒(Substitution Box)

![[DES的S盒.png]]

S盒的设计准则

迄今为止, 有关方面未曾完全公开有关DES的S盒的设计准则。

Branstead等曾披露过下述准则:

  • P1 S盒的输出都不是其输入的线性或仿射函数。
  • P2 改变S盒的一个输入比特, 其输出至少有两比特产生变化, 即近一半产生变化。
  • P3 当S盒的任一输入位保持不变, 其它5位输入变化时(共有 25 =32种情况),输出数字中的0和1的总数近于相等。

这三点使DES的S盒能够实现较好的混淆。

Feistel 密码结构

设计思想

Feistel 密码设计思想源自 乘积密码思想

乘积密码指顺序地执行两个或多个基本密码系统, 使得最后结果的密码强度高于每个基本密码系统产生的结果.

Feistel 还提出了实现代换和置换的方法。 其思想实际上是 Shannon 提出的利用乘积密码实现混淆扩散思想的具体应用

Feistel密码实现的参数

  1. 分组大小: 分组越大则安全性越高,但加密速度就越慢。
  2. 密钥大小:密钥越长则安全性越高,但加密速度就越慢。
  3. 轮数:单轮结构远不足以保证安全性,但多轮结构可提供足够的安全性。典型地,轮数取为16。
  4. 子密钥产生算法:该算法的复杂性越大,则密码分析的困难性就越大。
  5. 轮函数:轮函数的复杂性越大,密码分析的困难性也越大。

设计Feistel密码的两个要求

在设计 Feistel 网络时, 还有以下两个方面需要考虑:

  1. 快速的软件实现:在很多情况中, 算法是被镶嵌在应用程序中, 因而无法用硬件实现。 此时算法的执行速度是考虑的关键。
  2. 算法容易分析:如果算法能被无疑义地解释清楚, 就可容易地分析算法抵抗攻击的能力, 有助于设计高强度的算法。

加解密结构

  • 加密

输入是分组长为 2w 的明文和一个密钥 K。将每组明文分成左右两半 L0R0,在进行完 n 轮迭代后,左右两半再合并到一起以产生密文分组。第 i 轮迭代的输入为前一轮输出的函数:

(1)Li=Ri1(2)Ri=Li1F(Ri1,Ki)

其中 Ki 是第i轮用的子密钥,由加密密钥K得到。一般地,各轮子密钥彼此不同而且与K也不同。

  • 解密

Feistel 解密过程本质上和加密过程是一样的,算法使用密文作为输入

但使用子密钥Ki的次序与加密过程相反,即第1轮使用 Kn,第2轮使用 Kn1, ……,最后一轮使用 K1。这一特性保证了解密和加密可采用同一算法。

![[Feistel加解密过程.png]]

Feistel密码解密的正确性

在加密过程中:

(3)LE16=RE15(4)RE16=LE15(RE15,K16)

在解密过程中

(5)LD1=RD0=LE16=RE15(6)RD1=LD0F(RD0,K16)(7)=RE16F(RE15,K16)(8)=[LE15F(RE15,K16)]F(RE15,K16)(9)=LE15

以解密过程第1轮的输出为 LE15RE15,等于加密过程第16轮输入左右两半交换后的结果。

容易证明这种对应关系在16轮中每轮都成立。 一般地, 加密过程的第 i 轮有:

(10)LEi=REi1(11)REi=LEi1F(REi1,Ki)

因此:

(12)REi1=REi1(13)REi=LEi1F(REi1,Ki)=REiF(LEi,Ki)

DES(Data Encryption Standard) 算法简介

DES的框架和主要参数

分组长度为64 bits (8 bytes),密文分组长度也是64 bits。密钥长度为64 bits, 有8 bits奇偶校验, 有效密钥长度为56 bits。一种用56位密钥来加密64位数据的方法。

算法主要包括:初始置换IP、 16轮迭代的乘积变换、 逆初始置换 IP1 以及16个子密钥产生器。

![[DES算法框图.png]]

DES算法流程

运用 Feistel 密码结构

(14)Li=Ri1(15)Ri=Li1F(Ri1,Ki)

![[DES算法流程.png]]

初始置换IP与逆初始置换

初始置换是将64 bit明文的位置进行置换,得到一个乱序的64 bit明文组。

逆初始置换 IP1。 将16轮迭代后给出的64 bit组进行置换,得到输出的密文组。 输出为阵中元素按行读得的结果。

IPIP1在密码意义上作用不大, 它们的作用在于打乱原来输入 x 的ASCII码字划分的关系

详见ppt

DES的轮函数及密钥编排

轮函数

设输入为 (x,y)

则DES的轮函数输出为:

(y,xfk(y))

![[DES的轮函数的结构.png]]

它等价于两个对合变换的复合:

(16)(x,y)(xf(k,y),y)(y,xf(k,y))(17)(a,b)(b,a)

注意:无论f函数如何选取, DES的轮函数是一个对合变换。

(18)F(x,y)=(xf(k,y),y)(19)F(F(x,y))=F(xf(k,y))=((xf(k,y))f(k,y),y)=(x,y)

![[DES算法轮结构.png]]

函数f(R,K)的计算过程

![[函数f(R,K)的计算过程.png]]

选择压缩运算S

![[选择压缩运算S.png]]

P盒置换

将S-盒变换后的32比特数据再进行P盒置换,置换后得到的32比特即为 f 函数的输出。

基本特点:

  1. P盒的各输出块的4个比特都来自不同的输入块;
  2. P盒的各输入块的4个比特都分配到不同的输出块之中;
  3. P盒的第 t 输出块的4个比特都不来自第 t 输入块。

含义:P盒输出的第1个元是输入的第16个元。

密钥编排

![[DES密钥编排.png]]

DES中的子密钥的生成

![[DES中的子密钥的生成.png]]

DES的安全性

DES的弱密钥

互补性

  • DES算法具有下述性质: 若明文组 x 逐位取补,密钥 k 逐位取补,即 y=DESk(x), 则有 y=DESK(x)
  • 这种互补性会使DES在选择明文破译下所需的工作量减半。[[密码学01-基本概念#选择明文攻击]]

弱密钥和半弱密钥

  • 弱密钥: EK×EK=I , DES存在4个弱密钥
    • DESK(DESK(X))=x
  • 半弱密钥: EK1=EK2,至少有12个半弱密钥
    • y=Ek1(x)=Ek2(x)

DES算法在每次迭代时都有一个子密钥供加密用。 如果给定初始密钥 k, 各轮的子密钥都相同, 即有 k1=k2==k16, 就称给定密钥 k 为弱密钥(Weak key)。

原始密钥 置换选择1后的密钥
- CD
(0, 0) 01 01 01 01 01 01 01 01 (0, 0) 00 00 00 00 00 00 00
(0,15) 1F 1F 1F 1F 0E 0E 0E 0F (0,15) 00 00 00 0F FF FF FF
(0,15) E0 E0 E0 E0 F1 F1 F1F1 (0,15) FF FF FF F0 00 00 00
(0,15) FE FE FE FE FE FE FE FE (0,15) FF FF FF FF FF FF FF

3DES

多重DES

如果一个分组密码易受到穷举密钥搜索攻击,那么对同一消息加密多次就有可能增强安全性。多重加密类似于一个有着多个相同密码的级联,但各级密码无需独立,且每级密码既可以是一个分组密码加密函数,也可是相应的解密函数

双重DES算法

简单的对消息 xi 利用两个不同的密钥进行两次加密,目的是为了抵抗穷搜索攻击,期望密钥长度扩展为112比特

事实上并不能达到 2112 的安全性

![[双重DES.png]]

中间相遇攻击

1977年,由Diffie和Hellman最早提出中间相遇攻击,可以降低搜索量,基本想法如下。若有明文/密文对 (xi,yi) 满足

yi=Ek2[Ek1[xi]]

则可得: z=Ek1[xi]=Dk2[yi]

![[中间相遇攻击.png]]

中间相遇攻击的步骤

给定一已知明密文(x1,y1), 可按下述方法攻击。

  • 以密钥k1的所有256个可能的取值对此明文x1加密, 并将密文z存储在一个表中;
  • 从所有可能的 256 个密钥 k2 中依任意次序选出一个对给定的密文 y1 解密, 并将每次解密结果 z 在上述表中查找相匹配的值。 一旦找到, 则可确定出两个密钥k1k2
  • 以此对密钥 k1k2 对另一已知明文密文对 (x2,y2) 中的明文 x2 进行加密, 如果能得出相应的密文 y2 就可确定 k1k2 是所要找的密钥。
复杂度

对于给定明文 x, 以两重DES加密将有264个可能的密文。可能的密钥数为 2112 个, 所以, 在给定明文下, 将有 2112264=248 个密钥能产生给定的密文。

用另一对64比特明文/密文对进行检验, 就使虚报率降为 24864=216。这一攻击法所需的存储量为 256×8Byte, 最大试验的加密次数 2×256=257。这说明破译双重DES的难度为 257 量级。

三重DES算法

三重DES中三个密码组件既可以是一个加密函数, 也可以是一个解密函数。

k1=k3 时, 则称为双密钥三重DES

![[三重DES算法.png]]

加密:y=Ek1[Dk2[Ek1[x]]]

解密:x=Dk1[Ek2[Dk1[x]]]

称其为加密-解密-加密方案, 简记为EDE(encrypt-decrypt-encrypt)。

此方案已在ANSI X9.17和ISO 8732标准中采用, 并在保密增强邮件(PEM)系统中得到利用。

![[双密钥三重DES算法.png]]

安全性

破译它的穷举密钥搜索量为 21125×1035 量级,差分分析破译也要超过 1052 量级,此方案仍有足够的安全性。

分组密码的工作模式

为什么需要工作模式?

分组密码的工作模式是:根据不同的数据格式和安全性要求, 以一个具体的分组密码算法为基础构造一个分组密码系统的方法

  1. 分组密码的工作模式应当力求简单, 有效和易于实现
  2. 需要采用适当的工作模式来隐蔽明文的统计特性、数据的格式等
  3. 降低删除、重放、插入和伪造成功的机会

分组密码的主要工作模式

  1. 电码本(ECB)模式
  2. 密码分组链接(CBC)模式
  3. 密码反馈(CFB)模式
  4. 输出反馈(OFB)模式
  5. 计数器模式

电码本(ECB)模式

![[电码本ECB(Electronic Code Book)模式.png]]

电码本模式(Electronic Codebook Mode, ECB)是一种分组密码的工作模式。在ECB模式下,明文被分成固定大小的分组(通常是64位或128位),然后每个分组独立地通过相同的密钥加密,生成对应的密文分组。它是分组密码的最简单模式,但在安全性上存在一些缺陷。

  • 优点:

    1. 实现简单;
    2. 不同明文分组的加密可并行实施,尤其是硬件实现时速度很快
  • 缺点:

    1. 相同明文分组对应相同密文分组
    2. 不能隐蔽明文分组的统计规律和结构规律,不能抵抗替换攻击
  • 应用:

    1. 用于随机数的加密保护
    2. 用于单分组明文的加密

电码本模式缺陷的例子

例: 假设银行A和银行B之间的资金转帐系统所使用报文模式如下:

![[电码本模式缺陷的例子.png]]

敌手C通过截收从A到B的加密消息,只要将第5至第12分组替换为自己的姓名和帐号相对应的密文,即可将别人的存款存入自己的帐号。

密码分组链接(CBC)模式

密码分组链接模式(Cipher Block Chaining, CBC)是一种分组密码的工作模式,解决了ECB模式容易泄露相同明文分组映射为相同密文分组的问题。CBC通过引入前一个密文分组对当前分组进行混淆,使得相同的明文分组在不同的上下文中会生成不同的密文分组,因此提升了安全性。

这种模式先将明文分组与上一次的密文块进行按比特异或,然后再进行加密处理。 这种模式必须选择一个初始向量 c0=IV,用于加密第一块明文。

加密过程为: ci=Ek(mici1)

解密过程为: mi=Dk(ci)ci1

![[密码分组链接CBC模式.png]]

CBC模式的特点
  1. 明文块的统计特性得到了隐蔽
    • 由于在CBC模式中,各密文块不仅与当前明文块有关,而且还与以前的明文块及初始化向量有关,从而使明文的统计规律在密文中得到了较好的隐藏
  2. 具有有限的(两步)错误传播特性
    • 一个密文块的错误将导致两个密文块不能正确解密
  3. 具有自同步功能
    • 密文出现丢块和错块不影响后续密文块的解密.若从第 t 块起密文块正确,则第t+1 个明文块就能正确求出

用CBC模式实现报文的完整性认证

目的:检查文件在(直接或加密)传输和存储中是否遭到有意或无意的篡改.

  • 关键技术:
    1. 文件的制造者和检验者共享一个密钥
    2. 文件的明文必须具有检验者预先知道的冗余度(例如哈希值)
    3. 文件的制造者用共享密钥对具有约定冗余度的明文用CBC模式加密
    4. 文件的检验者用共享密钥对密文解密,并检验约定冗余度是否正确
  • 报文完整性认证的具体实现技术
    1. 文件的制造者和检验者共享一个密钥;
    2. 利用文件的明文m产生一个奇偶校验码r的分组;
    3. 采用分组密码的CBC模式,对附带校验码的已扩充的明文(m, r)进行加密,得到的最后一个密文分组就是认证码
认证码生成

n 个分组明文 m=(m1,mn),

校验码为r=mn+1=m1mn

Cn+1为认证码。

![[认证码生成.png]]

  1. 仅需对明文认证,而不需加密时,传送明文 m 和认证码 Cn+1, 此时也可仅保留 Cn+1t 个比特作为认证码;
  2. 既需对明文认证,又需要加密时,传送密文 C 和认证码 Cn+1
认证码检验
  • 仅需对明文认证而不需加密时,此时验证者仅收到明文m和认证码Cn+1,需要:
    1. 产生明文 m 的校验码 r=mn+1=m1mn
    2. 利用共享密钥使用CBC模式对 (m,r) 加密,将得到的最后一个密文分组与接收到的认证码 Cn+1 比较,二者一致时判定接收的明文无错;二者不一致时判定明文出错。

密码反馈(CFB)模式

密码反馈 CFB 密码反馈模式(CFB,Cipher Feedback Block)是一种分组密码工作模式,用于对数据进行加解密。该模式在CFB模式中,前一个密文分组会被送回到密码算法的输入端,然后与明文数据进行异或运算,从而得到新的密文分组。这个过程会不断重复,直到处理完所有明文数据。

若待加密消息需按字符、字节或比特处理时,采用CFB模式,并称待加密消息按 r 比特处理的CFB模式为 r 比特CFB模式。

  • 适用范围: 适用于每次处理 r 比特明文块的特定需求的加密情形,能灵活适应数据各格式的需要。
    • 例如,数据库加密要求加密时不能改变明文的字节长度,这时就要以明文字节为单位进行加密。

若记 IV=cl+1c1c0,|ci|=r ,则加密过程可表示为: ci=xileftr(Ek(ci1ci2ci1))

![[CFB的加密解密.png]]

CFB模式的特点

  • 相同明文:和按CBC模式加密一样, 改变 IV 同样会导致相同的明文输入得到不同的加密输出。 IV 无需保密(虽在某些应用中 IV 须是不可预测的)
  • 链接依赖性:类似CBC加密, 链接机制致使密文组依赖于当前明文组和其前面的明文组;因此, 重排密文组会影响解密。
  • 错误的传播:一个或多个比特错误出现在任一个 r 比特的密文组中会影响这个组和后继 nr 个密文组的解密。
  • 错误恢复: CFB和CBC相似, 也是自同步的, 但它需有 nr 个密文组才能还原

输出反馈(OFB)模式

输出反馈模式(OFB,Output Feedback)是分组密码学中的一种模式,在OFB模式中,密码算法的输出并不直接与明文数据结合,而是通过与明文数据进行异或运算生成密文。具体来说,OFB模式将明文分组与密码算法的输出分组进行逐次异或,从而得到密文分组。

OFB模式在结构上类似于CFB模式,但反馈的内容是DES的输出而不是密文

![[输出反馈OFB(Output Feedback)模式.png]]

OFB工作模式的特点

  • 相同明文:和CBC及CFB一样, 改变 IV 同样会导致相同的明文输入得到不同的加密输出。
  • 链接依赖性:密钥流是独立于明文的。
  • 错误传播:有一个或多个比特错误的任一密文字符仅会影响该字符的解密, 密文字符的某比特位置出错将致使还原明文的相应位置也出错。
  • 错误恢复: OFB模式能从密文比特错误中得以恢复, 但在丢失密文比特后就无法实现自同步了, 这是因为丢失密文比特会破坏密钥流的编排。

四类工作模式比较和选用

  1. ECB模式简单、高速,但最弱,易受重放和替换攻击,一般用于加密长度小于等于分组长度的消息。
  2. CBC, CFB, OFB模式的选用取决于实际的特殊需求。
    • 明文不易丢信号,对明文的格式没有特殊要求的环境可选用CBC模式。需要完整性认证功能时也可选用该模式。
    • 容易丢信号的环境,或对明文格式有特殊要求的环境,可选用CFB模式。
    • 不易丢信号,但信号特别容易错,且明文冗余特别多,可选用OFB模式。

计数器模式

计数器模式(也称为Counter Mode Reset,CTR)是一种DES加密算法的工作模式。在这种模式下,计数器从某个初始值开始,按某种算法递增,并将计数器值经过加密算法得到的结果再与明文进行异或,从而得到当前明文组的密文。

  • 利用固定密钥 k 对自然数序列 1,2,3,,n,... 加密, 将得到的密文分组序列看作密钥流序列, 按加法密码的方式与明文分组逐位异或的一种方式
  • 利用这种方式可以产生伪随机数序列,其伪随机特性远比计算机产生的随机数的性质好

计数器模式的结构

![[计数器模式的结构.png|600]]

CTR的优点

  • 效率
    • 可并行加密
    • 预处理
    • 吞吐量仅受可使用并行数量的限制
  • 加密数据块的随机访问
  • 可证明安全
  • 简单性(只要求实现加密算法)

有限域基础

有限域的基本概念

  • F 是一个非空集合,定义了加法、乘法两个二元运算,对这两个运算封闭
    • 加法满足:对于任意a,b,cF
    • a+b=b+a;交换律
    • (a+b)+c=a+(b+c);结合律
    • 存在 0F,使得 a+0=a;有零元
    • 存在 aF,使得 a+(a)=0;有负元
  • 乘法满足:对于任意a,b,c∈ F
    • a·b=b·a;交换律
    • (a·b)·c=a·(b·c);结合律
    • 存在 eF,使得 a·e=a;有单位元
    • 存在 a1F,使得 a·a1=e;有逆元
  • 乘法对加法满足分配率
    • a·(b+c)=a·b+a·c

此时,我们称 F 为域

有限域的定义及性质

一个有限域 F 是指只含有限个元素的域, F 的阶是指 F 中元素的个数。有限域又称为Galois域。若域 F 的阶为 n,则可将 F 记为 FnGF(n)

  • 性质
    • 定理1 设 F 是一个特征为素数 p 的有限域,则 F 中的元素个数为 pnn 是一个正整数。
    • 定理2 (存在性)对于任何素数 p 和任意正整数 n,总存在一个有限域恰好含有 pn 个元素。
    • 定理3 (唯一性)任意两个q=pn元域都同构,即 pn 元域在同构意义下是惟一的。
    • 定理 4 设 Fqq 元域,则其乘法群 Fq 是一个循环群

Fq指的是 中所有非零元构成的集合。

域的例子

  1. Zn={0,1,2,,n1}modn,加法和乘法都是 模 n 的运算,运算封闭
    • 加法满足结合律和交换律,有零元0,有负元
    • 乘法满足结合律和交换律,有单位元1,不一定有逆元
      Zn 中的数什么时候才有乘法逆元呢?
    • [“] 引理:整数 a 在模 n 乘法下有逆元,当且仅当 an 互素
    • 所有与n互素的元素在模n乘法下构成乘法交换群
    • 1n1都与 n 互素,则 n 为素,对于任一素数 pZp为域,其元素个数为 p
  2. F[X]f(x)={r(x)=rn1xn1+rn2xn2++r1x+r0|riF,nin1},加法和乘法都是模 f(x) 的运算,运算封闭
    • 加法满足结合律和交换律,有零元0,有负元
    • 乘法满足结合律和交换律,有单位元1,不一定有逆元
      F[x]f(x)中的多项式什么时候才有乘法逆元呢?
    • ["] 引理: r(x) 在模 f(x) 乘法下有逆元, 当且仅当 r(x)f(x) 互素。
    • 所有与 f(x) 互素的元素在模 f(x) 乘法下构成乘法交换群
    • 次数比 f(x) 的次数低的多项式都与 f(x) 互素, 则 f(x) 为不可约多项式
    • 对于任一首项系数为1的不可约多项式, F[x]f(x)为域
    • F=Zp,则F[x]f(x)中元素个数为 pn
    • pn 域的构造方法是首先选取Zp中的一个 n 次不可约多项式,然后构造集合 F[X]f(x)={r(x)=rn1xn1+rn2xn2++r1x+r0|riF,nin1} 集合中的加法和乘法运算为模多项式f(x)的运算

GF(28)域

AES中的处理单元

AES (Advanced Encryption Standard,高级加密标准) 是美国国家标准与技术研究院(NIST)在2001年发布的一种对称加密算法。它旨在取代早期的数据加密标准(DES),提供更高的安全性。AES算法广泛应用于保护电子数据的机密性,并且由于其对称性,加密和解密使用相同的密钥。 ^513ff1

AES加密标准算法中是以字节为处理单元,可以将每一字节看作是有限域GF(28)上的一个元素,分别对应于一个次数不超过7的多项式。如 b7b6b5b4b3b2b1b0 可表示为多项式:

b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x1+b0

还可以将每个字节表示为一个十六进制数,即每4比特表示为一个十六进制数,代表较高位的4比特的符号仍在左边。例如, 01101011可表示为6B。它们之间的运算为GF(28) 中的运算

GF(28)中的运算

  • 定义: 在 GF(28) 上的加法定义为二进制多项式的加法,且其系数模2。例如:0x57+0x83=0xD4, 用多项式表示为:

(x6+x4+x2+x+1)+(x7+x+1)=x7+x6+x4+x2modm(x)

用二进制表示为:

01010111+10000011=11010100

  • 定义: 在 GF(28) 上的乘法(用符号 表示)定义为二进制多项式的乘积模一个次数为8的不可约二进制多项式:

m(x)=x8+x4+x3+x+1

它的十六进制表示为 0x11B

例如:0x570x83=0xC1 可表示为以下的多项式乘法:

(x6+x4+x2+x+1)·(x7+x+1)=x7+x6+1modm(x)

  • 定义: 对任何次数小于8的多项式b(x), 可用推广的欧几里得算法

b(x)a(x)+m(x)c(x)=1

a(x)b(x)=1modm(x)。因此 a(x)b(x) 的乘法逆元。

  • 定义: 函数 xtime(x) 定义为 GF(2) 上的 x·b(x)。其运算如下:若 b7=0,则x·b(x) 的结果就是把字节b左移一位,且在最右边补上上0;若b7=1,则先对 b(x) 在字节内左移一位(最后一位补0),则再与 0x1B(00011011)做逐比特异或。

xtime(x)的例子

例如,0x57·0x13 可按如下方式实现:

(20)0x570x02=xtimes(57)=0xAE(21)0x570x04=xtimes(AE)=0x47(22)0x570x08=xtimes(47)=0x8E(23)0x570x10=xtimes(8E)=0x07(24)0x570x13=0x57(0x010x020x10)(25)=0x570xAE0x07(26)=0xFE

GF(28) 上的模多项式运算

4个字节构成的向量可以表示为系数在GF(28)上的次数小于4的多项式,多项式的加法就是对应系数相加;换句话说,多项式的加法就是4字节向量的逐比特异或。

规定多项式的乘法运算必须要取模M(x)=x4+1, 这样使得次数小于4的多项式的乘积仍然是一个次数小于4的多项式,将多项式的模乘运算记为 ,设

(27)a(x)=a3x3+a2x2+a1x+a0(28)b(x)=b3x3+b2x2+b1x+b0(29)c(x)=a(x)b(x)=c3x3+c2x2c1x+c0

由于 xjmodx4+1=xjmod4, 所以

(30)c0=a0b0a3b1a2b2a1b3;(31)c1=a1b0a0b1a3b2a2b3;(32)c2=a2b0a1b1a0b2a3b3;(33)c3=a3b0a2b1a1b2a0b3

多项式乘法的矩阵表示:

(c0c1c2c3)(a0a3a2a1a1a0a3a2a2a1a0a3a3a2a1a0)(b0b1b2b3)

其中元素的加法和乘法为 GF(28) 域上的运算

x4+1 逆元

定理: 系数在 GF(28) 上的多项式 a3x3+a2x2+a1x+a0 是模 x4+1 可逆的,当且仅当矩阵

(a0a3a2a1a1a0a3a2a2a1a0a3a3a2a1a0)

GF(28)上可逆。

证明见PPT[[现代密码学:第26讲 有限域基础.pdf]]

x4+1 逆元在多项式环(如有限域)中的计算和应用中起到了关键作用,尤其是在误差校正码数字信号处理快速傅里叶变换 (FFT) 等领域。

  1. 多项式 x4+1 的因式分解具有特殊的对称结构,可以分解为两个二次因式(在某些有限域中成立),即 x4+1=(x2+x+1)(x2x+1)
  2. 这种结构使得模 x4+1下的逆元求解比一般的多项式更加高效,便于快速实现应用中的各种运算。
  3. 快速傅里叶变换 (FFT) 的实现在快速傅里叶变换中,计算复数乘法的代价较高。而通过定义模 x4+1 的有限域,可以将复数乘法映射到多项式乘法,将原本的复数运算转化为具有更高效结构的有限域中的运算,简化计算、提高效率。
  4. 在编码理论中,比如循环码BCH码中,模多项式的运算常用于生成和检测校验位,用以检测和纠正传输中的错误。在这种情况下,逆元的求解有助于在编码和解码过程中解决线性方程,恢复被干扰或篡改的信息。
  5. 在数字信号处理(DSP)应用中,模多项式的运算常用于滤波器的设计或系统建模。逆元的求解能简化滤波器的实现过程,使设计更加灵活且效率更高。

AES算法简介

DES算法由于其密钥较短, 难以抵抗现有的攻击, 因此不再作为加密标准。

AES概述

  • AES算法征集的要求

    1. AES是公开的;
    2. AES为对称密钥分组密码体制;
    3. AES的密钥长度可变, 可按需要增大;
    4. AES适于用软件和硬件实现;
    5. AES可以自由地使用, 或按符合美国国家标准( ANST) 策略的条件使用。
  • 算法衡量条件

  • 满足以上要求的AES算法,需按下述条件判断优劣

    • 安全性
    • 计算效率
    • 内存要求
    • 使用简便性
    • 灵活性
  • AES的评审

  • 1998年4月15日全面征集AES算法的工作结束。 1998年8月20日举行了首届AES讨论会, 对涉及14个国家的密码学家所提出的候选AES算法进行了评估和测试, 初选并公布了15个被选方案, 供大家公开讨论。

    • CAST-256, RC-6, CRYPTON-128, DEAL-128,
    • FROG, DFC, LOKI-97, MAGENTA,
    • MARS, HPC, RIJNDAEL, SAFER+,
    • SERPENT, E-2, TWOFISH。
  • 这些算法设计思想新颖, 技术水平先进, 算法的强度都超过3-DES, 实现速度快于3-DES。

  • 1999年8月9日NIST宣布第二轮筛选出的5个候选算法为:

    • MARS(C.Burwick等,IBM) , RC6TM(R. Rivest等,RSA Lab.), RIJNDEAL(J. Daemen,比利时),
    • SERPENT(R. Anderson等, 英国、以利时、挪威), TWOFISH(B. Schneier,美国)。
  • 2000年10月2日, NIST宣布 Rijndael 作为新的AES

AES算法框架和参数说明

  • 设计简单

    1. 在多个平台上速度快,编码紧凑
    2. 抵抗所有已知的攻击
    3. Rijndael没有采用 Feistel 结构,轮函数由3个不同的可逆均匀变换构成的,称为3个层
      • ["] 均匀变换是指状态的每个bit都用类似的方法处理
  • 轮函数的3层

    1. 线性混合层
      • 确保多轮之上的高度扩散;
    2. 非线性层
      • 将具有最优的“最坏情况非线性特性” 的S盒并行使用;确保混淆特性
    3. 密钥加层
      • 单轮子密钥简单的异或到中间状态上,实现一次性掩盖。

算法说明

  • 明文分组可变
    • 128、 192、 256比特,密钥长度可变,各自可独立指定为128、 192、 256比特。
  • 状态
    • 算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵阵列表示,该阵列有4行,列数 Nb32
  • 种子密钥
    • 以字节为元素的矩阵阵列描述,阵列为4行,列数 Nk32
  • 算法的输入、输出和种子密钥可看成字节组成的一维数组。
  • 下标范围
    • 输入输出: 04Nb1
    • 种子密钥:04Nk1

Nb=6Nk=4 的状态密钥阵列

![[N_b=6和N_k=4的状态密钥阵列.png]]

分组和阵列中元素对应关系

分组长度的不同其对应的轮函数迭代的轮数也不同

  • 分组下标 n
  • 阵列位置 (i,j)
  • i=nmod4,j=[n4];n=i+4j
  • 轮数 NrNbNk 对应关系
Nb=4 Nb=6 Nb=8
Nk=4 10 12 14
Nk=6 12 12 14
Nk=8 14 14 14

![[AES加解密流程.png]]

注:第10轮不进行列混合,这样是为了保证解密流程相同。

AES的轮函数

字节代换

  • 字节代换为非线性代换,独立地对状态的每个字节进行,并且代换表(S盒)可逆,记为 ByteSub(State),分两步:
    1. 将字节作为 GF(28) 上的元素映射到自己的逆元
    2. 将字节做 GF(2) 上的仿射变换

y=Ax1+B

其中 A 是一个 GF(2)8☓8 的可逆矩阵BGF(2) 上一个8位列向量

[y0y1y2y3y4y5y6y7]=[1000111111000111111000111111000111111000011111000011111000011111][x0x1x2x3x4x5x6x7]+[11000110]

AES的S盒及其替换见PPT[[现代密码学:第28讲 AES的轮函数.pdf]]

逆字节代换InvSubBytes()

逆字节替代变换是字节替代变换的逆变换,在状态的每个字节上应用逆S盒。

这是通过应用字节替代变换中的仿射变换的逆变换,再对所得结果应用有限域的乘法逆运算得到的

y=A1(xB)

AES的S盒及其逆替换见PPT[[现代密码学:第28讲 AES的轮函数.pdf]]

字节代换示意图

![[字节代换示意图.png]]

行移位

将状态阵列的各行进行循环移位,不同行的移位量不同

  • 0行:不动
  • 1行:循环左移C1字节
  • 2行:循环左移C2字节
  • 3行:循环左移C3字节
  • 记为: ShiftRow(State)
Nb C1 C2 C3
4 1 2 3
6 1 2 3
8 1 3 4
  • 行移位示意图

![[行移位示意图.png]]

  • 逆行移位InvShiftRows()

逆行移位变换是行移位变换的逆变换

  • 它对状态的每一行进行循环右移,
    • 第0行保持不变
    • 第1行循环右移C1个字节
    • 第2行循环右移C2个字节
    • 第3行循环右移C3个字节

列混淆

将每列视为 GF(28) 上多项式,与固定的多项式 c(x) 进行

x4+1 乘法,记为 ,要求 c(x)x4+1 可逆。

表示为 MixColumn(State)

c(x)=03x3+01x2+01x+02

'xx'表示16进制数

列混淆运算也可写为矩阵乘法。设 b(x)=c(x)a(x),则

[b0b1b2b3]=[02030101010203010101020303010102][a0a1a2a3]

  • 列混淆运算示意图

![[列混淆运算示意图.png]]

  • 逆列混淆 InvMixColumns()

逆列混淆变换是列混淆变换的逆

它将状态矩阵中的每一列视为系数在 GF(28) 上的次数小于4的多项式与同一个固定的多项式 d(x) 相乘。d(x) 满足

(03x3+01x2+01x+02)d(x)=01

由此可得

d(x)=0Bx3+0Dx2+09x+0E

  • 逆列混淆的矩阵形式

同样,逆列混淆可以写成矩阵乘法形式

[b0b1b2b3]=[0e0b0d09090e0b0d0d090e0b0b0d090e][a0a1a2a3]

轮密钥加

  • 轮密钥与状态进行逐比特异或。
  • 轮密钥由种子密钥通过密钥编排算法得到
  • 轮密钥长度与分组长度相同
  • 表示为 AddRoundKey(State,RoundKey)

AES的密钥编排及伪代码

AES的密钥编排

  • 密钥编排指从种子密钥得到轮密钥的过程,它由密钥扩展轮密钥选取两部分组成。其基本原则如下:
    1. 轮密钥的比特数等于分组长度乘以轮数加1; 例如要将128比特的明文经过10轮的加密,则总共需要 (10+1)128=1408 比特的密钥。
    2. 种子密钥被扩展成为扩展密钥;
    3. 轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前 Nb 个字,第2轮轮密钥取接下来的 Nb 个字,如此下去。
    4. 扩展密钥是以4字节字为元素的一维阵列,表示为 W[Nb(Nr+1)],其中前Nk个字取为种子密钥,以后每个字按递归方式定义。扩展算法根据 Nk6Nk>6 有所不同。

扩展算法(Nk6

KeyExpansion (byteKey[4*Nk] , W[Nb*(Nr+1)]) {

for (i =0; i < Nk; i ++)

W[i]=(Key[4* i],Key[4* i +1],Key[4* i +2],Key[4* i +3] ); for (i =Nk; i <Nb*(Nr+1); i ++)

{

temp=W[i-1]; if (i % Nk= =0)

temp=SubByte (RotByte (temp))^Rcon[i /Nk];

W[i]=W[i-Nk]^ temp; }

}

![[AES扩展算法(Nk≤6).png|]]

  • [i] Rcon(Round Constant,轮常量)是AES密钥扩展过程中用于生成子密钥的一个常数数组。它在每一轮的密钥生成中都会被用到,并起到了增加密钥多样性和增强加密安全性的作用。每轮的Rcon值通过特定的算法递增,确保密钥扩展的每个部分都不同。
  • [i] Rcon数组(以AES-128为例)对于AES-128(即密钥长度为128位,Nk=4)来说,Rcon的值如下:Rcon=[0x01000000,0x02000000,0x04000000,0x08000000,0x10000000,0x20000000,0x40000000,0x80000000,0x1B000000,0x36000000]

扩展算法(Nk>6

KeyExpansion (byte Key[4*Nk] , W[Nb*(Nr+1)]) {

	for (i=0; i < Nk; i ++)
	    W[i]=(Key[4* i], Key[4* i +1], Key[4* i +2], Key[4* i +3] ); 
    for (i =Nk; i <Nb*(Nr+1); i ++)
	{
		temp=W[i -1]; 
		if (i % Nk= =0)
			temp=SubByte (RotByte (temp))^Rcon[i /Nk];
		else if (i % Nk==4) temp=SubByte (temp);
	W[i]=W[i - Nk]^ temp; }
}
  • [!] Nk>6Nk6的密钥扩展算法的区别在于:当i-4为Nk的整数倍时,须 先将前一个字 W[i1] 经 过SubByte变换

轮常数

  • 以上两个算法中,Rcon[i/Nk] 为轮常数,其值与 Nk 无关,定义为(字节用十六进制表示,同时理解为 GF(28) 上的元素):
    • Rcon[i]=(RC[i],00,00,00)
    • 其中 RC[i]GF(28) 中值为 xi1 的元素,因此
      • RC[1]=1(即‘01’)
      • RC[i]=x (即‘02’)RC[i1]=x

轮密钥选取

轮密钥 i(即第 i 个轮密钥)由轮密钥缓冲字W[Nbi]W[Nb(i+1)]给出,如图所示。

![[轮密钥选取.png]]

AES的伪代码

AES加密过程的伪代码

Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*Nr+1]) 
begin
	byte state[4,Nb] 
	state = in
	AddRoundKey(state, w[0, Nb-1])
	for round = 1 step 1 to Nr-1 
		SubBytes(state) 
		ShiftRows(state) 
		MixColumns(state)
		AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
	end for 
	SubBytes(state) 
	ShiftRows(state)
	AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) Out = state
end

AES解密过程的伪代码

InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*Nr+1]) begin
	byte state[4,Nb] 
	state = in
	AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])
	for round = Nr-1 step -1 downto 1
		InvShiftRows(state) InvSubBytes(state)
		AddRoundKey(state, w[round*Nb, (round+1)*Nb-1]) 
		InvMixColumns(state)
	end for 
	SubBytes(state)
	ShiftRows(state) AddRoundKey(state, w[0, Nb-1])
	Out = state 
end
KeyExpansion (byte key[4*Nk] , word w[Nb*(Nr+1)], Nk) 
begin
	word temp 
	i=0
	while (i<Nk)
	w[i]=word(Key[4* i], Key[4* i +1], Key[4* i +2], Key[4* i +3] )
	i=i+1 
	end while 
	i=Nk
	while(i<Nb*(Nr+1)) 
		temp=W[i-1] 
		if (I mod Nk= =0)
			temp=SubByte (RotByte (temp)) xor Rcon[i /Nk] 
		else if (Nk>6 and i mod Nk = 4)
			temp=SubWord(temp) 
		end if
		w[i]=w[i-Nk ] xor temp
	end while 
end

SM4 算法

SM4概况

  • SM4分组密码算法是国家密码管理局于2006年1月6日公布的无线局域网产使用的密码算法,是国内官方公布的第一个商用密码算法。
  • SM4是一个分组密码算法,分组长度和密钥长度均为128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构。
  • 它的解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序

SM4算法的术语说明

  • Z2e 表示e-比特的向量集Z28 中的元素称为字节Z232 中的元素称为
  • S盒是一个固定的8比特输入 8比特输出的置换,记为 Sbox().
  • SM4中的采用了两个基本运算: , 32比特异或;i , 32比特循环左移 i 位。
  • SM4算法的加密密钥长度为128比特,表示为,

MK=(MK0,MK1,M2,MK3)

  • [i] 其中 MKii=0,1,2,3

  • 轮密钥为 rk0,rk1,,rk31rki。轮密钥由加密密钥通过密钥扩展算法生成。

  • FK=(FK0,FK1,,FK3) 为系统参数

  • CK=(CK0,CK1,,CK31) 为固定参数,用于密钥扩展算法。

SM4轮函数

![[SM4加密算法整体结构.png]]

设输入为 (Xi,Xi+1,Xi+2,Xi+3(Z232)4,轮密钥为 rkiZ232 ,则轮函数为:

(34)Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)i=0,1,,31(35)=XiT(Xi+1Xi+2Xi+3rki)

其中 T:Z232Z232 称为合成置换,是一个由非线性变换和一个线性变换复合而成的可逆变换,即

T(.)=L(τ(.))

![[合成置换结构图.png]]

  • [i] 函数 τ 是4个 GF(28) 上的 S 盒变换,L为4个移位函数

S盒见PPT[[现代密码学:第30讲 SM4算法.pdf]]

SM4的S盒说明

  • 非线性变换τ 中所使用的S盒是一个具有很好密码学特性的、由8比特输入产生8比特输出的置换
  • 在设计原理上, SMS4比AES的S盒设计多了一个仿射变换

y=A(Ax+B)1+B

SMS4有很高的灵活性,所采用的S盒可以灵活地被替换,以应对突发性的安全威胁。算法的32轮迭代采用串行处理,这与AES中每轮使用代换和混淆并行地处理整个分组有很大不同。

SM4的加密算法和解密算法

设明文输入为 (X0,X1,X2,X3)(Z232)4,密文为 (Y0,Y1,Y2,Y3)(Z232)4 ,轮密钥为 rkiZ232 加密变换为:

(36)Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)i=0,1,,31(37)=XiT(Xi+1Xi+2Xi+3rki)(38)(Y0,Y1,Y2,Y3)=(X35,X34,X33,XX32)

  • SM4算法的解密变换和加密变换结构相同,不同的仅是轮密钥的使用顺序。
    • 加密时轮密钥的使用顺序为 (rk0,rk1,,rk31)
    • 解密时轮密钥的使用顺序为 (rk31,rk30,,rk0)

SM4解密的合理性

(39)Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)(40)=XiT(Xi+1Xi+2Xi+3rki),i=0,1,,31(41)(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)(42)X35=X31T(X34X33X32rk31)

(43)Y4=F(Y0,Y1,Y2,Y3,rk31)(44)=Y0T(Y1Y2Y3rk31)(45)=X35T(X34X33X32rk31)(46)=X31T(X34X33X32rk31)(47)=X31

SM4密钥扩展

  • 设加密密钥 MK=(MK0,MK1,MK2,MK3) ,其中 MKi 为字
  • 轮密钥为 (rk0,rk1,,rk31)

轮密钥的生成方法具体为:

(48)(K0,K1,K2,K3)=(MK0FK0,MK1FK1,MK2FK2,MK3FK3)

![[SM4的密钥扩展算法1.png]]

(49)rki=Ki+4=KiT(Ki+1Ki+2Ki+3CKi)

![[SM4的密钥扩展算法2.png]]


  1. 对合变换:对合变换(Involution)是指一种特殊的数学变换,其特征是变换应用两次后能够返回到初始状态。也就是说,如果一个变换 f 满足以下条件:f(f(x))=x ,对于所有 x 都成立,那么这个变换 f 就被称为对合变换。 ↩︎

posted @   seveN1foR  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示