您好,欢迎访问三七文档
DES加密算法DES全称DataEncryptionStandard,即数据加密标准,是一种使用秘钥加密的分组加密算法。DES加密算法的入口参数有三个Key、Data、Mode。其中key为7个字节共56位,是DES算法工作的秘钥;Data为8个字节64位,是被加密或解密的数据的一个分组;Mode是DES的工作方式,有两种:加密或解密。DES是一个十六轮的Feistel型密码(1),它的分组长度为64比特(当明文的长度不为64的整数倍时需要做填充,但可能会引起数据扩展(2)),用一个56比特的秘钥来加密一个64比特明文串,获得一个64比特的密文串。DES的加密过程可以分为三个部分:初始置换IP,十六轮的迭代函数,最后的逆置换1-IP。其中十六轮的迭代函数是核心;置换IP及逆置换1-IP仅仅打乱原文(明文或未完全加密的密文)的坐标顺序,不具有密码学意义。DES的加密过程1、对64位分组明文进行初始置换IP。将置换后的明文记为000XRL,其中0L表示置换后64位的左侧32位,0R表示右侧32位。2、计算16轮的迭代函数。我们可以根据公式1iRLiiiiiKLfL,R11来计算第i轮的iiRL,其中表示按位做异或运算,f是一个函数,iK是第i轮的秘钥(i=1,2…16)。3、对得到的密文做逆置换1-IP记y=16161-RLIP。步骤2中函数f的定义函数f的示意图(示意图画的很奇怪,找到合适的工具,重新画。)函数f的具体实施步骤:迭代过程中每一轮的输入是上一轮的输出。E是一个扩充置换,将32位的A扩充为48位(3)。在每一轮迭代中AJ7E(A)+B1B2B8B7B6B5B4B3S1S2S3S4S5S6S7S8C1C2@@C8C7C6C5C4C3PF(A,J)EA是该轮输入的右侧32位。J是48位的子秘钥,由子秘钥生成函数生成(见后面内容),每一轮的子秘钥均不相同。A经过扩充置换后的E(A)与子秘钥J经过异或得到8个S盒(4)B1B2B3B4B5B6B7B8的输入,每一个S盒将六位的输入转换为四位输出。S盒是DES加密算法中唯一的非线性部分,S盒的复杂度决定DES的安全性。S盒的转换规则:S盒是由四行十六列64个数字构成每行由0-15的数字构成。假设S盒的输入s1s2s3s4s5s6(均为二进制比特流),s1s6构成的二进制数决定输出的行s2s3s4s5构成的二进制数决定输出的列,行列交点处的数转换为二进制即可得到要输出的四位数。子秘钥的生成:初始秘钥是64位,通过置换PC1(5)将64位初始秘钥紧缩为56位(省去了八个奇偶校验位,它们分别为第8,16,24,32,48,56,64位)。将56位秘钥等分为两部分记为00DC,再分别做循环左移(在1,2,9,16轮左移一位,其余轮循环左移位。将循环左移后的秘钥再经置换选择二得到最终的秘钥(当轮)而循环左移后的56位秘钥可以作为下一轮的输入秘钥。初始的64位秘钥由秘钥生成器生成。我没有找到关于DES初始秘钥生成器的资料只找到了关于流密码的秘钥生成器的相关资料。流密码的秘钥由有限状态自动机生成,有限状态自动机由有限状态自动集、有限输入\输出字符集、转移函数三部分构成,可以分成线性部分及非线性部分的组合。即:线性部分控制生成器的状态转移,并为非线性部分提供统计性能良好的序列;非线性组合部分则利用这些序列产生秘钥流序列。其线性部分大多由一个或多个线性反馈移位寄存器组成,非线性部分主要有四种有多个线性反馈移位寄存器驱动的非线性序列生成器:Geffe序列生成器、J-K触发器、pless生成器、钟控序列生成器组成。S盒的设计要求1、S盒的输出都不是其输入的线性或仿射函数(保证了S盒的非线性);2、改变S盒的一个输入比特其输出至少有两个比特产生变化,即近一半产生变化;3、当S盒的任一输入保持不变,其它5位输入变化时(共有562=32种),输出中0,1的总数近于相等。(满足随机性)。DES的解密算法DES的解密算法与加密算法共用相同的算法过程,即使用相同的方法完成加密和解密,两者的不同之处仅在于解密时将64位密文作为输入及子秘钥Ki的使用顺序与加密时相反。(真的这么简单吗?请写程序检验!!!)注释:(1)Feistel网络:将nbit明文分成左右各半,长为n/2bit每段。分别以L和R表示。然后进行多伦迭代,其中第i轮迭代输出为第i-1轮输出的函数(因为第i轮的输入为第i-1轮的输出)。其中1iRLiiiiiKLfL,R11,Ki是第i轮的子秘钥,f是任意密码的轮函数。它保证了加密和解密用同一算法实现。Feistel加密过程:对于密文(1,1nRnL)将i有n向0进行,即:i=n,n-1,…,0再对密文进行加密算法的逆向操作,1RiiL),(1iiiiiKLfRL。(2)由于分组长度不为64比特因此用0、1填充,填充后数位会扩展。(3)扩充置换E:将输入的32位1-iR扩展为48bit输出令S表示E原输入数据bit的原下标,则E的输出将原下标S=0或S=1(mod4)的各比特重复一次得到即对原第32、1、4、5、8、9、12、13、16、17、2021、24、25、28、29各位都重复一次,实现数据扩展。(4)S盒:在Feistel网络中S盒起代换作用(代换是输入集A到输出集B的一个双射变换:B-A:fk。双射条件保证在给定K下可以由密文唯一地恢复出原明文)。在密码设计中,代换kf的集合,即:S盒。在设计时常常利用一些简单的基本代换通过组合实现较复杂的,元素个数较多的代换集。例如:DES加密算法中是将48比特数据分成8组每组6比特用6个S盒分别进行代换在不同的加密算法中S盒的代换规则不同。(5)置换选择PC1:57494133251791585042342618102595143352719113605244366355473931231576254463830221466153453729211352820124置换选择PC2置换选择PC1(不涉及8个奇偶校验位)得到两个28,它们分别是0C=4957KK…3644KK,0D=5563KK…4012KK。置换选择PC2将56位紧缩为48位,前28位去掉第9、18、22、25位,后18位去掉第35、38、43、54位。置换规则:如PC1中57表示第一个输出原秘钥中的第57位。DES加密解密的实现:#includestdio.h#includestdlib.h#includestring.hvoidshow1()//主界面{printf(\n\n\n\t\t***************DES加密解密系统******************\n\n);printf(\t\t--------------------------------------------------\n);//printf(\t\t--------------------------------------------------\n);printf(\t\t**************************************************\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);1417112415328156211023191242681672720132415231374755304051453348444939563453464250362932printf(\t\t**\t\t\t1.加密\t\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t**\t\t\t2.解密\t\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t**\t\t\t3.退出\t\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t--------------------------------------------------\n);}voidshow2()//加密界面{printf(\n\n\n\t\t******************DES加密**********************\n\n);printf(\t\t--------------------------------------------------\n);printf(\t\t**************************************************\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t**\t请选择明文和密钥的输入方式:\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t**\t\t1.直接输入\t\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t**\t\t2.从文件读取\t\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t**\t\t3.退出\t\t\t\t**\n);printf(\t\t**\t\t\t\t\t\t**\n);printf(\t\t--------------------------------------------------\n);printf(\t\t\t选择:);}voidreader(charstr[30],chars[8])//读取明文和密钥{FILE*fp;fp=fopen(str,r);if(fp==NULL){printf(明文读取失败!\n);}else{fscanf(fp,%s,s);}fclose(fp);}voidTo2Bin(charp[8],intb[64])//将字节转换成二进制流{inti,k=0;for(i=0;i8;i++){intj=0x80;for(;j;j=1){if(j&p[i]){b[k++]=1;}else{b[k++]=0;}}}}intIP_Table[64]=//初始置换(IP){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,56,48,40,32,24,16,8,0,58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6};intE_Table[]={//扩展变换E31,0,1,2,3,4,3,4,5,6,7,8,7,8,9,10,11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20,21,22,23,24,23,24,25,26,27,28,27,28,29,30,31,0};intS_Box[8][4][16]={//8个s盒{{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}},{{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,1
本文标题:DES加密算法
链接地址:https://www.777doc.com/doc-2909839 .html