冰河的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机信息安全实验指导书
2009-2010(2)
步山岳
计算机工程系
特别提示
1.在实验报告封面上要正确写上课程名称“计算机信息安全”、班级、学号、姓名。
书写实验报告内容包括:
(1)实验目的与要求;
(2)实验环境;
(3)实验内容与实验步骤(实验步骤、源代码);
(4)实验心得(可以是心得体会、难点讨论、意见建议等)。
2.对实验1和实验3一定要提前预习,充分准备,明确设计思路、编程逻辑和算法过程。3.做实验时要将教材、实验指导书(如果有的话)和实验报告带到实验室,便于学习。4.实验时要及时记录实验过程中所碰到问题和解决方法,并写到实验报告上。
5.每次做实验之前,请先看一下该实验最后“实验说明”,然后在做实验。
6.写实验报告时,除“实验目的与要求”外,“实验环境”要和当前实验室的实验环境相同,对于“实验内容与步骤”内容应该是你真正所做实验的具体内容,做什么就写什么请不要抄实验指导中的“实验内容与步骤”。
实验 1 RSA算法程序设计(4学时)
实验目的
1.掌握公开密钥体制基本原理;
2.熟悉RSA算法过程;
3.提高学生的逻辑思维能力和编程技术。
实验环境
Pentium4 1.4GHz以上 CPU,256M以上内存,10G以上硬盘,安装Windows2000以上操作系统。
实验内容与步骤
1.分析RSA算法
2.设计RSA算法实现流程图
3.用C语言或其他语言实现RSA算法。
4.设计产生素数程序模块
5.设计求最大公约数模块
6.设计求乘逆模块
7.设计选择密钥算法
8.设计主程序实现RSA算法
9.调试程序
实验说明
要按照实验步骤进行实验和编写程序,要按照实验步骤书写实验报告内容。要及时记录实验过程中所碰到问题和解决方法,并写到实验报告上。
附 RSA算法程序
//RSA算法程序
#include
#include
#include
#include
#include
int r,sk,pk,Euler;
primes1(int n1)//判断素数
{ int i,p1,n,sq,sq1;
unsigned short pritab2[10000];
n=3;p1=1;pritab2[0]=2;pritab2[1]=3; do
{n=n+2;sq=(int)sqrt(n);sq1=1,i=0;
while ((pritab2[i]<=sq)&(sq1!=0)) {sq1=pritab2[i];sq1=n%sq1;i++;};
if (sq1!=0) {p1++,pritab2[p1]=n;} }while (n if((n!=n1)){ sq1=0;} return sq1;//判断素数标志 } //欧几里德算法求解最大公约数 int gcd(int a, int b) { //a为初选密钥,b为欧拉函数值 int c,c1,b1; c=b;a=a+1;b1=b; do {a--;c=a;c1=1;b=b1; while(c1!=0)//求解最大公约 { c1=b%c;if (c1!=0){b=c;c=c1;}; } }while(c>1);//最大公约数gcd(a,b)=1 return(a);//返回初选密钥值 } //检查n是否是素数 int check(int n) { int sq1; n=abs(n);sq1=1; do { sq1=primes1(n); if (sq1==0) n=n-1; }while(sq1==0); return n;//返回素数 } void primes() {int p,q; cout<<"输入值不要太大,防止溢出"< p=check(p); cout<<"请输入q:";cin>>q; q=check(q); r=p*q; cout<<"素数 "<<"p="< cout<<" 公开模数:"< int input(int m) {while(m>=r) {cout<<"m 值太大,请再输入编码"; m=abs(m);cin>>m;} return m;//返回编码。 } //使用"平方-乘"算法计算m mod r int pf_c(int m,int k) {int a,i1,a1,b[50]; unsigned long c1; double long c; c=1;c1=1;i1=0; do // 将十进制转换成二进制 { a=(int)ceil(k/2);a1=(k%2); b[i1]=a1;k=a;i1++; }while (a>0); i1--;//"平方-乘"算法 for (int i=i1;i>=0;i--) {c=fmod(c*c,r);if (b[i]==1)c=fmod(c*m,r);} c1=(int)ceil(c); return c1; } //欧几里德扩展算法求解sk*pk≡1mod r void ckey() {int a,c,b1,b2,p,q; cout<<"输入值不要太大,防止溢出"< cout<<"请输入初选密钥:"; cin>>sk;sk++; do {sk--;sk=abs(sk); b1=1,b2=0; sk=gcd(sk,Euler);a=sk;c=Euler; do{q=(int)ceil(c/a);p=c%a; pk=b2-b1*q;c=a;a=p;b2=b1;b1=pk; }while (p!=1);