文档介绍::des是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。des是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。des的所有的保密性均依赖于密钥。::第一阶段:初始置换ip。在第一轮迭代之前,需要加密的64位明文首先通过初始置换ip的作用,对输入分组实施置换。最后,按照置换顺序,des将64位的置换结果分为左右两部分,第1位到第32位记为l0,第33位到第64位记为r0。第二阶段:16次迭代变换。des采用了典型的feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。des算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程(假设第i次迭代所得到的结果为liri):li=ri-1;ri=li-1⊕f(ri-1,ki);在最后一轮左与右半部分并未变换,而是直接将r16l16并在一起作为未置换的输入。第三阶段:逆(初始)置换。他是初始置换ip的逆置换,记为ip-1。在对16次迭代的结果(r16l16)再使用逆置换ip-1后,得到的结果即可作为des加密的密文y输出,即y=ip-1(r16l16)。:des的解密算法与其加密算法使用的算法过程相同。两者的不同之处在于解密时子密钥ki的使用顺序与加密时相反,如果子密钥为k1k2…k16,那么解密时子密钥的使用顺序为k16k15…k1,即使用des解密算法进行解密时,将以64位密文作为输入,第1次迭代运算使用子密钥k16,第2次迭代运算使用子密钥k15,……,第16次迭代使用子密钥k1,其它的运算与加密算法相同。这样,最后输出的是64位明文。(程序)::voidencodemain();//encodemainfunctionvoiddecodemain();//sorry,ithasnotusedvoiddecode(int*str,int*keychar);//decode:input8chars,8keycharsvoidencode(int*str,int*keychar);//encode:input8chars,8keycharsvoidkeybuild(int*keychar);//createkeyarrayvoidstrtobin(int*midkey,int*keychar);//changeintobinaryvoidkeycreate(int*midkey2,intmovebit,inti);//callbykeybuildvoidencodedata(int*ldata,int*rdata,int*srt);//encodedatafunctionvoidf(int*rdata,int*key);//ffunctionvoidexpand(int*rdata,int*rdatap);//expandfunctionvoidexchanges(int*rdatap,int*rdata);//s-diagramchangevoidexchangep(int*rdata);//pchangevoidfillbin(int*rdata,intn,ints);voiddecodedata(int*str,int*ldata,int*rdata);//decodedatafrombinaryintip1[]={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};intip2[]={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,