RSA课程设计

合集下载

RSA加解密的设计与实现 程序+报告

RSA加解密的设计与实现  程序+报告

上海电力学院《应用密码学》课程设计题目:RSA加解密的设计与实现院系:计算机与信息工程学院专业年级:信息安全专业2009252班学生姓名:学号:20093464指导教师:温蜜2011年1月6日目录一、设计要求 (3)二、开发环境与工具 (3)三、设计原理 (3)四、系统功能描述与软件模块划分 (4)五、设计核心代码 (6)六、设计结果及验证 (16)七、软件使用说明 (17)八、参考资料 (18)九、设计体会 (18)一、设计要求1、随机搜索大素数,随机生成公钥和私钥;2、用公钥对任意长度的明文加密;3、用私钥对密文解密;4、界面简洁、交互操作性强。

5、(可选)实现对汉字的加解密,把加密结果存放在文本文档二、开发环境与工具开发环境:win7 64位操作系统开发工具:VC++6.0三、设计原理(算法工作原理)首先设计一个能存放足够大数的类CBigInt ,这个类是把很大的数分解成一个个int 类型的数来i 存储的。

输入你要求的密钥位数,然后用rand ()函数生成一个个32位数,拼接成大数,进行素性检测,是素数就返回,就这样就产生了公钥(e,n)和私钥(d,n),然后利用 公式c=m^e mod n ,得到密文,保存得到的密文到文本文档,再用公式m=c^d mod n ,得到明文。

