您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 密码学实验-实验2-DES和AES
密码学原理与实践实验报告一、实验目的①了解AES加密解密算法原理②了解DES加密解密算法原理二、实验内容与设计思想1.DES加密流程2.对于每个64位长度的明文分组的加密过程:①初始置换:输入分组按照初始置换表重排次序,进行初始置换。②16轮循环:DES对经过初始置换的64位明文进行16轮类似的子加密过程.③终结置换:按照终结置换表进行终结置换,64位输出就是密文。3.子密钥产生过程4.AES加密流程对于任意长度的明文,AES首先对其进行分组,每组的长度为128位。分组之后将分别对每个128位的明文分组进行加密。对于每个128位长度的明文分组的加密过程如下:(1)将128位AES明文分组放入状态矩阵中。(2)AddRoundKey变换:对状态矩阵进行AddRoundKey变换,与膨胀后的密钥进行异或操作(密钥膨胀将在实验原理七中详细讨论)。(3)10轮循环:AES对状态矩阵进行了10轮类似的子加密过程。前9轮子加密过程中,每一轮子加密过程包括4种不同的变换,而最后一轮只有3种变换,前9轮的子加密步骤如下:●SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;●ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;●MixColumns变换:MixColumns变换对状态矩阵的列进行变换;●AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作。最后一轮的子加密步骤如下:●SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;●ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;●AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作;5.AES解密过程AES的加密和解密过程并不相同,首先密文按128位分组,分组方法和加密时的分组方法相同,然后进行轮变换。AES的解密过程可以看成是加密过程的逆过程,它也由10轮循环组成,每一轮循环包括四个变换分别为InvShiftRows变换、InvSubBytes变换、InvMixColumns变换和AddRoundKey变换;三、实验步骤和调试过程(建议画出程序流程图)DES加密解密实验:1.DES加密解密(1)明文为ILOVECHINA。(2)8(64位)个字符的密钥k,密钥k=12345678。(3)密文为:¤_ÜÀßüIÇVšOy¾$。(4)程序源代码及运行结果如下:主要算法operation.py#-*-coding:UTF-8-*-__author__='Sliver'__all__=['IpPermutation','InverseIpPermutation','CreateSubKeys','ExtendPermutation','SBoxPermutation','PBoxPermutation','xor','string2bin','bin2string']defIpPermutation(text):'''初始置换IP:将64位输入按IP规则置换后返回64位结果。'''IP=[58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7]return[text[IP[i]-1]foriinrange(64)]defInverseIpPermutation(text):'''逆初始置换IP^-1:将64位输入按IP^-1规则置换后返回64位结果。'''INVERSE_IP=[40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25]return[text[INVERSE_IP[i]-1]foriinrange(64)]defExtendPermutation(text):'''扩展置换E:将32位输入按E规则置换后拓展为48位结果。'''E=[32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1]return[text[E[i]-1]foriinrange(48)]#密钥调度所需的PC-1变换和PC-2变换PC_1=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4]PC_2=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32]defshift(text,movetimes):'''对给定的序列,左移指定次数,并返回移动后的序列。如:[1,2,3,4]&movetimes=1-[2,3,4,1]。'''returntext[movetimes:]+text[:movetimes]defCreateSubKeys(primarykey):'''根据主密钥,生成十六个轮密钥。'''result=[]key56=[primarykey[PC_1[i]-1]foriinrange(56)]MOVETIMES=[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]#进行16轮子密钥生成foriinrange(16):#每28位为一部分,分别进行循环左移key28left=shift(key56[:28],MOVETIMES[i])key28right=shift(key56[28:],MOVETIMES[i])key56=key28left+key28right#对56位密钥进行PC-2变换,将其压缩为48位key48=[key56[PC_2[i]-1]foriinrange(48)]result.append(key48)returnresult#构建8个S-盒模型S1=[[14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7],[0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8],[4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0],[15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13]]S2=[[15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10],[3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5],[0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15],[13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9]]S3=[[10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8],[13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1],[13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7],[1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12]]S4=[[7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15],[13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9],[10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4],[3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14]]S5=[[2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9],[14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6],[4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14],[11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3]]S6=[[12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11],[10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8],[9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6],[4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13]]S7=[[4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1],[13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6],[1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2],[6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12]]S8=[[13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7],[1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2],[7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8],[2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11]]#S-盒S_BOX=[S1,S2,S3,S4,S5,S6,S7,S8]defdex2bin4(dex):'''将(不超过15的)十进制数转化成4位二进制字符串。如:13-'1101'。'''temp=bin(dex).replace('0b','')length=len(temp)addzero='0'*(4-length)#不足四位的在前面补0returnaddzero+tempdefdex2bin8(dex):'''将十进制数转化成8位二进制字符串。如:90-'01011010''''temp=bin(dex).replace('0b','')length=len(temp)addzero='0'*(8-length)#不足四位的在前面补0returnaddzero+tempdefSBoxPermutation(text):'''S-盒置换:将48位输入均分成长度为6的8个小组,每个小组按顺序进入相应的S盒各得到4位输出,返回合并后的32位结果。'''result=[]foriinrange(0,8):temp=text[i*6:i*6+6]row=int(str(temp[0])+str(temp[-1]),2)column=int(str(temp[1])+str(temp[2])+str(temp[3])+str(temp[4]),2)letter=S_BOX[i][row][column]result.append(dex2bin4(letter))return[int(x)forxin''.join(result)]defPBoxPermutation(text):'''P-盒置换:将32位输入按P规则置换后返回32位结果。'''P=[16,7,20,21,2
本文标题:密码学实验-实验2-DES和AES
链接地址:https://www.777doc.com/doc-8278980 .html