RSA加解密实验报告.doc_第1页
RSA加解密实验报告.doc_第2页
RSA加解密实验报告.doc_第3页
RSA加解密实验报告.doc_第4页
RSA加解密实验报告.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、 实践目的与意义(1)通过实践使信息安全专业学生加深对密码学基本原理和加解密理论知识的理解。(2)培养学生在计算机上实现不同类型加密、解密操作运算功能的能力。利用实现的典型加解密方法对输入明文或文件实施加密,并对密文或文件进行解密。能够实现基本的密钥分配方法。(3)培养学生具备简单网络程序开发能力,能够在两个联网终端间进行消息加解密操作。(4)通过参与信息加解密实践,提高学生的分析设计能力、开发过程的团队合作能力、组织管理能力和语言表达能力。二、 实践环境操作系统:win7 x64开发工具:VS2013上机地点:信息楼机房三、 项目组分工在组内,我负责RSA加解密部分的程序编辑和调试四、 系统设计功能设计:单机:用户输入明文和两个素数用作密钥,程序输出密文;输入密文和两个密钥,程序输出明文双机:服务器端输入MAC地址后开始运行,用户向服务器端发送明文和两个作为密钥的素数,服务器端向客户端传送密文;用户向服务器发送密文和两个密钥,服务器端向客户端输出明文算法设计:读取用户输入的两个密钥p和q,计算(p-1)*(q-1)的值,记为t,再任取一个与t互素的数,记为n,计算nx=1(modt)中x的值,an(modpq)为加密,得到密文b;bx(mod253)为解密,得到明文a。界面交互设计:使用组内统一的加解密界面模板,具体界面设计见程序运行截图五、 系统实现程序及界面运行截图:双机加解密:单机加解密:程序代码及注释:头文件:#pragma onceclass RSApublic:RSA();RSA();static CString Encrpt(CString plaintext, int key);static CString Decrypt(CString ciphertext, int key); CString encrpt(CString plaintext, int key);CString decrypt(CString ciphertext, int key);int prime(int m);int gcd(int x, int y);int ExtendedEuclidean(int a, int b, int *r);int power(int a);int mod(int f, int g, int h);主程序:#include stdafx.h#include RSA.hRSA:RSA()RSA:RSA()int RSA:prime(int m) /判断是否为素数int i;for (i = 2; i= b)x3 = a;y3 = b;elsex3 = b;y3 = a;while (1)c = x3 / y3;t1 = x1 - c*y1;t2 = x2 - c*y2;x1 = y1;x2 = y2;t3 = x3 - c*y3;x3 = y3;y1 = t1;y2 = t2;y3 = t3;if (y3 = 1)*r = y2;return 1;int RSA:power(int a) /2的a次幂int b = 1, i;for (i = 1; i = a; i+)b = b * 2;return b;int RSA:mod(int f, int g, int h) /加解密int i;ints = 1;for (i = 1; i = g; i+)s = s*f;s = s%h;return s;CString RSA:encrpt(CString plaintext, int key)CString ciphertext;int i, j, b, a, sum, k;int t, temp, l = 0, ch = 1, f, l1;int p, q, n, y, e, d = 0;int num200;char plain100;int plain1100, cipher100, al10000, bl10000;/printf(请输入第一个大素数p:); /输入两个大素数p,qwhile (1)/scanf(%d, &p);p = 519817;if (prime(p) = 1)break;elseprintf(p不是素数,请重新输入:);/printf(请输入第二个大素数q:);while (1)/scanf(%d, &q);q = 521887;if (prime(q) = 1)break;elseprintf(q不是素数,请重新输入:);n = p*q;y = (p - 1)*(q - 1);/printf(n = %d y = %dn, n, y);/printf(请输入一个整数e:); /输入与y互素的整数ewhile (1)/scanf(%d, &e);e = key;if (gcd(e, y) = 1)break;else/printf(e不符合条件,请重新输入:);AfxMessageBox(Le不符合条件,请重新输入);ExtendedEuclidean(e, y, &d); /计算d/printf(d = %dn, d);/printf(公钥:( %d , %d )n, e, n);/printf(私钥:( %d , %d )n, d, n);while (chn)/明文分块ch = ch * 2;l+;l = l - 1; /每块长度/printf(%dn, l);/printf(请选择:1.加密; 2.解密;n);/scanf(%d, &b);b = 1;if (b = 1) /加密/printf(请输入明文:);/scanf(%s, &plain);int ii;for ( ii = 0; ii plaintext.GetLength(); ii+)plainii = plaintextii;plainii = 0;t = strlen(plain);/*明文信息数字化*/for (i = 0; it; i+) /转换为二进制j = 6;temp = plaini;while (temp != 0)ali * 8 + j + 1 = temp % 2;temp = temp / 2;j-;ali * 8 = 0;if (t * 8 % l = 0) /转为十进制f = t * 8 / l;for (i = 0; if; i+)sum = 0;for (j = 0; jl; j+)sum = sum + alj + i*f * power(l - 1 - j);numi = sum;/printf(%d , numi);CString tmp;tmp.Format(_T(%d), numi);ciphertext += tmp;/printf(n);elsef = t * 8 / l + 1;l1 = t * 8 % l;for (i = 0; if - 1; i+)sum = 0;for (j = 0; jl; j+)sum = sum + alj + i*f * power(l - 1 - j);numi = sum;/printf(%d , numi);CString tmp;tmp.Format(_T(%d), numi);ciphertext += tmp;sum = 0;for (j = 0; jl1; j+)sum = sum + alj + i*l * power(l1 - 1 - j);numf - 1 = sum;/printf(%dn, numf - 1);CString tmp;tmp.Format(_T(%d), numf-1);ciphertext += tmp;for (i = 0; if; i+) /对明文加密cipheri = mod(numi, e, n);/printf(%d , cipheri);CString tmp;tmp.Format(_T(%d), numi);ciphertext += tmp;/printf(n);return ciphertext;CString RSA:decrypt(CString ciphertext, int key)CString plaintext;int i, j, b, a, sum, k;int t, temp, l = 0, ch = 1, f, l1;int p, q, n, y, e, d = 0;int num200;char plain100;int plain1100, cipher100, al10000, bl10000;/printf(请输入第一个大素数p:); /输入两个大素数p,qwhile (1)/scanf(%d, &p);p = 519817;if (prime(p) = 1)break;elseprintf(p不是素数,请重新输入:);/printf(请输入第二个大素数q:);while (1)/scanf(%d, &q);q = 521887;if (prime(q) = 1)break;elseprintf(q不是素数,请重新输入:);n = p*q;y = (p - 1)*(q - 1);/printf(n = %d y = %dn, n, y);/printf(请输入一个整数e:); /输入与y互素的整数ewhile (1)/scanf(%d, &e);e = key;if (gcd(e, y) = 1)break;else/printf(e不符合条件,请重新输入:);AfxMessageBox(Le不符合条件,请重新输入);ExtendedEuclidean(e, y, &d); /计算d/printf(d = %dn, d);/printf(公钥:( %d , %d )n, e, n);/printf(私钥:( %d , %d )n, d, n);while (chn)/明文分块ch = ch * 2;l+;l = l - 1; /每块长度/printf(%dn, l);b = 2;if (b = 2) /解密/printf(请输入密文的个数:);/scanf(%d, &a);a = ciphertext.GetLength();for (i = 0; ia; i+)/printf(请输入第%d个密文数字:, i + 1);/scanf(%d, &cipheri);cipheri = ciphertexti;for (i = 0; ia; i+)numi = mod(cipheri, d, n);/printf(%d , numi);/printf(n);/*数字转换为明文*/for (i = 0; ia; i+) /转化为二进制j = 0;temp = numi;while (temp != 0)blj = temp % 2;temp = temp / 2;j+;while (jl)blj = 0;j+;for (k = 0; kl; k+)alk + l*i = bll - 1 - k;/printf(%d ,alk+l*i);/printf(n);f = a*l / 8;l1 = a*l % 8;for (i = 0; if * 8; i+)bli = ali;if (l1 != 0)for (i = (a - 1)*l; ia*l - l1; i+)bli = ali + l1;for (i = 0; if; i+) /转化为十进制sum = 0;for (j = 0; j8; j+)sum = sum + blj + i * 8 * power(7 - j);plain1i = sum;/printf(%c , plain1i);CString tmp;tmp.Format(_T(%d), numi);plaintext += tmp;/printf(n);return plaintext;CString RSA:Encrpt(CString plaintext, int key)RSA r;CString ciphertext = r.encrpt(plaintext, key);return ciphertext;CString RSA:Decrypt(CString ciphertext, int key)RSA r;CString plaintext = r.decrypt(ciphertext, key);return plaintext;六、 结束语在这次实验课中,我们以分组的方式完成了对自定义数据的单机加密以及多机加密,在整个上机实践过程中,我承担了RSA加密的编程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论