算法路程图如下:N 开始输入明文输入需要生成的密钥长度 产生随机大数进行拉宾-米勒 素性检测 通过? 加密解密验证结束 Y四、系统功能描述与软件模块划分CBigInt类的功能:class CBigInt{public:unsigned m_nLength;unsigned long m_ulV alue[BI_MAXLEN];CBigInt();~CBigInt();void Mov(unsigned __int64 A);void Mov( CBigInt& A);CBigInt Add( CBigInt& A); //加法CBigInt Sub(CBigInt& A); //减法CBigInt Mul(CBigInt& A); //乘法CBigInt Div(CBigInt& A); //除法CBigInt Mod( CBigInt& A); //模CBigInt Add(unsigned long A);CBigInt Sub(unsigned long A);CBigInt Mul(unsigned long A);CBigInt Div(unsigned long A);void FromString(char *,int len);int ToString(char *);unsigned long Mod(unsigned long A);int Cmp( CBigInt& A);CBigInt ModExp(CBigInt& A, CBigInt& B);CBigInt RsaTrans( CBigInt& A, CBigInt& B);int RabinMiller();CBigInt Euc(CBigInt& A);void GetPrime( unsigned bits);void Put(char *str, unsigned int system) ;void Get(char* str, unsigned int system);friend CBigInt operator +(CBigInt&a,CBigInt&b);friend CBigInt operator -(CBigInt&a,CBigInt&b);friend CBigInt operator *(CBigInt&a,CBigInt&b);friend CBigInt operator /(CBigInt&a,CBigInt&b);friend CBigInt operator %(CBigInt&a,CBigInt&b);CBigInt operator +( unsigned long b);CBigInt operator -( unsigned long b);CBigInt operator *( unsigned long b);CBigInt operator /( unsigned long b);};void Mov( CBigInt& A);void Mov(unsigned __int64 A)是实现大数复制的功能用法为a.Mov(b),就是把大数b赋给a CBigInt Add( CBigInt& A) 实现大数加法功能,用法为a.Add(b),等介于a+b;CBigInt Sub(CBigInt& A)实现大数减法功能,用法为a.Sub(b),等价于a-b;CBigInt Mul(CBigInt& A)实现大数乘法功能,用法为a.Mul(b),等价于a*b;CBigInt Div(CBigInt& A)实现大数除法功能,用法为a.Div(b),等价于a/b;CBigInt Mod( CBigInt& A)实现大数的模功能,用法为a.Mod(b)等价于a%b;void FromString(char *,int len)实现字符型的数转换成大数的功能,用法为a.FromString(m,n),意思是把n位的字符型m赋给大数a;int ToString(char *)实现把大数转变成字符型输出,用法为a.ToString(m),意思是把大数转换成字符型m;int Cmp( CBigInt& A)实现大数比较,用法为C=a.Cmp(b),如果a>b,则c=1,如果a=b则c=0,如果a<b=-1;CBigInt ModExp(CBigInt& A, CBigInt& B)实现大数模幂功能,用法为a=bModExp(c,d),等价于a=b^c mod d;void GetPrime( unsigned bits)获得大素数的函数,用法为a.GetPrime(n),则a获得一个32*bits 位的大素数;void Put(char *str, unsigned int system) 把字符型的转换成10进制或16进制的大数void Get(char* str, unsigned int system)把大数还原成10进制或16进制的字符型变量friend CBigInt operator +(CBigInt&a,CBigInt&b);friend CBigInt operator -(CBigInt&a,CBigInt&b);friend CBigInt operator *(CBigInt&a,CBigInt&b);friend CBigInt operator /(CBigInt&a,CBigInt&b);friend CBigInt operator %(CBigInt&a,CBigInt&b);这些是实现运算符重载的,方便与用户进行大整数的各种运算;class RSA{public:void GetKey(int len,CBigInt &p,CBigInt &q,CBigInt &n,CBigInt &_n,CBigInt &e,CBigInt&d);CBigInt Rsajiami(char* m,int len,CBigInt e,CBigInt n);//加密获得密文void Rsajiemi(CBigInt miwen,CBigInt d,CBigInt n,char *outs);//解密获得明文void Encryption(char* m,int len,CBigInt e,CBigInt n,CBigInt &cipher,RSA rsa);加密void Decryption(CBigInt cipher,CBigInt d,CBigInt n,RSA rsa);解密private:CBigInt p,q,n,_n,e,d;//RSA主要数据};GetKey(int len,CBigInt &p,CBigInt &q,CBigInt &n,CBigInt &_n,CBigInt &e,CBigInt&d)是生成len位的密钥以及p,q,n,_n,的函数Rsajiami(char* m,int len,CBigInt e,CBigInt n)是对明文进行加密,得到二进制密文的操作Rsajiemi(CBigInt miwen,CBigInt d,CBigInt n,char *outs)是对密文进行解密,并把明文转换成char类型的数据Encryption(char* m,int len,CBigInt e,CBigInt n,CBigInt &cipher,RSA rsa)对明文进行加密,并显示所得密文以及加密多用时间Decryption(CBigInt cipher,CBigInt d,CBigInt n,RSA rsa)对密文进行解密,并显示所得明文以及解密时间进行输出五、设计核心代码Cmp(CBigInt& A){if(m_nLength>A.m_nLength)return 1;if(m_nLength<A.m_nLength)return -1;for(int i=m_nLength-1;i>=0;i--){if(m_ulV alue[i]>A.m_ulV alue[i])return 1;if(m_ulV alue[i]<A.m_ulV alue[i])return -1;}return 0;}这个函数实现了大数的比较,如果a的长度小于b,那么a<b,如果a的长度大于b,那么a>b,如果ab的长度相等,那么,我们就从他们的高位开始比较,谁的高位比较大,那么谁就大。

密码学实验-RSA加密算法

密码学实验-RSA加密算法

密码学平时实验报告一、课题内容和要求1.实验环境实验主机操作系统为Windows 72.实验内容1.给定p,q,e,编写RSA的加解密算法2.调研各个语言的加密算法包二、课题需求分析RSA算法的具体描述如下:(1)任意选取两个不同的大素数p和q计算乘积n = p×q,φ(n) = (p-1)×(q-1)。

(2)任意选取一个大整数e,满足,整数e用做加密钥(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用);(3)确定的解密钥d,满足d*e ≡ 1mod φ(n),d为e的乘法逆元(4)公开整数n和e,秘密保存d ;(5)将明文m(m<n是一个整数)加密成密文c,加密算法为C = M^e (mod n)(6)将密文c解密为明文m,解密算法为M = C^d (mod n)然而只根据n和e(注意:不是p和q)要计算出d是不可能的。

因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。

具体的,求逆元采用扩展欧几里德算法和费马小定理+快速幂取模算法结合。

(后者要求模逆元的模为素数,这里φ(n) = (p-1)×(q-1)不适用,但我还是加上了)。

判断是否为质数采用了埃氏筛算法。

1.所谓扩展欧几里德算法,就在求gcd(a,b)的同时,顺带着求出x,y使贝祖等式ax+by= gcd(a,b)成立。

在求模逆元a*x=1 modb时,将原式化为ax+by=1= gcd(a,b)。

运用扩展欧几里德算法即可求出a的模b逆元x。

2.所谓费马小定理/欧拉定理求逆元,就是费马小定理:若p为素数,则有ap−1≡1(modp)ap−1≡1(modp)ap−2∗a≡1(modp)ap−2∗a≡1(modp)ap−2ap−2就是a在mod p意义下的逆元啦。

欧拉定理:若a、p互素,则有aφ(p)≡1(modp)aφ(p)≡1(modp)(费马小定理的一般形式)aφ(p)∗a≡1(modp)aφ(p)∗a≡1(modp)aφ(p)−1aφ(p)−1就是a在mod p意义下的逆元啦。

C语言课程设计(RSA加密算法)报告

C语言课程设计(RSA加密算法)报告

C语言课程设计一、设计内容RSA加密算法二、设计目的1)通过完成具有一定难度的题目,使自己能够将课本上的理论知识和具体问题有机地结合起来,锻炼自己分析问题、解决问题的能力,提高编程能力;2)通过完成一些需要查阅相关资料才能做的题目,提高自己的自学习能力和创新能力。

