实验六 对称密码基本加密实验-IDEA、AES
【实验目的】
理解对称密码体制和分组密码算法的基本思想
理解 IDEA、AES、SMS4 等算法的基本原理
掌握上述各个密码算法的输入输出格式和密钥格式
掌握上述各个密码算法的加解密过程和实现方法
【实验原理】
对称密码体制使用相同的加密密钥和解密密钥,其安全性主要依赖于密钥的保密性。分组密码是对称密码体制的重要组成部分,其基本原理为:将明文消息编码后的序列m0,m1,m2,…,mi划分为长度为L(通常为64或128)位的组m=(m0,m1,m2,…,mL-1),每组分别在密钥k=(k0,k1,k2,…,kt-1)(密钥长度为t)的控制下变换成等长的一组密文输出序列c=(c0,c1,c2,…,cL-1)。分组密码的模型如下图所示:
分组密码实际上是在密钥的控制下,从一个足够大和足够好的置换子集中简单而迅速地选出一个置换,用来对当前输入的明文分组进行加密变换。现在所使用的对称分组加密算法大多数都是基于Feistel分组密码结构的,遵从的基本指导原则是Shannon提出的扩散和混乱,扩散和混乱是分组密码的最本质操作。
分组密码与流密码的对比:分组密码以一定大小的分组作为每次处理的基本单元,而流密码则以一个元素(如一个字母或一个比特)作为基本的处理单元;流密码使用一个随时间变化的加密变换,具有转换速度快、低错误传播的优点,软硬件实现简单,缺点是低扩散、插入及修改不敏感;分组密码使用的是一个不对时间变化的固定变换,具有扩散性好、插入敏感等优点,缺点是加解密处理速度慢、存在错误传播。
一、IDEA算法
1990年,瑞士联邦理工学院的中国青年学者来学嘉(Xuejia Lai)和著名密码专家James L. Massey在EUROCRYPT 1990国际会议上提出了一个名叫PES(Proposed Encryption Standard)分组密码算法,稍后经过改进成IPES(Improved PES),并于1992年被最终定名为国际数据加密标准(International Data Encryption Algorithm,IDEA)。国际上普遍认为IDEA是继DES之后的,又一个成功的分组密码,已经应用于Email系统的PGP(Pretty Good Privacy)、OpenPGP的标准算法以及其他加密系统中。
IDEA是一个分组密码,也是一个对合运算,明文和密文的分组长度为64比特,密钥长度为128比特。IDEA易于实现,软硬件实现都很方便,而且加解密速度很快。
(一)加密运算
IDEA中的三个运算为:l 6位子分组的相异或;16位整数的模216加,即;16位整数的模216+1乘,即。
IDEA的整体结构如下图所示,由8轮迭代和一个输出变换组成。64位的明文分为4个子块,每块16位,分别记为。64位的密文也分为4个子块,每块16位,分别记为。128位的密钥经过子密钥生成算法产生出52个16位的子密钥,每一轮加密迭代使用6个子密钥,输出变换使用4个子密钥。记为第r轮迭代使用的第i个子密钥,。记为输出变换使用的第i个子密钥,。
每一轮的运算步骤如下:
(1) 。
(2) 。
(3) 。
(4) 。
(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)步的结果异或。
(15)第(11),(12),(13),(14)步的结果为本轮加密迭代的输出结果。
(二)解密运算
IDEA的解密过程和加密过程相同,只是所使用的子密钥不同。IDEA采用基本轮函数迭代结构,既采用混淆技术,又采用扩散技术。具体地,采用了三种不同的代数群,将其混合运算,获得了良好的非线性,增强了密码的安全性。IDEA是在Ascom-Tech AG公司的Hasler基金会的支持下完成的,在许多国家申请了专利保护,在非商业领域却是自由使用的。IDEA的商标为MediaCrypt所拥有,专利保护期到20##-20##年间。
二、AES算法
美国国家标准技术协会(NIST)于1997年提出征集一个新的对称密钥分组加密算法作为取代DES的新的加密标准的公告,并将这个新的算法命名为高级加密标准(Advanced Encryption Standard,AES)。20##年10月2日,NIST宣布选中了Rijndeal算法,建议作为AES使用,并于20##年正式发布了AES标准。Rijndeal算法是具有分组长度和密钥长度均可变的分组密码,密钥长度和分组长度可独立指定为128比特、192比特或256比特。为了满足AES的要求限定处理分组的大小为128比特,密钥长度为128比特、192比特或256比特,相应的迭代轮数为10轮、12轮、14轮,分别记为AES-128/192/256。Rijndeal算法采用Square结构,每一轮都使用代替和混淆并行地处理整个数据分组,包括3个代替和1个混淆。此处以密钥程度与分组长度均为128比特(此时对应的轮数是10)为例,说明Rijndeal算法的加解密过程。128比特的消息(明文、密文)被分为16个字节,记为:输入分组=m0,m1,…,m15;同样的密钥分组也如此:k=k0,k1,…,k15;内部数据结构的表示为一个44矩阵:
输入分组= 输入密钥=
Rijndeal中的轮变换记为Round(State,RoundKey),这里State是轮消息矩阵,可被看成输入或输出;RoundKey是轮密钥矩阵,由输入密钥通过密钥表导出。一轮的完成将改变State的元素的值,即改变State的状态。轮(除了最后一轮)变换由四个不同的变换组成,如下所示。
Round(State,RoundKey)
{ SubBytes(State);
ShiftRows(State);
MixColumns(State);
AddRoundKey(State,RoundKey);}
最后一轮稍有不同,记为FinalRound(State,RoundKey),等于不使用MixColumns函数的Round(State,RoundKey)。论变换是可逆的,以便于解密。相应的逆轮变换记为Round-1(State,RoundKey)和FinalRound-1(State,RoundKey)。SubBytes(State)函数为State的每一个字节x提供了一个非线性代换,任一GF(28)域上的非零字节x被如下变换所代换:y=Ax-1+b;此处
A= b=
ShiftRows(State)函数在State的每行上运算,对于在第i行的元素,循环左移i个位置。
MixColumns(State)函数在State的每列上作用,此处只描述对一列的作用:对于一列(s0,s1,s2,s3)-1,将其表示成3次多项式s(x)=s3x3+s2x2+s1x+s0;对s(x)做如下运算得到d(x)=c(x)?s(x)(mod x4+1),其中c(x)=c3x3+c2x2+c1x+c0=’03’x3 +’01’x2+’01’x+’02’,c(x)的系数是GF(28)域中的元素(以十六进制表示字节)。AddRoundKey(State,RoundKey)函数将RoundKey中的元素和State中的元素进行逐比特的异或操作。解密运算仅仅是在相反的方向反演加密,即运行
AddRoundKey(State,RoundKey) -1;
MixColumns(State)-1;
ShiftRows(State) -1;
SubBytes(State) -1;
可以看出Rijndeald密码的加解密必须分别使用不同的电路和代码。
三、SMS4算法
SMS4密码算法是我国官方公布的第一个商用密码算法,主要应用于无线局域网产品。SMS4算法是一个分组算法,其分组长度为128比特,密钥长度为128比特;加密算法与密钥扩展算法都采用32轮非线性迭代结构;解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。密钥与明密文均以32比特为单位进行划分,轮函数与密钥扩展算法也以32比特为基本单位进行运算。
(1) SMS4轮函数
设输入X=(X0,X1,X2,X3),轮密钥为rk(由加密密钥通过密钥扩展算法得到),则SMS4算法的轮函数可表示为:
L为线性变换,设输入为A,输出为B,则:
B=L(A)=A(A<<<2)(A<<<10)(A<<<18)(A<<<24)
其中<<<i表示32比特循环左移i位,A、B均为为32 比特。
τ为非线性变换,以8比特为基本单位进行运算,由四个S盒组成。设输入A=(a0,a1,a2,a3),输出为B=(b0,b1,b2,b3),则:
B=(b0,b1,b2,b3)=τ(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))
其中ai、bi均为一个字节。
(2) SMS4的扩展密钥算法
SMS4的扩展密钥算法用来通过输入的加密密钥生成32个轮密钥,算法描述如下:
加密密钥MK=(MK0, MK1, MK2, MK3),i=0,1,2,3;中间变量为Ki,i=0,1,…,35;轮密钥为rki,i=0,1,…,31;其中MKi、Ki、rki均为32比特;则密钥生成方法为:
其中:系统参数FK的取值用16进制来表示,FK0=(A3B1BAC6),FK1=(56AA3350),FK2=(677D9197),FK3=(B27022DC);
L’为L的修改,;固定参数CK的取值方法为:设cki,j为CKi的第j字节(i=0,1,…,31,j=0,1,2,3),即CKi = (cki,0,cki,1,cki,2,cki,3),则cki,j = (4i+j)×7(mod 256);32个固定参数CKi,其16进制表示为:
00070e15, 1c232a31, 383f464d, 545b6269,
70777e85, 8c939aa1, a8afb6bd, c4cbd2d9,
e0e7eef5, fc030a11, 181f262d, 343b4249,
50575e65, 6c737a81, 888f969d, a4abb2b9,
c0c7ced5, dce3eaf1, f8ff060d, 141b2229,
30373e45, 4c535a61, 686f767d, 848b9299,
a0a7aeb5, bcc3cad1, d8dfe6ed, f4fb0209,
10171e25, 2c333a41, 484f565d, 646b7279。
(3) SMS4加解密算法
设明文输入为(M0,M1,M2,M3),密文输出为(C0,C1,C2,C3),轮密钥为rki,i=0,1,2,…,31,其中,Mi、Ci、rki均为32比特;则SMS4算法的加密可表示为:
SMS4算法的解密与加密变换结构相同,但轮密钥使用顺序相反。
【实验环境】
ISES客户端
Microsoft CLR Debugger 2005或其它调试器
【实验内容】
通过运算器工具实现IDEA、AES-128/192/256、SMS4 等算法的加解密计算
通过轮密钥查看工具查看AES 的轮密钥生成过程
查看 AES 算法逐步计算的动画演示
对IDEA、AES-128/192/256、SMS4 等算法的加解密进行扩展实验
对IDEA、AES-128/192/256、SMS4 等算法的加解密进行算法跟踪
【实验步骤】
一、IDEA
在加密算法选项里选择IDEA,以下实验步骤保持算法不变。
(一)加解密计算
选择明/密文和密钥的格式,输入明/密文和密钥;点击“加密”/“解密”按钮,进行加/解密计算;查看计算结果。
具体步骤可参照DES的加解密计算的实验步骤。
(二)扩展实验
(1) 点击“扩展实验”框中的“IDEA扩展实验”按钮,进入IDEA扩展实验窗口,打开后默认进入扩展实验主页面。
(2) 在主窗口中的“明文”文本框中输入16个十六进制的数值串,在“密钥”文本框中输入32个十六进制的数值串,点击“加密”按钮。
(3) 观察密码生成过程。在主窗口中点击“密码表”按钮,进入密码表的生成过程。点击“运行”后,再点击“上”、“下”、“左”或“右”箭头,分别得到相应轮次的密码变换结果。
(4) 观察轮变换过程。点击轮变换中的“左”或“右”箭头,观察该轮加密的结果;也可以直接在轮次文本框中输入一个1-9之间的数值,点击“循环”按钮;
(5) 观察输出变换过程。当轮变换的轮次到9时,即进入了IDEA密码的最后一轮输出变换,得到最后的加密运算结果;
(6) 运算器工具。在主窗口中点击“运算器”,即进入运算器工具窗口;用户可在其中输入十六进制的数据进行IDEA中的一些典型运算,如“16位按位异或+”、“16位整数作模216+1相乘⊙”或“16位整数作模216相加+”运算;
(7) 在主窗口中的“密文”文本框中输入16个十六进制的数值串,在“密钥”文本框中输入32个十六进制的数值串,点击“解密”按钮,即可进行解密操作;IDEA解密扩展实验的其他过程与加密类似,不再赘述。
(三)算法跟踪
选择IDEA算法,在算法计算的相应区域输入明/密文和密钥;点击“跟踪加密”/“跟踪解密”按钮,进入调试器,选择对应的算法函数进行算法跟踪;跟踪完成后会自动返回实验界面显示计算结果;切换回调试器,停止调试,关闭调试器,不保存工程。
具体步骤可参照古典密码实验中实验步骤二。
二、AES-128/192/256
AES-128/192/256的区别仅在于密钥长度的不同,此处以AES-128为例,AES-192/256可参照完成。在加密算法选项里选择AES-128,以下实验步骤保持算法不变。
(一)加解密计算
选择明/密文和密钥的格式,输入明/密文和密钥;点击“加密”/“解密”按钮,进行加/解密计算;查看计算结果。具体步骤可参照DES的加解密计算的实验步骤。
(二)查看轮密钥
点击“扩展实验”框中的“查看轮密钥”按钮,进入查看轮密钥窗体,可窗体在右侧查看相应的原理。输入明文、初始化向量和128位密钥,选择工作模式和填充模式,点击“加密”按钮,使用AES-128算法按照选定的工作模式和填充模式进行加密;在“密钥”框中查看各轮的密钥,在“密文”框中查看生成的密文。
(三)查看演示动画
点击算法跟踪实验框内的“AES动画演示”按钮,进入AES算法加密的逐步计算的动画演示窗体,按回车进行逐步查看。
(四)算法跟踪
选择AES-128算法,在算法计算的相应区域输入明/密文和密钥;点击“跟踪加密”/“跟踪解密”按钮,进入调试器,选择对应的算法函数进行算法跟踪;跟踪完成后会自动返回实验界面显示计算结果;切换回调试器,停止调试,关闭调试器,不保存工程。
具体步骤可参照古典密码实验中实验步骤二。
三、SMS4
在加密算法选项里选择SMS4,以下实验步骤保持算法不变。
(一)加密计算
选择明文和密钥格式,输入明文和密钥;选定算法为SMS4,点击“加密”按钮,进行加密计算;在“密文”框内查看加密计算结果。具体步骤可参照DES的加密计算的实验步骤。
(二)扩展实验
(1) 点击“扩展实验”框中的“SMS4扩展实验”按钮,进入SMS4扩展实验窗口,打开后默认进入扩展实验主页面。
(2) 在主窗口中的“明文”文本框中输入32个十六进制的数值串,在“密钥”文本框中输入32个十六进制的数值串,点击“加密”按钮。
(3) 观察密码生成过程。在主窗口中点击“密码表”按钮,进入密码扩展算法界面,①点击密码表窗口中的右上角按钮“K0,K1,K2,K3”,进入密钥扩展的初始运算界面; ②点击密码表窗口中的右边的中间按钮“K4…K35”,进入密钥扩展的轮变换界面。首先,点击“<”、“>”按钮,可以调整不同的轮次,也可以直接输入相应的轮次后点击“循环”按钮。然后,依次顺序点击模2加、循环按钮,得到本轮的加密密钥。③点击密码表窗口中的“S”按钮,进入S盒表变换。
(4) 观察轮变换过程。首先,点击轮变换中的“左”或“右”箭头,观察该轮加密的结果。也可以直接在轮次文本框中输入一个1-32之间的数值,点击“循环”按钮。然后,依次点击轮变换中的模加、S变换、循环移位按钮,得到本轮的加密运算结果。
(5) 在主窗口中的“密文”文本框中输入32个十六进制的数值串,在“密钥”文本框中输入32个十六进制的数值串,点击“解密”按钮。SMS4解密的其他过程与加密类似,不再赘述。
(三)解密计算
选择密文和密钥格式,输入密文和密钥;选定算法为SMS4,点击“解密”按钮,进行解密计算;在“明文”框内查看解密计算结果。具体步骤可参照DES的解密计算的实验步骤。
【实验思考】
对比DES、3DES、IDEA、AES-128/192/256、SMS4算法的异同;参照实验原理,根据算法跟踪实验画出各个算法函数的主要流程图;思考各个对称密码算法的安全性和优缺点。