分享

UC头条:AES密码的基本介绍

 jank_wj1969 2020-06-26

因为刚开始接触到密码学,可能对AES的认识还不够深刻,在这里详细的把知识点罗列出来,希望对你们有所帮助。里面要是有什么错误请指出,一起进步gogogo。

AES的产生

1997年一直使用的DES密码被穷举法破译,1999年“DES破译者”仅仅使用22小时15分钟就找到其密钥,这意味着DES已经不足以保证敏感数据的安全,我们需要密钥长度更长,设计更精良的算法来替代DES.。1997年美国NIST发起征集AES候选算法的通知,从此AES走上了历史的舞台。

AES的特点

分组密码,明文和密文的长度128bit,密钥长度可变(128bit,192bit,256bit等,现采用128bit)

面向二进制的密码算法,能够加解密任何形式的计算机数据

不是对合运算,加解密使用不同的算法,巧妙的是其结构相似,可以即保证其安全性又可方便操作。

综合运用多种密码技术,置换,代替,代数

整体结构:SP结构(S为非线性部件,是安全性的最重要部分), 基本轮函数迭代,迭代轮数可变(≥10)

AES的数学基础

有限域GF(2^8)

AES中许多运算是按字节定义的,一个字节为8位,有些是按字定义的,一个字为4个字节即32bit(这里要牢记,在以前接触的单片机,C之类的一个字等于2个字节,注意区分)。将一个字节看成有限域GF(2^8)中的一个元素或者可以理解为一个字节全体256种元素取值构成有限域。这样子一个4字节的字就可以看成系数在有限域中且次数小于4的多项式

GF(2^8)中的元素有多种表示:

点击加载图片

GF(2^8)的特征是2,即1+1=0

GF(2^8)的全体元素构成加法交换群,线性空间

GF(2^8)的非零元素构成乘法循环群 255个元素

有一个生成元,其他元素均表示成生成元的幂次

基本运算

加法,表示成多项式的形式,然后进行相加,这里要注意两个多项式的公共次幂消失(1+1=0),单独存在的部分写下来

乘法,首先确定8次不可约多项式,AES的8次不可约多项式确定为m(t),两个多项式进行乘积,乘积结果对m(t)进行取余运算即为最终结果

乘法运算单位元 ,字节01,多项式1

X乘运算

直接多项式与x相乘,最高位可能变成x^8

因此分两种情况,一种是a7=0,这样子最高位为x^7,

当a7≠0时候,用所得结果减去m(t),即为我们所求

AES的字表示与运算

数据处理的单位是字与字节

一个字=4字节=32比特

一个字可表示为系数取自GF(2^8)上次数低于4次的多项式

字相加:两个多项式系数按位模2加

字乘法:设A and c 是两个字,a(x)和c(x)是其字多项式,

AES定义a和c的乘积b为 b(x)=a(x)c(x)modx^4+1

因为只可以写成多项式形式故乘法可以写成矩阵的形式

x^4+1是可约多项式,字c(x)不一定可逆

判断是否可约多项式方法:0,1一定是在区间内的两个元素, x^4+1=0,0不是他的根,1是它的根,是可约。有偶数项一定可约

AES选择的有逆元的固定c(x)

c(x)与x^4+1互为素数,存在逆

c(x)的系数选择: 系数0多1少,运算快,工程少

c(x)有逆的条件是 (x^4+1,c(x))=1

字x乘法

设b(x)为一个字,p(x)=xb(x)modx^4+1

可写成矩阵形式(原因同上)

因为模x^4+1,字的x乘法相当于按字节循环移位

AES的算法描述

AES的基本变换

AES数据处理方式

按字节处理

按字处理

按状态处理

状态:加解密过程中的中间数据,以字节为元素的矩阵或二维数组,数据长度128位,16个字节,4个字 4X4放置

符号表示:

Nb–明密文所含的字数

Nk–密钥所含的字数

Nr–迭代轮数

AES的基本变换

明文128bit,密钥128bit,一共进行10圈,前9圈叫做标准圈,最后 一圈叫做非标准圈

标准轮变换,共有四部分:字节代换,行移位,列混合,轮密钥加,分别分析这四部分的变换

S盒对状态进行处理,16字节4个字,16个S盒同时变换,每个变换 一个字节,非线性部分。S盒是决定密码安全性的最重要部件,是其安全的关键。

AES使用16个相同的盒子。DES使用8个不同的盒子

AES的S盒有8位输入8位输出,是一种非线性置换,DES的S盒有6位输入4位输出,是一种非线性压缩

