计算机网络安全实验报告非对称密码算法RSA.docx
- 文档编号:26341837
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:8
- 大小:42.43KB
计算机网络安全实验报告非对称密码算法RSA.docx
《计算机网络安全实验报告非对称密码算法RSA.docx》由会员分享,可在线阅读,更多相关《计算机网络安全实验报告非对称密码算法RSA.docx(8页珍藏版)》请在冰豆网上搜索。
计算机网络安全实验报告非对称密码算法RSA
实验二非对称密码算法RSA
一、实验目的
通过实际编程了解非对称密码算法RSA的加密和解密过程,加深对非对称密码算法的认识。
二、实验环境
运行Windows或Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。
三、实验内容和步骤
1)编写一个程序,随机选择3个较大的数x、e、n,然后计算xemodn,记录程序运行时间。
实际中应用的素数为512位,n也就为1024位。
这样的大数在计算机上如何表示、如何进行运算,查阅资料给出简单说明。
RSA依赖大数运算,目前主流RSA算法都建立在512位到1024位的大数运算之上,所以我们在现阶段首先需要掌握1024位的大数运算原理。
最简单的办法是将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。
但是这样做效率很低,因为1024位的大数其10进制数字个数就有数百个,对于任何一种运算,都需要在两个有数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进位退位标志及中间结果。
当然其优点是算法符合人们的日常习惯,易于理解。
另一种思路是将大数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算,但是这样做代码设计非常复杂,可读性很低,难以理解也难以调试。
(2)计算机在生成一个随机数时,并不一定就是素数,因此要进行素性检测。
是否有确定的方法判定一个大数是素数,要查阅资料,找出目前实际可行的素数判定法则,并且比较各自的优缺点。
所谓素数,是指除了能被1和它本身整除而不能被其他任何数整除的数。
根据素数的定义,只需用2到N-1去除N,如果都除不尽则N是素数,结束知其循环。
由此得算法1。
(1)flay=0,i=2./*flay为标志,其初值为0,只要有一个数除尽,其值变为1.
(2)Ifnmodi=0thenflay=lelsei=i+1/*nmodi是n除以i的余数.
(3)Ifflay=0andI<=n-1then
(2)elsego(4)
(4)Ifflay=0thenwrite“n是素数。
”elsewrite“不是素数”
最坏的情形下,即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)ifnmodithenflag=1elsei=i+1
(3)ifflag=0andi<=int(√n)thengo
(2)elsego(4)
(4)ifflah=0thenwrite”n是素数”elsewrite“n不是素数“。
最坏的情形下,即当N是纱数时1需要执行int(√n)-1次除法。
虽然算法2比算法1确是快了不小,但有重复计算,如果用2去除N时若不尽则用2的倍数去除N也除不尽,于是只要2除不尽,2的倍数就不用去除,这样可以减少除法次数,由此得出算法3
(1)for(i=2;int(√n);i++)mark[i]=0/*mark是标记其初值为0,只要它的因子除不尽其值变为1。
(2)i=2,flag=0
(3)while(flag=0andi<=int(√n)
{Ifmark[i]=0
Then
{Ifnmodi=0
Thenflag=1
Else
S=i+i
Whiles {Mark[s]=1 S=s+i} } }i=i+1 } (4)ifflag=0thenwrite”n是素数。 Elsewrite“N不是素数。 “ 该算法迭代重复次数仍为int(√n)次,但是筛法算法在执行过程中,每次都筛去许多数,使下一次迭代时不用再除法而只做比较,比较比除法运算要简单得多,因此实际执行速度比算法1,算法2要得多。 当然,对于素数的判定还有别的方法,如用概率算法求素数,但其理论太难,一般情况下很少用。 关于素数的判定问题还有待发现简单更高效的方法。 (3)附件中给出了一个密码算法库,其中包括各种对称加密算法、非对称加密算法、Hash算法和数字签名算法。 找出其中关于RSA算法的部分,并且基于标准输入输出写一段用RSA加密文件的程序。 程序代码: #include #include"mycrypt.h" usingnamespacestd; intmain(void) { interr,hash_idx,prng_idx,res; unsignedlongl1,l2; unsignedcharpt2[128],out[1024]; rsa_keykey; /*registerprng/Hash*/ if(register_prng(&sprng_desc)==-1){ printf("Errorregisteringsprng"); returnEXIT_FAILURE; } if(register_hash(&sha1_desc)==-1){ printf("Errorregisteringsha1"); returnEXIT_FAILURE; } hash_idx=find_hash("sha1"); prng_idx=find_prng("sprng"); /*makeanRSA-1024key*/ if((err=rsa_make_key(NULL,/*PRNGstate*/ prng_idx,/*PRNGidx*/ 1024/8,/*1024-bitkey*/ 65537,/*welikee=65537*/ &key)/*wheretostorethekey*/ )! =CRYPT_OK){ printf("rsa_make_key%s",error_to_string(err)); returnEXIT_FAILURE; } FILE*fd1; FILE*fd2; FILE*fd3; fd1=fopen("plaintext1.txt","rb"); fd2=fopen("cipertext.txt","wb"); intcount=0; unsignedcharp_buf[16]; unsignedchartt[]="TestApp"; l1=sizeof(out); while(true) { count=fread(p_buf,sizeof(unsignedchar),16,fd1); for(intj=0;j cout< if((err=rsa_encrypt_key(p_buf,/*datawewishtoencrypt*/ count,/*datais16byteslong*/ out,/*wheretostoreciphertext*/ &l1,/*lengthofciphertext*/ tt,/*ourlparamforthisprogram*/ 7,/*lparamis7byteslong*/ NULL,/*PRNGstate*/ prng_idx,/*pingidx*/ hash_idx,/*Hashidx*/ &key)/*ourRSAkey*/ )! =CRYPT_OK){ printf("rsa_encrypt_key%s",error_to_string(err)); returnEXIT_FAILURE;} fwrite(out,sizeof(unsignedchar),l1,fd2); if(count<16) break; count=0; } fclose(fd1); fclose(fd2); fd2=fopen("cipertext.txt","rb"); fd3=fopen("plaintext2.txt","wb"); unsignedcharc_buf[128]; longl3=sizeof(c_buf); while(true) { count=fread(c_buf,sizeof(unsignedchar),128,fd2); if(count==0) break; l2=sizeof(pt2); if((err=rsa_decrypt_key(c_buf,/*encrypteddata*/ l3,/*lengthofciphertext*/ pt2,/*wheretoputplaintext*/ &l2,/*plaintextlength*/ tt,/*lparamforthisprogram*/ 7,/*lparamis7byteslong*/ NULL,/*PRNGstate*/ prng_idx,/*prngidx*/ hash_idx,/*hashidx*/ &res,/*validityofdata*/ &key)/*ourRSAkey*/ )! =CRYPT_OK){ printf("err=rsa_decrypt_key%s",error_to_string(err)); returnEXIT_FAILURE;} for(intk=0;k cout< fwrite(pt2,sizeof(unsignedchar),l2,fd3); count=0; } fclose(fd2); fclose(fd3); return0; } 程序执行结果如下: 加密前的明文为: 加密后的密文为: 心得体会 对非对称密码算法RSA的理解加深了,会运用一些现成的算法进行编程,对一些比较复杂的算法开始基本认识并深刻的掌握。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 网络安全 实验 报告 对称 密码 算法 RSA