




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络安全实验报告课程名称 网络安全 实验名称实验1对称密码算法DES 实验2非对称密码算法RSA学生学院 自动化学院 _专业班级 网络工程 班 学 号 学生姓名 指导教师 曾启杰 2012 年 6月 14 日实验一 对称密码算法DES一、实验目的通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。二、实验环境运行Windows或Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。三、实验内容和步骤(1)对一段不少于1000字节(字符)的明文进行加密和解密,提交软件界面和执行结果。主要的成员变量及函数:class CLab1Dlg : public CDialogint textLength;/ 明文的字节数(=密文的字节数)int fulltextLength;/ 补齐明文块之后的字节数unsigned char key8;/用户输入的密钥unsigned char plaintext2000;/明文存储区unsigned char ciphertext2000;/密文存储区unsigned char plaintext166001;/16进制明文存储区unsigned char ciphertext166001;/16进制密文存储区void encryptOneBlock(unsigned char *pt, unsigned char *ct,des_key *skey);/ 加密一个明文块void decryptOneBlock(unsigned char *ct, unsigned char *pt,des_key *skey);/ 解密一个密文块void getText(CString fromtext, unsigned char * totext, int &textLength);/存储用户输入的明文或密文,返回其首地址和长度(字节数)void encryptAll(unsigned char *pt, unsigned char *ct);/ 加密全部明文void decryptAll(unsigned char *ct, unsigned char *pt);/ 解密全部密文void show16(unsigned char fromtext, unsigned char totext, int length);/转换成16进制程序主要代码:void CLab1Dlg:OnButton1() /加密UpdateData(TRUE);/控件界面显示的数据传到控件变量getText(m_PlainText, plaintext, textLength);/获取编辑框的明文encryptAll(plaintext, ciphertext);/对明文进行加密m_CipherText = ciphertext;show16(plaintext, plaintext16, textLength);show16(ciphertext, ciphertext16, fulltextLength);m_PlainText16 = plaintext16;m_CipherText16 = ciphertext16;UpdateData(FALSE);/控件变量的数据传到控件界面显示void CLab1Dlg:OnButton2() /解密UpdateData(TRUE);/控件界面显示的数据传到控件变量m_CipherText = ciphertext;getText(m_CipherText, ciphertext, textLength);/获取编辑框的密文decryptAll(ciphertext, plaintext);/对密文进行解密m_PlainText = plaintext;show16(plaintext, plaintext16, textLength);show16(ciphertext, ciphertext16, textLength);m_PlainText16 = plaintext16;m_CipherText16 = ciphertext16;UpdateData(FALSE);/控件变量的数据传到控件界面显示void CLab1Dlg:getText(CString fromtext, unsigned char *totext, int &textLength)textLength = fromtext.GetLength();int i;for(i=0;itextLength;i+)totexti = fromtext.GetAt(i);for(i=textLength;i2000;i+)totexti = 0;void CLab1Dlg:encryptAll(unsigned char *pt, unsigned char *ct)des_key skey;unsigned char s8=0,0,0,0,0,0,0,0;for(int j=0;jm_externkey.GetLength();j+)sj = m_externkey.GetAt(j);des_setup(s,8,0,&skey);/生成每轮所需的子密钥int dataBytes = textLength % 8;/最后一个明文块有多少字节的明文数据int i;for(i=0; i=6-dataBytes; i+)/填充最后一个明文块plaintexttextLength+i=0;plaintexttextLength+i = 7 - dataBytes;/最后一个字节表示最后的明文块填充了多少字节的00HfulltextLength = textLength+plaintexttextLength+i+1;/填充最后明文块的明文总长度int t;for(t = 0; ttextLength/8+1;t+)/每8个字节为一组进行加密encryptOneBlock(pt+8*t,ct+8*t,&skey);*(ct+8*t)=0;void CLab1Dlg:encryptOneBlock(unsigned char *pt, unsigned char *ct,des_key *skey)/ 加密一个明文块des_ecb_encrypt(pt,ct,skey);void CLab1Dlg:decryptAll(unsigned char *ct, unsigned char *pt)des_key skey;unsigned char s8=0,0,0,0,0,0,0,0;for(int j=0;jm_externkey.GetLength();j+)sj = m_externkey.GetAt(j);des_setup(s,8,0,&skey);/生成每轮所需的子密钥int t;for(t = 0; t0;i-)*(q-i)=0;*q=0;void CLab1Dlg:decryptOneBlock(unsigned char *pt, unsigned char *ct,des_key *skey)/ 加密一个明文块des_ecb_decrypt(pt,ct,skey);void CLab1Dlg:OnBUTTONsend() /发送密文/ TODO: Add your control notification handler code hereUpdateData(TRUE);CSocket sendsock;sendsock.Create(0, SOCK_DGRAM, NULL);/自动分配源端口号,数据报类型,本机地址struct sockaddr_in destination;/定义一个Internet通信域的套接字地址memset(&destination, 0, sizeof(struct sockaddr_in);/清零destination.sin_family = AF_INET;destination.sin_port = htons( (unsigned short)(m_port) );DWORD sipadd;/32位的IP地址m_ipadd.GetAddress( sipadd );/获得输入的IP地址destination.sin_addr.s_addr = htonl (sipadd);sendsock.SendTo( ciphertext, fulltextLength, (SOCKADDR*)(&destination), sizeof(struct sockaddr_in), 0);sendsock.Close();void CLab1Dlg:OnBUTTONrecv() / TODO: Add your control notification handler code hereUpdateData(TRUE);CSocket recvsock;recvsock.Create(m_port, SOCK_DGRAM, NULL);/分配用户输入的端口号,数据报类型,本机地址struct sockaddr_in source;/定义一个Internet通信域的套接字地址int addrlen = sizeof(struct sockaddr_in);for(int t=0;t2000; t+)ciphertextt = 0;recvsock.ReceiveFrom( ciphertext, 2000, (SOCKADDR*)(&source), &addrlen,0 );DWORD sipadd = ntohl( source.sin_addr.s_addr );/32位的IP地址m_ipadd.SetAddress( sipadd );/获得输入的IP地址m_CipherText = ciphertext;show16(ciphertext, ciphertext16, 200);m_CipherText16 = ciphertext16;UpdateData(FALSE);recvsock.Close();程序执行结果:发送方:接收方:(2)问题回答:对输入的十六进制数加密(把输入的字符转化成整数。例如,输入两个字符1F,转化成二进制数000lllll),比较输入和输出。当把输入的数改变一个bit时(如把1F变为1E),比较输出的变化,说明原因。输入明文为十六进制数4A(二进制数01001010),密钥为Canton,加密后结果如右图:把明文改成十六进制数4B(二进制数01001011),密钥不变,加密后结果如下图:两次输入的明文即使相差1bit,输出的密文仍然是完全不相同。由于明文中的每一位都参与到加密运算中,对密文的每一位都产生作用,因此在同一个明文块(8个字节)中,明文即使改变一丁点数据,对应生成的密文块中的密文都会截然不同。四、心得体会这次试验加深了我对DES的理解加深了,会运用一些现成的算法进行编程,对一些比较复杂的算法开始基本认识并深刻的掌握。在以后所涉及这方面得知识将会有全新的了解和掌握。7一、 实验目的通过实际编程了解非对称密码算法RSA的加密和解密过程,加深对非对称密码算法的认识。二、 实验环境运行Windows或Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。三、 实验内容和步骤1)编写一个程序,随机选择3个较大的数x、e、n,然后计算xe mod n,记录程序运行时间。实际中应用的素数为512位,n也就为1024位。这样的大数在计算机上如何表示、如何进行运算,查阅资料给出简单说明。RSA依赖大数运算,目前主流RSA算法都建立在512位到1024位的大数运算之上,所以我们在现阶段首先需要掌握1024位的大数运算原理。大多数的编译器只能支持到64位的整数运算,即我们在运算中所使用的整数必须小于等于64位,即:0xffffffffffffffff也就是18446744073709551615,这远远达不到RSA的需要,于是需要专门建立大数运算库来解决这一问题。最简单的办法是将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。但是这样做效率很低,因为1024位的大数其10进制数字个数就有数百个,对于任何一种运算,都需要在两个有数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进位退位标志及中间结果。当然其优点是算法符合人们的日常习惯,易于理解。另一种思路是将大数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算,但是这样做代码设计非常复杂,可读性很低,难以理解也难以调试。(2)计算机在生成一个随机数时,并不一定就是素数,因此要进行素性检测。是否有确定的方法判定一个大数是素数,要查阅资料,找出目前实际可行的素数判定法则,并且比较各自的优缺点。所谓素数,是指除了能被1和它本身整除而不能被其他任何数整除的数。根据素数的定义,只需用2到N-1去除N,如果都除不尽则N是素数,结束知其循环。由此得算法1。(1) flay=0,i=2. /*flay为标志,其初值为0,只要有一个数除尽,其值变为1.(2) If n mod i=0 then flay=l else i=i+1/* n mod i是n除以i的余数.(3) If flay=0 and I=n-1 then(2) else go (4)(4) If flay=0 then write“n是素数。”else write“不是素数”最坏的情形下,即N是素数时,算法1需要执行N-2次除法,时间复杂性太大。假设N桶分解成iXj(i,j是小于N的整数),则必存在一个因子(1=i=int(n)),这样只需用2到int(n)去除N即可,于是循环次数可以大减小,由此得出算法2算法2(改进算法)(1) flag=0,i=2(2) if n mod i then flag=1else i=i+1(3) if flag=0 and i=int(n) then go(2) else go(4)(4) if flah=0 then write”n是素数”else write “n不是素数“。最坏的情形下,即当N是纱数时1需要执行int(n)-1次除法。虽然算法2比算法1确是快了不小,但有重复计算,如果用2去除N时若不尽则用2的倍数去除N也除不尽,于是只要2除不尽,2的倍数就不用去除,这样可以减少除法次数,由此得出算法3(1)for(i=2;int(n);i+)marki=0/*mark是标记其初值为0,只要它的因子除不尽其值变为1。(2)i=2,flag=0(3)while(flag=0and i=int(n) If marki=0Then If n mod i=0 Then flag=1 Else S=i+i While sint(n) Marks=1 S=s+ii=i+1(4)if flag=0 then write”n是素数。Else write “N不是素数。“该算法迭代重复次数仍为int(n)次,但是筛法算法在执行过程中,每次都筛去许多数,使下一次迭代时不用再除法而只做比较,比较比除法运算要简单得多,因此实际执行速度比算法1,算法2要得多。当然,对于素数的判定还有别的方法,如用概率算法求素数,但其理论太难,一般情况下很少用。关于素数的判定问题还有待发现简单更高效的方法。(3)附件中给出了一个密码算法库,其中包括各种对称加密算法、非对称加密算法、Hash算法和数字签名算法。找出其中关于RSA算法的部分,并且基于标准输入输出写一段用RSA加密文件的程序。程序代码:#include#include mycrypt.husing namespace std;int main(void)int err, hash_idx, prng_idx, res;unsigned long l1,l2;unsigned char pt2128,out1024;rsa_key key;/* register prng/Hash */if (register_prng(&sprng_desc) =-1) printf(Error registering sprng);return EXIT_FAILURE;if (register_hash(&sha1_desc) =-1) printf(Error registering sha1);return EXIT_FAILURE;hash_idx = find_hash(sha1);prng_idx = find_prng(sprng);/* make an RSA-1024 key */if (err = rsa_make_key(NULL, /* PRNG state */prng_idx,/* PRNG idx */1024/8, /* 1024-bit key */65537,/* we like e=65537 */&key)/* where to store the key */) != CRYPT_OK) printf(rsa_make_key %s, error_to_string(err);return EXIT_FAILURE;FILE *fd1;FILE *fd2;FILE *fd3; fd1=fopen(plaintext1.txt,rb);fd2=fopen(cipertext.txt,wb);int count=0;unsigned char p_buf16;unsigned char tt=TestApp;l1 = sizeof(out);while(true)count=fread(p_buf,sizeof(unsigned char),16,fd1); for(int j=0;jcount;j+)coutp_bufj;if (err = rsa_encrypt_key(p_buf,/* data we wish to encrypt */count,/* data is 16 bytes long */out, /* where to store ciphertext */&l1, /* length of ciphertext */tt,/* our lparam for this program */7,/* lparam is 7 bytes long */NULL,/* PRNG state */prng_idx,/* ping idx */hash_idx,/* Hash idx */&key)/* our RSA key */) != CRYPT_OK) printf(rsa_encrypt_key %s, error_to_string(err);return EXIT_FAILURE;fwrite(out,sizeof(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 店铺临期转让合同范本
- 长期服装销售合同范本
- 围棋教师兼职合同范本
- 承包果园违约合同范本
- 供暖设备改造合同范本
- 网络合作合同范本
- 个人代购合同范本
- 门店面转让合同范本
- 沥青购销合同范本
- 仓库租赁公司合同范本
- GB/T 20671.7-2006非金属垫片材料分类体系及试验方法第7部分:非金属垫片材料拉伸强度试验方法
- GB/T 10781.1-2006浓香型白酒
- 轴孔用YX型密封圈规格尺寸
- 肾上腺疾病外科治疗
- 第9章探放水钻机及相关设备的安全使用.
- 水调歌头·游泳-课件
- 人教版三年级下册体育与健康教案(全册教学设计)
- 交通部农村公路建设标准指导意见
- 卫浴店面管理
- 清表施工方案4常用
- 广西壮族自治区尾矿库注销及小型尾矿库闭库工作指导意见
评论
0/150
提交评论