三、设计思路(包括所用的函数)RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表:主函数实现求n的欧拉数, 由公钥求解私钥, 加密解密选择以及相应的密文明文输出。

candp 实现加密解密时的求幂取余运算,子函数fun 实现e 与t 的互素判断,以验证e 是否符合要求prime实现一个素数的判断,以验证输入的数是否为素数四、程序代码#include <stdio.h>#include <math.h>void main(){int candp(int a,int b,int c);//函数声明int fun(int x,int y);//函数声明int prime(int m);//函数声明int p;int q;int e;int d;int m;int n;int t;int c;int r;printf("请输入两个素数p,q: ");scanf("%d,%d",&p,&q);for(;p>0,q>0;)//for循环判断p和q是否同时为素数{if(prime(p)&&prime(q)){break;}elseprintf("输入有误,请重新输入:");scanf("%d,%d",&p,&q);}n=p*q;printf("计算得n为%d\n",n);t=(p-1)*(q-1); //求n 的欧拉数printf("计算得t为%d\n",t);printf("请输入一个与t互素的数,即公钥e: ");scanf("%d",&e);for(;e>1,e<t;){if(e<=1||e>=t||fun(e,t)){printf("e不合要求,请重新输入: ");//e<1 或e>t 或e 与t 不互素时,重新输入scanf("%d",&e);}elsebreak;}d=1;while(((e*d)%t)!=1)d++; //由公钥e 求出私钥dprintf("经计算d 为%d\n",d);printf("加密请输入1\n"); //加密或解密选择printf("解密请输入2\n");scanf("%d",&r);switch(r){case 1: printf("请输入明文m: "); //输入要加密的明文数字scanf("%d",&m);c=candp(m,e,n);printf("密文为%d\n",c);break;case 2: printf("请输入密文c: "); //输入要解密的密文数字scanf("%d",&c);m=candp(c,d,n);printf("明文为%d\n",m);break;}}int candp(int a,int b,int c)//数据处理函数,实现幂的取余运算{int z;z=1;b=b+1;while(b!=1){z=z*a;z=z%c;b--;}printf("%d\n",z);return z;}int fun(int x,int y) //公钥e 与t 的互素判断{int s;while(y){s=x;x=y;y=s%y;}if(x == 1)return 0; //x 与y 互素时返回0 elsereturn 1; //x 与y 不互素时返回1}int prime(int m)//判断一个数是否为素数{int i;int n;if(m==1)return 0;n=(int)sqrt(m);for(i=2;i<=n;i++)if(m%i==0)return 0;elsereturn 1;}五、运行结果当P=43, q=59 时,对134 进行加密,运行结果如下:六、分析与讨论从对RSA算法的一无所知到现在运行处的结果,中间经过查询各种资料,我们的努力还是有收获的,运行结果基本上还令人满意。

RSA加密解密的设计与实现

RSA加密解密的设计与实现

