版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息加解密实践总结报告 专 业 信息安全 班 级 软信0701 学 号 20073596 姓 名 赵文彬 日 期 2009-9-17 东北大学软件学院一、 实践目的与意义 本实验旨在提高学生的实际操作能力,包括对各种密码的掌握及编程。由于是团队合作,和主流的工作模式相合,从而提高了大家的团队合作能力及工作适应能力。而整个实践的要求是做出一个面向用户的可视化程序,应该说是一个小项目了,做软件本来就是为用户服务的,从这方面讲,对大家做软件的思想有一定的改善。二、 实践环境操作系统:Windows XP开发工具:Microsoft Visual C+调试软件:Microsoft Visual C+版
2、本号:6.0上机地点:东北大学综合楼208三、 项目组分工组长:赵文彬姓名学号分工赵文彬20073596界面设计,把各项程序整合到界面中,相关报告和PPT史仁杰20073585DES加解密,DH密钥交换,Socket编程,整合报告及PPT王春辉20073589古典密码,相关报告和PPT李丙坤20073582RC4,RSA,相关报告和PPT四、 系统设计可分为概要设计和详细设计,包括算法设计,功能设计,数据库设计,模块设计,接口设计,协议设计,界面设计等。五、 系统实现环境配置:Windows XP 使用软件:Microsoft Visual c+ 6.0主要界面: 一、单表替代密码实现: 1、
3、caesar cipher:原理:凯撒密码关键的是密匙,密匙也就是一个数字,然后将字母表循环右移密钥个单位,比如密钥是2,那么将字母表循环右移2个单位变成了cdefghijk,则加密后的密文,a用c代替、b用d代替。程序流程图: 加密: 解密: 代码设计: A、加密算法:for(i=0;i<strlen(str1);i+)stri=(str1i+j-'a')%26+'a' B、解密算法:for(i=0;i<strlen(str1);i+)stri=(str1i+26-j-'a')%26+'a'2、 keyword ci
4、pher原理:选择一个关键词,如果该关键词有重复的字母,去除除去第一次出现之外的所有相同字母。(例如关键词为success,则用suce。)将该关键词写在字母表的下方,并用字母表的其他字母按标准的顺序填写余下的空间。例如关键词为magicnet,写为如下形式:a b c d e f g h i j k l m n o p q r s t u v w x y z m a g i c n e t b d f h j k l o p q r s u v w x y z 字母表对应了替换模式。a总用m代替.程序流程图:加密: 解密:代码设计:A、 加密算法:int l=strlen(key);/将关键
5、字中重复字母去除for(i=1;i<l;i+)for(j=0;j<i;j+)if(keyi=keyj)for(k=i+1;k<=l;k+)keyk-1=keyk;l-;i-;break;for(j=0;j<M;j+)/将其余字母按顺序补充在关键词之后if(!alphaj)keyi+='a'+j;for(i=0;stri!='0'i+)/加密算法cipi=key(stri-'a'+26)%26;B、解密算法:for(i=0;i<N;i+)/解密算法for(j=0;j<M;j+)if(stri=keyj)print
6、f("%c",str1j);continue;二、多表替代密码实现1、vigenere cipher原理:vigenere加密法是基于关键词加密系统,但并不是像单码关键词加密法那样使用关键词来定义替换模式的,关键词写在明文的上面,并不断重复书写,这样每个明文字母都与一个关键词的字母相关联。例如,如果关键词为hold,而明文为thisistheplaintext,那么,关键词明文的关联如下图:h o l d h o l d h o l d h o l d h ot h i s i s t h e p l a i n t e x t 每一个明文字母与关键词的一个字母配对。例如:
7、明文的第一个字母“t”与关键词的字母“h”配对。在vigenere表中查找“t”列和“h”行,找到对应的结果。重复这个过程可以生成密文。程序流程图: 加密: 解密:代码设计:A、加密算法:for(i=0;i<plen;i+)/加密算法,查询Vigenere表 m=keytxti-'a'/行标r=plantxti-'a'/列标ciphertxti=tablemr; B、解密算法:for(i=0;i<plen;i+)/解密算法/明文对应的字母值等于密文对应的字母值与密钥字母值之差if(ciphertxti<keytxti)plantxti=ciph
8、ertxti+26-keytxti+'a'elseplantxti=ciphertxti-keytxti+'a'2、autokey plaintext:原理:基于vigenere加密法,但是关键词只用一次,明文为加密法提供其余的文字。例如关键词为alice明文是ihopethisworksbetterthan生成以下明文密文对: aliceihopethisworksbetteihopethisworksbetterthaniswribowhahyskxskdwsxatr程序流程图: 加密: 解密:代码设计:A、加密算法:n=strlen(pla); m=str
9、len(key); strncat(key,pla,n-m); for(i=0;i<n;i+)cipi=(plai+keyi-2*97)%26+'a'/加密算法B、解密算法: for(i=0;i<26;i+)for(j=0;j<26;j+)str1ij=(i+j)%26+'a' /打印vigenere表n=strlen(cip);m=strlen(key);for(i=0;i<m;i+)/小于等于密钥长度的情况j=(cipi+26-keyi)%26;plai=str10j;printf("%c",plai);for(i
10、=m;i<n;i+)/大于密钥长度的情况keyi=plai-m;j=(cipi+26-keyi)%26;plai=str10j;printf("%c",plai);三、多图替代密码实现1、playfair cipher原理:playfair加密法是基于一个关键词的,将该关键词写入一个5X5的矩阵中(除去重复的字母和字母j)。子目标的其他字母按顺序写在矩阵的剩下空位中。例如关键词为telegram可构成矩阵:t e l g ra m b c df h I k no p q s uv w x y z通过在矩阵中查找对应的明文,并根据以下规则选取密文,从而生成密文:如果两个
11、明文字符出现在同一行,选用右边的字符做为密文如果两个明文字符出现在同一列,选用下方的字母作为密文如果两个明文字符出现在不同的行和列,那么他们就形成了包含这两点的矩形,选用这个矩形上的另外两个点的字母作为密文程序流程图:代码设计:A、 矩阵实现: t=b%u; /判断明文字符个数是否被关键字个数整除if(t=0) c=b/u; /整除则令c=b/u为行数for(j=0;j<c;j+)for(i=0;i<u;i+)mingwenji=yuanweny;/将明文写入加密矩阵y+; elsec=b/u+1; /不整除则令c=b/u+1为行数for(j=0;j<c;j+)for(i=0
12、;i<u;i+) if(y<b)mingwenji=yuanweny;elsemingwenji=113;/最后一行多出来的空用'q'填充 y+;:四、置换密码实现1、permutation cipher原理:在置换加密法中,将密文分成了固定长度的块,如d,置换函数f用于从1d中选取一个整数。然后,每个块中的字母根据f重新排列。这种加密法的密钥就是(d,f)。例如假设d为4,f给定为(2,4,1,3)。这意味着将第1个字母移到位置2,第2个字母移到位置4,第3个字母移到位置1,第4个字母移到位置3。根据f给每个块重新排列,即可以得到密文。程序流程图:加密: 解密:代
13、码设计:A、加密算法:m=strlen(str);for(i=0;i<n-(m-1)%n+1);i+)strm+i='x'for(i=0;i<(m+n-(m-1)%n+1)/n;i+)for(j=0;j<n;j+)str1ikeyj-1=strn*i+j;B、解密算法:m=strlen(str);for(i=0;i<n;i+)newkeykeyi-1=i+1;for(i=0;i<(m+n-(m-1)%n+1)/n;i+)for(j=0;j<n;j+)str1inewkeyj-1=strn*i+j;for(i=0;i<(m+n-(m-1)
14、%n+1)/n;i+)for(j=0;j<n;j+)printf("%c",str1ij);printf("n");2、column permutation cipher原理:给定关键词,按从a到z的顺序计算关键词的字母出现的顺序并计算关键词的长度d(即字母个数)。将明文分成d列,例如关键词为general顺序为4263715,将明文分成7列若最后一行不足补充q或x等无效字母,然后按4263715的顺序读取各列,既可以得到密文。程序流程图:代码设计:A、加密算法:for(j=0;j<nl;j+) /加密的核心算法for(i=0;i<nl
15、;i+)if(i=keyj)for(k=0;k<m;k+)printf("%c",matrixki);B、解密算法:for(j=0;j<m;j+)/解密的关键算法,外层循环代表列for(k=0;k<nl;k+)for(i=0;i<nl;i+)/此层循环代表行if(keyi=k)/按key标识的数字从小到大打印 printf("%c",matrixij);elsecontinue;五、流加密法RC4流程图: 代码设计: RC4密码的每个输出都是数组S中的一个随机元素,因此就需要两个处理过程:一个是密钥调度算法(KSA),用来设置S的
16、初始排列;一个是伪随机生成算法(PRGA),用来选取随机元素并修改S的原始排序顺序。 KSA开始初始化S,即S(i)=I(其中I=0255)。通过选取一系列数字,并加载到密钥数组K(0)K(255)。数组S可以利用一下程序来实现随机化: a=strlen ( m_mingwen); for(i=0;i<=255;i+) Si=i; Ti=m_keyi%kenlen; for(i=0;i<=255;i+) j=(j+Si+Ti)%256; n=Si; Si=Sj; Sj=n; 一旦KSA完成了S的初始随机化,PRGA就将接手工作,拓为密钥流选取字节,即从S中选取随机元素,并修改S一遍
17、下次选取。选取过程取决与索引i和j,这两个索引值都是从0开始的。从而进行了加密。解密过程即将密文重新加密一次,就可以获得明文。调试时出现的问题:在进行数组间数字互换时,没有真正的互换,检查发现数组传递时,没有用指针传递,因此导致互换失败。六、公钥加密法RSA程序流程图: 代码设计: RSA是基于指数加密概念的,指数加密就是用乘法来生成密钥的。其过程是首先将明文字符转换成数字,将明文字符的ASCII2进制表示转换成相等的证书,计算除明文整数值的e次幂,再对n取模,即可计算出密文。RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100个十进制位)的函数。据猜测,从一个密钥和密文推断
18、出明文的难度等同于分解两个大素数的积。 密钥对的产生。选择两个大素数,p 和q 。计算: n = p * q 然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。最后,利用Euclid 算法计算解密密钥d, 满足 e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) ) 其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。 加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,., mi ,块长s,其中 2s <= n, s 尽可能的大。对应的密文是: ci = mie
19、( mod n ) ( a ) 解密时作如下计算: mi = cid ( mod n ) ( b ) 主要函数:int candp(int a,int b,int c) int r=1; b=b+1; while(b!=1) r=r*a; r=r%c; b-; return r;解密时解密方用私钥对密文进行解密即能得到明文。调试出现的问题:首先实现的是输入一个数字输出一个加密后的数字,当实现对多个数字进行加密时只加密了第一个数字,后来发现是粗心把输入数组的语句写错了。改正后成功。七、块加密法 DES 原理:DES对64(bit)位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明
20、文分成左半部分和右半部分m0=(L0,R0),各32位长。然后进行16轮完全相同的运算,这些运算被称为函数f,在运算过程中数据与密匙结合。经过16轮后,左,右半部分合在一起经过一个末置换,这样就完成了加密。 在每一轮中,密匙位移位,然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的32位数据,在将其置换换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次。 加密和解密使用相同的算法。DES加密和解密唯一的不同是密匙的次序相反。如果
21、各轮加密密匙分别是K1,K2,K3.K16那么解密密匙就是K16,K15,K14K1。流程图:代码设计:加解密主函数void DES(char Out8, char In8, const PSubKey pSubKey, bool Type) static bool M64, tmp32, *Li=&M0, *Ri=&M32; ByteToBit(M, In, 64);/把字节转换成位数据 Transform(M, M, IP_Table, 64);/转换函数,通过指定的置换表进行数据置换 if( Type = ENCRYPT )/进行16轮迭代进行加密 for(int i=0
22、; i<16; +i) memcpy(tmp, Ri, 32); F_func(Ri, (*pSubKey)i); Xor(Ri, Li, 32);/异或运算 memcpy(Li, tmp, 32); else/进行16轮逆迭代进行解密 for(int i=15; i>=0; -i) memcpy(tmp, Li, 32); F_func(Li, (*pSubKey)i); Xor(Li, Ri, 32); memcpy(Ri, tmp, 32); Transform(M, M, IPR_Table, 64);/置换 BitToByte(Out, M, 64);/把位数据转换为字节
23、数据对密钥的操作void SetSubKey(PSubKey pSubKey, const char Key8) static bool K64, *KL=&K0, *KR=&K28; /把字节转化成位数据ByteToBit(K, Key, 64);/通过PC-1置换选择表进行置换 Transform(K, K, PC1_Table, 56); /进行16轮的迭代for(int i=0; i<16; +i) /对左部的28位进行 左循环 RotateL(KL, 28, LOOP_Tablei); /对右部的28位进行 左循环 RotateL(KR, 28, LOOP_Ta
24、blei); /根据 PC-2置换选择表进行置换 Transform(*pSubKey)i, K, PC2_Table, 48); 8、 DH密钥交换过程原理:以Alice和Bob通信为例Alice和Bob必须首先共享两个数:p为一个大素数;g为一个小于p的随机数。Alice选择一个保密的随机数a,并将值发送给Bob。与此同时,Bob选择一个保密的随机数b,并将值发送给Alice。Alice使用自己的保密随机数和Bob发送给她的值计算下式: Bob使用自己的保密随机数和Alice发送给她的值计算下式: DH密钥交换的特点:(1)通信的双方都不关心最终的密钥到底是什么;(2)通信的双方相互之间都
25、不分享他们各自的保密数;(3)第三方能够得到g、p以及值和,而第三方得到k的唯一方法是计算出a和b,这个问题等价于离散对数的问题。流程图:代码设计:主要是设计好一个数的次幂模另外一个数的计算。比如计算,初始s=1.for(i=0;i<a;i+)s=s*g;/每计算一步都要算出模的值,这样会提高计算效率,s=s%p;/同时对各个数的取值也更宽泛调试出现的问题: 一开始总是出现结果是负数的情况,而且最后计算的key值不一致。原因是数的取值太大,出现益处。而且算法没设计好,导致取数受到很大限制。一开始计算数的幂模另一个数时,是先计算幂,结果会得出很大的数,很容易导致溢出。修改算法为每计算一步都
26、对数取模,这样就扩大了数的取值范围。而且计算更合理。Socket编程原理: 套接口有三种类型:流式(面向连接)套接口,数据报(无连接)套接口和原始(IP)套接口。 流式套接口定义了一种可靠的、面向连接的服务,实现了无差错、无重复的顺序数据传输。数据报套接口定义了一种无连接的服务,数据报套接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,不保证可靠、无差错。原始套接口允许对底层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。 无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。 流式套接口的工作原理如下图所示。工作过程
27、如下:服务器首先启动,通过调用Socket()建立一个套接口,指定所要求的通信协议的类型,然后调用Bind()将该套接口和本地网络地址联系在一起,再调用Listen()使套接口做好侦听的准备,并规定它的请求队列长度,之后就调用Accept()来接受自客户端的连接请求。客户在建立套接口后就可调用Connect()和服务器连接。连接一旦建立,客户机和服务器之间就可以通过调用Recv()和Send()来发送和接收数据。最后,待数据传送结束后,双方调用Close()关闭套接口。流程图:代码设计:BOOL CChatDlg:InitSocket()m_socket=socket(AF_INET,SOCK
28、_DGRAM,0);/创建Socketif(INVALID_SOCKET=m_socket)MessageBox("套接字创建失败!");return FALSE;SOCKADDR_IN addrSock;addrSock.sin_family=AF_INET;/设置地址簇addrSock.sin_port=htons(6000);/设置端口号addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/获取本机IPint retval;retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR);/绑定if(SOCKET_ERROR=retval)closesocket(m_socket);MessageBox("绑定失败!&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 营销渠道管理课程设计
- 竹编研学单元课程设计
- 成本控制制度管理办法(2篇)
- 二零二五年度智慧城市建设合伙经营收益分成合同3篇
- 2025年导购员年终工作总结(2篇)
- 二零二五年度出租车驾驶员权益保障承包协议3篇
- 2025年绿化工作管理制度样本(2篇)
- 课程设计坐标图
- 二零二五年度家庭别墅专业保洁外包服务协议
- 2025年学校卫生室工作计划例文(2篇)
- GB/T 35199-2017土方机械轮胎式装载机技术条件
- GB/T 28591-2012风力等级
- GB/T 14864-2013实心聚乙烯绝缘柔软射频电缆
- 思博安根测仪热凝牙胶尖-说明书
- 信息学奥赛-计算机基础知识(完整版)资料
- 数字信号处理(课件)
- 出院小结模板
- HITACHI (日立)存储操作说明书
- (新版教材)苏教版二年级下册科学全册教案(教学设计)
- 61850基础技术介绍0001
- 电镜基本知识培训
评论
0/150
提交评论