工作步骤:

第一步;将输入字节用其GF(2^8)上的逆来代替

把输入字节看成GF(2^8)上的元素

求出其在GD(2^8)上的逆元素

用该逆元素替代原输入字节

第二步:对上面的结果做如下的仿射变换(线性)

(以x0-x7作输入,以y0-y7作输出)如下图:

在这里插入图片描述

点击加载图片

矩阵每行每列都有5个1,因此输出的每一位都和5个输入相关

行移位是线性运算

行移位变换对状态的行进行循环移位

第0行不移位,第1行移c1字节,第二行移c2字节,第3行移c3字节。

c1,c2,c3按表取值

nb=4,c1=1,c2=2,c3=3;

nb=6,c1=1,c2=2,c3=3

行移位变换属于置换,属于线性变换,本质在于把数据打乱重排,起扩散作用

列混合,对状态列混合变换,本质是置换,线性运算

列混合变换把状态的列视为FG(2^8) 上的多项式a(x),乘以一个固定的多项式c(x),并模x^4+1

b(x)=a(x)c(x)modx^4+1 其中c(x) 可写成多项式的形式

列混合变换属于线性变换,起扩散作用

c(x)与x^4+1互素,从而保证c(x)存在逆多项式d(x),

而c(x)d(x)=1modx^4+1。只有逆多项式d(x)存在,才能正确进行解密

-轮密钥加

轮密钥加变换(模2加)即把轮密钥与状态进行模2相加

轮密钥根据密钥产生算法产生

轮密钥长度等于数据块长度

轮密钥的生成:

轮密钥根据密钥产生算法通过用户密钥得到

密钥产生分两步进行

密钥扩展

密钥扩展将用户密钥扩展成一个扩展密钥

用一个字元素的一维数组W[Nb*(Nr+1)]表示扩展密钥

用户密钥放在该数据最开始的Nk个字节中,其他的字由他前面的字 经过处理得到的

分Nk≤6和Nk≥6两种密钥扩展算法,当前使用的情况 NK≤6的密钥扩展,最前面的Nk个字是由用户密钥填充的,之后的每一个字W[j]等于前面的字W[j-1]与Nk个位置之前的字W[j-Nk]的异或,而且对于Nk的整数倍的位置处的字,在异或之前,对W[j-1]进行Rotl 变换和ByteSub变换,再异或一个轮常数Rcon

j不是Nk的整数倍时候:Wj=Wj-1异或Wj-Nk

j是Nk的整数倍:Wj=Wj-Nk异或ByteSub(Rotl(Wj-1)异或Rcon[j/Nk])

Rotl变换是一个字里的字节循环左移函数设W=(A,B,C,D),则Rotl(W)=(B,C,D,A)

轮常数Rocn与Nk无关,且定义为Rocn[i]=(RC[i],‘00’,‘00’,‘00’) RC[0]=‘01’ RC[i]=xtime(RC[I-1])

NK≥6的密钥扩展,基本上与≤情况相似,不同在于:如果j被Nk除的余数=4,则在异或之前,对W[j-1]进行ByteSub变换,增加S变换,增强安全性

轮密钥选择,从扩展密钥中选出轮密钥。

非标准轮函数

最后一轮轮函数,没有列混合

加密

AES加密算法

组成部分:

一个初始轮密钥加变换

Nr-1轮·的标准轮变换

最后一轮的非标准轮变换

解密*

解密算法 AES基本逆变换

特点

AES加密算法不是对合运算,解密算法与加密算法不同

AES的巧妙之处:虽然接算法与加密算法不同,但是解密算法与加密算法结构相同

把加密算法的基本运变换成逆变换,便得到解密算法

求逆变换

轮密钥加变换的逆就是他本身

行移位变换的逆是状态的后三行分别移位Nb-C1,Nb-C2,Nb-C3个字节

列混合变换的逆,因为列混合变换是把状态的每一列都乘以一个固定的多项式c(x):b(x)=a(x)c(x)modx^4+1.

所以列混合变换的逆就是状态的每列都乘以c(x)的逆多项式d(x)

点击加载图片

S盒的逆

第一步,首先进行逆仿射变换

第二步,再把每个字节用其在GF(2^8)中的逆来变换,

把输入字节看成GF(2^8)上的元素,

求出其在GF(2^8)上的逆元素,

用该逆元素代替原输入字节。

解密密钥扩展

解密的密钥扩展与加密的密钥扩展不同

定义如下:加密算法的密钥扩展,把InvMixColumn 应用到除第一和最后一轮外的所有轮密钥上。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多