RSA加密解密的设计与实现上海电力学院《应用密码学》课程设计题目: RSA加密解密的设计与实现院系:计算机科学与技术学院专业年级: 2010级学生姓名:李正熹学号: 20103273指导教师:田秀霞2013年1月 8日目录目录1.设计要求2.开发环境与工具3.设计原理(算法工作原理)4.系统功能描述与软件模块划分5.设计核心代码6.参考文献7. 设计结果及验证8. 软件使用说明9. 设计体会附录1.设计要求1 随机搜索大素数,随机生成公钥和私钥2 用公钥对任意长度的明文加密3 用私钥对密文解密4 界面简洁、交互操作性强2.开发环境与工具Windows XP操作系统Microsoft Visual C++ 6.01.创建rsa工程3.系统功能描述与软件模块划分功能:1.进行加密加密第一步,随机两个素数p和q,并求出n = p*q,然后再求出n的欧拉函数值phi。

第二步,在[e,phi]中选出一个与phi互素的整数e,并根据e*d ≡1(mod phi),求出e的乘法逆元。

至此我们已经得到了公开密钥{e,n}和秘密密钥{d,n}。

第三步,让用户输入要进行加密的小于n一组正整数(个数不超过MAXLENGTH),输入以-1为结束标志,实际个数存入size中,正整数以clear[MAXLENGTH]保存。

第四步,对第三步所得的明文clear[MAXLENGTH]进行加密。

遍历clear[size],对每一个整数用以下算法进行加密,并将加密后的密文保存在Ciphertext[MAXLENGTH]中。

第五步,输出密文Ciphertext[MAXLENGTH]2.进行解密第一步,输入加密后的密文Ciphertext1[MAXLENGTH],输入以-1为结束标志第二步,输入解密密钥[d,phi],对密文进行解密,结果保存在DecryptionText[MAXLENGTH]中。

