《2009252班 20093475 李行DES数据加密算法.docx》由会员分享,可在线阅读,更多相关《2009252班 20093475 李行DES数据加密算法.docx(28页珍藏版)》请在优知文库上搜索。
1、上海电力学院实验报告课程名称.信息安全/计算机安全.实验项目实验二.DES数据加密舜法1.学号20093475班级20()9252当业值息安全同组人姓名指导教师姓名.贰为民.实验口期胆.I冬且月瀛月一、实验目的通过本实验的学习.深刻理解DES加密标准,提高算法设计能力,为今后继续学习密码技术和数字签名典定基础.二、实验内容根据DES加密标准,用C+设计编写符合DES髓法思想的加、解诙程序,能够实现时字符申和数组的加密和解密.三、实耽步1 .在操作系统环境卜启动VC+集成环境(MicrosoftVisua1.C+6.0,其中6.0为版本号,也可为其它版本),则产生如图I所示界面。图1VC+集成环
2、境界面2 .选择“文件”菜单下的“新建”命令,出现如图2所示界面(不可宜接按“新建”按钮.此按钮是新建一个文本文件).此界面缺省标签是要为新程序设定工程项目,但端轮小的源程序也可以不建立项目,可以百.接选择其左上用的“文件”标签,产生如图3所示界面。3 .在图3所示的界面中左边选定文件类里为“C+-SourceFi1.e,右边填好文件名并选定文件存放目录,然后单击“确定”按钿,出现如图4所示编程界面,开始输入程序。1.输入完源程序后,按.编译”菜单下的娘译命令,对源程序进行编译.系统将在下方的窗口中显示编译估息.如枭无此窗口,可按F1.t+2.键或执行查看菜单下的输Hr命令.如果编译后已无提示
3、错误则可按“编译“菜单下的构件命令来生成相应的可执行文件.随后可按编译菜单下的执行.命令运行的程序,图2新建VC+工程项目界面图3新建YC源程序文件界面图4YC+源程序编辑界面四、DES算法的过程1 .处理密钥I1.1 从用户处荻得64位密WKey.(每第8位为校脸位.为使密W有正确的奇偶校验.每个字节要为奇数个“1”位.1.2 处理过程:1.2.1 时密钥实旗变换,经过子密切换位表Pe-I的变换后,Key的位数由61位变成了56位。1.2.2 把变换后的密钥等分成两部分.曲28位记为CO.后28位记为D0.1.2.3 计算子密蜴(共16个),从i=1.开始.1.2.3.1分别对Ci-1、Di
4、T作循环左移来生成Ci、Di(共16次).1.2.3.2串联Ci、Di,得到一个56位数,然后对此数作子密钥换位表PC-2变换以产牛.48位子密钥Ki。1. 2.3.3按以上方法计算出16个子密的.2.对64位敷福块的处理:2. 1把数据分成64位的数据块,不城64位的以适当方式填补。2. 2对数据块利用初始变换IP表作变换”2. 3将变换后的数据块等分成前后两部分,前32位记为1.0,后32位记为R0.2. 4用16个子密的对数据加密.2. 4.1利用扩展祝换E,将32位R(i-D数据扩展成48位。2. 4.2用ER(卜1与子密钥K(i)作按位异成运算.2. 4.3把所得的48位数分成8个6
5、位数组.16位为Z1.712位为Z2,43-48位为Z82. 4.I从j=1.开始,用S食里的值自换Zj.S盒里的值为4位数,共8个S盒,输出32位数.2. 4.4.1取出Zj的第I和第6位申联起来成一个2位数,记为.m即是Sj盒里用来皆换Zj的数所在的行数.2. 4.4.2取出Zj的第2至第5位串联起来成一个4位数.记为n.n却是Sj盒里用来替换Zj的数所在的列数.2.4.九3用坐标(m,n)在S盒中查找出相应的值作为S食的输出,2. 4.5八个选择函数SjaWjW8)的输电拼接为32位;进制数据,把它作为P盘置换的输入,褥到输出2. 1.6把得到的结果与1.(i-1.)作异或运算.把计算结
6、果赋给R(i).2. 4.7把R(iT)的值St给1.(i.完成1轮乘积变换,2. 4.8从2.4.1起循环执行16次,直到K(16)也被用到。3. 5把R(16)和1.(16)顺序串联起来得到一个64位数.对这个数实版2.2变换的逆变换IP1.五.算法实现(1)源程序ttprg11aonce钵inc1.udenineIudeRinc1.udc&inc1.udeIiJangaesac*std:c1.ossBigInteger(IyPedefUnfdCdCbarbyte:pub1.ic:BigInteger(Void);BigInteeer(int6-1.va1.ue);BigInteer(un
7、signed_intMva1.ue);Big1.ntrgcr(constBig1.nt:BieIntegeroperator-O:BigIniejscrmxiPv(Bi#InIdgerx.Big1.nICgern);intbitCountO;BigIntegerBarrettRe=(BigIntegerbi2)return(bi2);)boo1.operatorMBigIn1.egorbi2;boo1.operator=(BiIntegerbi2):Big1.ntrgcroperator%(Big1.ntcgcrbi2):voidsing1.eByteDiviBigInteeerfcoutRe
8、11inder);voidIiuItIByuDivide(Big1.ntegerbi1.BigInteerftbi2,Big1.ntrgcr(MitQuticnt.Big1.n1.egerKnutRrnaindrr);intShiftRight(unsignedintbuffer,intbuf1.en,intshiftVa1.);BigIntegeroperator(intshiftVaD:Intshift1.ft(unsignedinibuffer).intbut1.en,intshifVa1.);boo1.operator;Bg1.nieeroperator+=(BiIrteerbi2):
9、Big1.11tr-gcrprrator/(Big1.n1.rgcrbi2);BigIntegeroperator-s(Big1.nteeerbi2);BigInteeeroperator-(BigIntegerbi2);siringUec1.o1.iex(unsireub1.ic:Big1.ntegcroperntr*(BigIntcgcrbi2);private:pub1.ic:xtnticconstintprinesBc1.v20O01J;/PrimSsnn1.Ierthan2000toIgStthegeneratedPrinOnurberintdata1.ength;/nun1.rof
10、actua1.CharSusedprivate:staticconstintrmx1.n.gth;/raxi11un1.engthoftheBig1.ntegerinUinI(4bytes/charethistosuittherequired1.eve1.ofprecision,unsignedint*dat;/storesbytesfrcotheBigInteger):CincIudeStdAfx.hUinCIUdC*BiInteer.h*constintBigInteger:Imax1.ength=512;constintBiR1.nI。RCr:Pr加。SBCIOB2000=101,103
11、,107.109.H3.10211031,1033.1039.1019.105h10611063,1069,1087,1091.1093,1097,739391910211211212345678913319979110210000111234$&789,171311970100oooO(M23456/8911103.1109.1117.1201.1213.1217,1301,1303,1307,1123tH29.1151.1223,1229.1231,1319,I3211.1327.1153.1163,1171.1237,1249,1259,1361,1367,1373,1181,1187.
12、1193.1277.1279.1283,1381,1399,1289.1291,1297,1409,1423,1427,1429,1433,1439,M47.1151.1453,1459,1471,1481,1-183.1487.1189.1*1511,1523,1531.154315191553,1559,1567,1571,1579,1583.1597,1601,1607.1609,161X1619,1621,1627,1637.1657,1663,1667.1669.1693,1697,1699.1709.1721,1723.1733,1741.1717.1753,1759,1777,1
13、783,1787.1789.1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879.1889,1901,1907,1913,1931,1933,1919,1951,1973,1979,1987.1993,1997,1999):Big1.nteger:BigInteger(void):data1.ength(0),data(0)Idata-newunsignedint三ax1.ength;nemset(data,0.max1.ength*sizeof(unsignedint);data1.ength=1;)BigInteger:BigInteger(_int6-1va1.ue)(data=newUnSiXnedintBax1.enRth;nemset(data,0.max1.engthsizeof(unsignedint);.int(yte