冰河的使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

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);

相关文档
最新文档