第三步,输出解密后明文DecryptionText[MAXLENGTH]生成随机素数:先生成一个随机数然后判断它是否为素数从而输出unsigned long foo() //生成随机数int panduan(unsigned long b) //判断是否为素数unsigned long tiqu(unsigned long &p,unsigned long &q) //从随机素数中选取两个为p和q求e时需要用到e与phi的互逆所以在随机产生e的同时需要作互逆判断若互逆则输出随机e 否则重新生成eint gcd(int x,int y) //判断两数是否为互素在p、q、e都准备就绪的时候就可以进行加解密的运算因为考虑到溢出所以3个一组进行加解密void Encryption() //加密算法void Decryption() //解密算法4.设计核心代码unsigned long foo(){unsigned long random = 0;srand((int)time(0));random = rand() % 300;return random;}srand函数是随机数发生器的初始化函数需要提供一个种子这里使用time来获取系统当前时间rand() % 300是随机0-299的整数//以下为加密算法void Encryption(){//加密算法cout << "随机生成两个较大的素数:"<<endl ;tiqu(p,q);n = p * q;//求解 n,phi = (p - 1) * ( q - 1 );//求解 n 的欧拉函数值cout << " n = " << n << ", phi = " << phi << endl;cout << " 请从[0," << phi - 1 << "]中选择一个与 " << phi << " 随机生成互素的数 e:";while(1){e=foo();if(gcd(e,phi)==1&&e>=100&&e<=300&&e!=q&&e!=p)break;}cout<<e<<endl;float d0;for( int i = 1; ; i++){///求解乘法逆元 e * d ≡ 1 (mod phi)d0 = (float)(phi*i+1) / e;if( d0 - (int)d0 == 0 )break;}d = (int)d0;cout << endl;cout << " e = " << e << ", d = " << d << endl;cout << " 公开密钥 Pk = {e,n} = {" << e << "," << n << "}" << endl;cout << " 秘密密钥 Sk = {d,n} = {" << d << "," << n << "}" <<"记录私钥"<< endl;cout << endl;cout << " 请3位一组输入要加密的正整数(以-1结束):" << endl;cout << " 加密前的明文为:";for( i = 0; i < MAXLENGTH; i++)Ciphertext[i] = 1;int count;for(int j = 0; j<MAXLENGTH; j++){cin >> clear[j];if( clear[j] == -1 )break;count = e;while(count > 0){//对明文进行加密 Ciphertext =(clear)^ e mod n Ciphertext[j] = (Ciphertext[j] * clear[j]) % n; //加密算法count-- ;}}cout << " 密文为:" ;size = j;//实际密文长度for(int k=0; k<j; k ++)cout << Ciphertext[k] << " ";cout << endl ;}//以下为解密算法void Decryption(){//解密算法int pp,kk;for(int i = 0; i < MAXLENGTH; i++)DecryptionText[i] = 1;int count;cout<<"请输入要解密的密文(以-1结束):"<<endl;for(int u = 0; u<MAXLENGTH; u++){cin >> Ciphertext1[u];if( Ciphertext1[u] == -1 )break;}cout<<"输入密钥解密(d,n)"<<endl;cin>>pp>>kk;for(int j = 0; j < size; j++){count = pp;while(count > 0){//对密文进行解密 DecryptionText =(Ciphertext)^ d (mod n) DecryptionText[j] = ((DecryptionText[j] * Ciphertext1[j]) %kk);count-- ;}}cout << " 解密后的明文为:";for( int k = 0; k < size; k ++)cout << DecryptionText[k] << " ";cout << endl ;}5.参考文献[1]赛迪网.RSA 2010:云安全需急迫解决的安全隐患.旧金山:赛迪网,2010.[2]赛迪网.RSA主席认为云安全成2010安全领域趋势.旧金山:赛迪网,2010.[3]魏晨. 安全风向标:品味RSA 2012信息安全大会.旧金山:赛迪网,2012.[4]四夕.新的安全威胁而前需要新的安全架构.旧金山:赛迪网,2012.[5]王茜.倪建伟,一种基于RSA的加密算法. 重庆大学学报,2005, 28 (1):68-72.[6]周升力.RSA密码算法的研究与改进实现.现代计算机,2008:51-53.[7]管占明. 邓亚娟.RSA加密算法的研究及应用. 科技广场,2009:98- 99.[8]胡向东,魏琴芳等.应用密码学.北京市:电子工业出版社,2008: 114-119.[9]卢开澄.计算机密码学.北京市:清华大学出版社,2002: 73-77[10]史予荣.软件加密技术从入门到精通,北京市:清华大学出版社.2007: 74-77.7.设计结果及验证进行加密得到公钥(113,11021)和私钥(2105,11021)加密明文123 587 114 56 18 9得到密文1453 385 7882 6329 4873 2744输入密文解密得到先前加密的明文123 587 114 56 18 98.软件使用说明1.选择RSA加解密系统功能1为加密 2为解密 0为退出输入其他错误重新输入2.输入1 进行加密过程输入需要加密的明文 3个一组空格空开 -1结束生成密文并且返回主界面2.输入2进行解密输入加密好的密文 -1结束输入密钥 d n解密得到加密前明文解密成功返回主界面9.设计体会RSA课程设计中,包含了加解密的过程,刚开始对做设计的时候,觉得对于RSA的加解密只要套用公式就可以很方便地进行,实现并不是非常困难。

实验一RSA算法实现

实验一RSA算法实现

实验一 RSA算法程序设计一、实验目的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.调试程序四、实验说明1.程序设计说明包括变量定义、模块组成、接口说明、使用方法、运行要求等。

2.实验过程中所碰到问题和解决方法五、实验体会注意事项:1.提前预习,充分准备,明确设计思路、编程逻辑和算法过程。

2.及时记录实验过程中所碰到问题和解决方法,并写到实验报告上。

3.按照要求书写实验报告内容。

4.写实验报告时,“实验环境”要和当前实验室的实验环境相同。

附RSA算法程序#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>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<n1);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<<"输入值不要太大,防止溢出"<<endl; cout<<"请输入p:";cin>>p;p=check(p);cout<<"请输入q:";cin>>q;q=check(q); r=p*q;cout<<"素数 "<<"p="<<p<<" q="<<q;Euler=(p-1)*(q-1);cout<<" 欧拉函数:"<<Euler;cout<<" 公开模数:"<<r<<endl<<endl; }int input(int m){while(m>=r){cout<<"m 值太大,请再输入编码";m=abs(m);cin>>m;}return m;//返回编码。

rsa加密解密课程设计

rsa加密解密课程设计

rsa加密解密课程设计一、教学目标本课程旨在让学生了解和掌握RSA加密解密算法的基本原理和应用方法。

通过本课程的学习,学生应达到以下目标:1.知识目标:a.了解RSA加密算法的历史背景和发展过程。

b.掌握RSA算法的基本原理,包括公钥和私钥的生成、加密和解密过程。

c.理解RSA算法的数学基础,如大数分解、欧拉定理等。

d.熟悉RSA算法在现代通信技术中的应用场景。

2.技能目标:a.能够使用编程语言实现简单的RSA加密和解密功能。

b.能够分析RSA算法的优缺点,并根据实际需求选择合适的加密算法。

c.能够运用RSA算法解决实际问题,如数字签名、安全通信等。

3.情感态度价值观目标:a.培养学生对计算机科学和网络安全领域的兴趣,提高学生主动学习的积极性。

b.使学生认识到信息安全的重要性,增强学生的社会责任感和职业道德。

c.培养学生团队协作、创新思考和解决问题的能力。

二、教学内容本课程的教学内容主要包括以下几个部分:1.RSA加密算法的基本概念和历史背景。

2.RSA算法的数学原理,如大数分解、欧拉定理等。

3.RSA公钥和私钥的生成过程,以及加密和解密方法。

4.RSA算法的应用场景,如数字签名、安全通信等。

5.RSA算法的优缺点分析,以及与其他加密算法的比较。

三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如:1.讲授法:教师讲解RSA加密算法的基本原理、数学基础和应用场景。

2.案例分析法:分析实际案例,让学生了解RSA算法在网络安全领域的应用。

3.实验法:引导学生动手实践,编写程序实现RSA加密和解密功能。

4.讨论法:学生分组讨论,分析RSA算法的优缺点,并提出改进意见。

四、教学资源为了支持教学内容和教学方法的实施,本课程将采用以下教学资源:1.教材:《计算机网络安全技术与应用》。

2.参考书:《密码学导论》、《信息安全原理与实践》。

3.多媒体资料:PPT课件、教学视频、网络资源等。

4.实验设备:计算机、网络设备、编程环境等。

rsa通信加密课程设计

rsa通信加密课程设计

rsa通信加密课程设计一、课程目标知识目标:1. 学生能理解RSA加密算法的基本原理,掌握其数学基础,如质数、模运算、欧拉函数等。

2. 学生能阐述RSA加密和解密的过程,并掌握密钥的生成方法。

3. 学生了解RSA算法在网络安全中的应用,理解公钥和私钥的概念及其在加密通信中的作用。

技能目标:1. 学生能够独立完成质数的判定和欧拉函数的计算。

2. 学生能够运用所学知识生成RSA加密的公钥和私钥,并执行基本的加密和解密操作。

3. 学生通过实际案例分析和问题解决,培养将理论知识应用于实践的能力。

情感态度价值观目标:1. 学生培养对网络安全的兴趣,认识到信息安全的重要性,增强保护个人隐私和数据安全的意识。

2. 学生通过小组合作学习,培养团队协作精神和沟通能力。

3. 学生在学习过程中,能够体验数学在现实生活中的应用,激发对数学学科的学习热情。

课程性质分析:本课程属于信息技术与数学跨学科的内容,结合了数学的逻辑推理和计算机的算法应用。

学生特点分析:考虑到学生为高中生,具备一定的数学基础和逻辑思维能力,对新鲜事物充满好奇心,适合开展理论与实践相结合的教学。

教学要求:通过课程学习,学生应能将数学知识与信息技术结合,解决实际问题,同时注重培养学生的实践操作能力和创新思维。

课程目标的具体分解,将确保学生能够达到上述预期学习成果,并在教学设计和评估中得以体现。

二、教学内容1. 引言:介绍加密通信的背景,引出RSA加密算法的重要性及其在现实生活中的应用。

2. 理论基础:- 质数的概念、判定方法及其在RSA算法中的作用。

- 模运算的基本原理及其在RSA算法中的应用。

- 欧拉函数的定义、性质及其计算方法。

3. RSA加密算法:- RSA算法的基本原理和数学依据。

- 公钥和私钥的生成方法。

- 加密和解密过程的具体步骤。

4. 实践操作:- 使用教材提供的工具或软件,进行质数判定、欧拉函数计算等操作。

- 演示公钥和私钥的生成过程,并利用它们进行加密和解密。

rsa算法课程设计

rsa算法课程设计

rsa算法课程设计一、课程目标知识目标:1. 学生能理解RSA算法的基本原理,掌握公钥、私钥的生成方法和加密、解密过程。

2. 学生能运用数学知识,解释RSA算法中素数、模数、欧拉函数等关键概念的作用。

3. 学生了解RSA算法在信息安全领域的应用和重要性。

技能目标:1. 学生能够独立完成公钥、私钥的生成,并运用RSA算法进行简单的加密和解密操作。

2. 学生通过编程实践,掌握使用编程语言实现RSA算法的基本方法。

3. 学生能够运用所学知识,分析和解决与RSA算法相关的问题。

情感态度价值观目标:1. 学生对信息安全产生兴趣,认识到保护数据安全的重要性,树立安全意识。

2. 学生在团队合作中培养沟通、协作能力,增强解决问题的自信心。

3. 学生通过学习RSA算法,认识到数学知识在实际生活中的应用价值,激发学习数学的兴趣。

课程性质:本课程为信息技术与数学跨学科课程,结合编程实践,旨在培养学生运用数学知识解决实际问题的能力。

学生特点:学生为高中生,具有一定的数学基础、编程兴趣和信息安全意识。

教学要求:注重理论与实践相结合,鼓励学生动手实践,培养创新意识和解决问题的能力。

将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 理论知识:- RSA算法基本概念:公钥、私钥、加密、解密。

- 素数、模数、欧拉函数在RSA算法中的作用。

- RSA算法的安全性和应用场景。

2. 实践操作:- 公钥、私钥的生成方法。

- RSA算法加密和解密过程。

- 使用编程语言实现RSA算法。

3. 教学大纲:- 第一课时:介绍RSA算法基本概念,解释公钥、私钥的作用。

- 第二课时:学习素数、模数、欧拉函数等关键概念,探讨其在RSA算法中的应用。

- 第三课时:实践操作,学生独立完成公钥、私钥的生成。

- 第四课时:学习RSA算法的加密和解密过程,并进行编程实践。

- 第五课时:总结RSA算法的安全性、应用场景,拓展相关知识。

4. 教材章节:- 《信息技术》第十章:密码学基础。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈尔滨理工大学课程设计题目:RSA加密算法院、系:计算机科学与技术学院网络工程系班级:学号:姓名:同组成员:指导教师:成绩:2014年06月27日一.系统设计的目标通过运用RSA加密算法,实现对信息的加密和解密,掌握RSA算法的实现原理以及实现过程。

二.系统原理:RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。

它是一个基于数论的非对称(公开钥)密码体制,是一种分组密码体制。

其名称来自于三个发明者的姓名首字母。

它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。

RSA系统是公钥系统的最具有典型意义的方法,大多数使用公钥密码进行加密和数字签名的产品和标准使用的都是RSA算法。

RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。

它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。

为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。

该算法基于下面的两个事实,这些事实保证了RSA算法的安全有效性:1)已有确定一个数是不是质数的快速算法;2)尚未找到确定一个合数的质因子的快速算法。

目前,日益激增的电子商务和其它因特网应用需求使公钥体系得以普及,这些需求量主要包括对服务器资源的访问控制和对电子商务交易的保护,以及权利保护、个人隐私、无线交易和内容完整性(如保证新闻报道或股票行情的真实性)等方面。

公钥技术发展到今天,在市场上明显的发展趋势就是PKI与操作系统的集成,PKI是“Public K ey Infrastructure”的缩写,意为“公钥基础设施”。

公钥体制广泛地用于CA认证、数字签名和密钥交换等领域。

公钥加密算法中使用最广的是RSA。

RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。

而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。

目前为止,很多种加密技术采用了RSA 算法,该算法也已经在互联网的许多方面得以广泛应用,包括在安全接口层(SSL)标准(该标准是网络浏览器建立安全的互联网连接时必须用到的)方面的应用。

此外,RS A加密系统还可应用于智能IC卡和网络安全产品。

RSA算法的编程思路1)确定密钥的宽度。

2)随机选择两个不同的素数p处q,它们的宽度是密钥宽度的二分之一。

3)计算出p和q的乘积n 。

4)在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e用做加密密钥(其中Φ(n)=(p-1)*(q-1))。

5)从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。

6)得公钥(e ,n ), 私钥 (d , n) 。

7)公开公钥,但不公开私钥。

8)将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为: C = Pe mod n9) 将密文C解密为明文P,计算方法为: P = Cd mod n 然而只根据n和e(不是p和q)要计算出d是不可能的。

因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密三. 系统功能分析:1.产生密钥首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。

假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。

除此之外这样找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q -1的因子不能太小,否则的话N也可以被很快地分解。

此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。

要求是随机和不可预测。

这两个要求并不相同。

一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。

比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出p和q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。

此外密钥d必须足够大,1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而,那么从N和e可以很有效地推算出d。

此外e = 2永远不应该被使用。

和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。

分配公钥的过程必须能够抵挡一个从中取代的攻击。

假设Eve交给Bob一个公钥,并使Bob相信这是Alice 的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。

Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。

理论上Alice和Bob都不会发现Eve在偷听他们的消息。

今天人们一般用数字认证来防止这样的攻击。

和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。

分配公钥的过程必须能够抵挡一个从中取代的攻击。

假设Eve交给Bob一个公钥,并使Bob相信这是A lice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。

Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。

理论上Alice和Bob都不会发现Eve在偷听他们的消息。

今天人们一般用数字认证来防止这样的攻击。

2.加密RSA用到的公式和定理一、数和互为素数任何大于1的整数a能被因式分解为如下唯一形式:a=p1p2…pl(p1,p2,…,pl为素数)二、模运算①{[a(mod n)]×[b(mod n)]}modn≡(a×b)(mod n)②如果(a×b)=(a×c)(mod n),a与n互素,则b=c(mod n)三、费马定理若p是素数,a与p互素,则a^(p-1)≡1 (mod p)四、欧拉定理欧拉函数φ(n)表示不大于n且与n互素的正整数的个数。

当n是素数,φ(n)=n-1。

n=pq,p,q均为素数时,则φ(n)= φ(p)φ(q)=(p-1)(q-1)。

对于互素的a和n,有a^φ(n)≡1(mod n)用程序实现这一原理既是将待加密信息又ASCII码形式进行运算,得到的结果就是密文。

3.解密解密过程和和加密过程算法原理一样,只是运用了不同的密钥解密,既私钥解密,因此实现原理和加密算法一致。

四.系统实现:1.产生密钥通过建立素数数组1到4000内的,并通过随机数选取数组里两个元素来实现素数p,q的选择;并根据素数因子计算出公钥和私钥;随机数选取同样通过随机数函数srand()实现,由于计算机性能限制,将随机数值限定为1000以内。

rand()函数的使用方法如下:random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。

但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数。

可改用C++下的rand函数来实现。

1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。

RAND_MAX必须至少为32767。

rand()函数不接受参数,默认以1为种子(即起始值)。

随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。

(但这样便于程序调试)2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。

但是如果种子相同,伪随机数列也相同。

一个办法是让用户输入种子,但是仍然不理想。

3、比较理想的是用变化的数,比如时间来作为随机数生成器的种子。

time的值每时每刻都不同。

所以种子不同,所以,产生的随机数也不同。

// C++随机函数(VC program)#include <stdio.h>#include <iostream>#include <time.h>using namespace std;#define MAX 100int main(int argc, char* argv[]){srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面不然要很长时间等待for (int i=0;i<10;i++)cout<<rand()%MAX<<endl;//MAX为最大值,其随机域为0~MAX-1return 0;}二、rand()的用法rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。

/* maximum value returned by "rand" function*/#define RAND_MAX 0x7fffu这个是bcc55中的定义,说明这个整数的最大数是0x7fffu,u代表unicode编码。

这样,如果你要产生0~10的10个整数,可以表达为:int N = rand() % 11;这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样:int N = 1 + rand() % 10;总结来说,可以表示为:a + rand() % n其中的a是起始值,n是整数的范围。

a + rand() % (b-a+1) 就表示a~b之间的一个随机数若要0~1的小数,则可以先取得0~10的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依此类推。

通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。

若要产生每次不同的随机数,可以使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。

如大家所说,还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。

相关文档
最新文档