RSA加密的简易实现要点

RSA加密的简易实现要点
RSA加密的简易实现要点

安全学实验报告

—RSA加密解密的简单实现

华南师范大学赵教授

RSA介绍:

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

RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。

公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。

一.系统总体方案:

1.要求:编写RSA加密解密演示程序,用户自己输入两个素数P,Q以及公钥E,程序判断P,Q为素数后计算得到公钥(e,n),私钥(d,n)并显示。

输入明文密文并可以进行加密解密。

2.数学原理:

1.密钥的生成选择p,q为两个大的互异素数计算n=p*q, ψ(n)=(p-1)(q-1)

选择整数e使gcd(ψ(n),e)=1(互质),(1

计算d,使d=e ?-1(modψ(n))(求乘法逆元)

公钥Pk={e,n};私钥Sk={d,n}。

(定义若a?x mod n =1,则称a与x对于模n互为逆元)

2.加密 (用e,n) 明文 M

3.解密 (用d,n) 对于密文C 由M=C ?d(mod n)得到明文M。

3.实现过程:

1.输入p,q判断为素数,计算n=p*q,ψ(n)=(p-1)(q-1)

2.输入e判断是否与ψ(n)互质,计算d=e ?-1(modψ(n))

3.输出公钥为(e,n)私钥为(d,n)

4.输入明文(数字)M计算密文C=M ? e(mod n)

5.输入密文C计算明文M=C ?d(mod n)

二.设计思路:

1.关键问题:

(1)素数的判断:

首先在输入p,q之后应该有一个函数int sushu()可以判断p,q是否为素数,并返回 1(是)或0(否)。考虑到程序中数据类型为long型,依次用2~√n之间的数去除n,如果能整除则不为素数。该算法时间复杂度为O(√n)。

int sushu(long m)

{int i;

for(i=2;i*i<=m;i++)

if(m%i==0)return 0;

return 1;}

(2)互质的判断:

在输入e之后需要判断e与ψ(n)是否互质,所以用该有判断互质的函数int gcd()返回1(是),其他(否)。根据欧几里德算法

gcd(a,b)=gcd(b,a mod b)

证明:a可以表示成a = kb + r,则r = a mod b

假设d是a,b的一个公约数,则有

d|a, d|b,而r = a - kb,因此d|r

因此d是(b,a mod b)的公约数

假设d 是(b,a mod b)的公约数,则

d | b , d |r ,但是a = kb + r

因此d也是(a,b)的公约数

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等

所以若gcd(a,b)=1 则a与b互质。

int gcd(long a, long b)

{if(b == 0)return a;

return gcd(b, a % b);}

(3)求乘法逆元:

因为需要计算私钥d=e ?-1(modψ(n)),所以有函数long ExtendedEuclid()计算d并返回d的值,这里用到扩展欧几里德算法。大体思路与欧几里德算法一致:如果gcd(a,b)=d,则存在m,n,使得d = ma + nb,称呼这种关系为a、b组合整数d,m,n称为组合系数。当d=1时,有 ma + nb = 1 ,此时可以看出m是a模b的乘法逆元,n是b模a的乘法逆元。

long ExtendedEuclid(long f,long d ,long *result)

{ int x1,x2,x3,y1,y2,y3,t1,t2,t3,q;

x1 = y2 = 1;x2 = y1 = 0;x3 = ( f>=d )?f:d;y3 = ( f>=d )?d:f;

while( 1 ){

if ( y3 == 0 ) { *result = x3; return 0; }

if ( y3 == 1 ) { *result = y2; return 1; }

q = x3/y3; t1 = x1 - q*y1; t2 = x2 - q*y2; t3 = x3 - q*y3;

x1 = y1; x2 = y2; x3 = y3; y1 = t1; y2 = t2; y3 = t3;}

}

(4)快速幂模算法:

在加密解密时都要用到类似A ?B(mod C)的计算,当指数B较大时,如果先计算A ?B 的值时间较慢,且结果过大会溢出。

依据模运算的性质(a*b)mod n=((a mod n)*(b mod n))mod n 可以将A ?B分解为较小几个数的乘积分别进行模运算

例如(3 ^ 999)可以分解为(3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3 这样只要做16次乘法。把999转为2进制数:1111100111,其各位就是要乘的数。

所以程序中要有函数int a_b_Mod_c(long a, long b, long c)计算a ?b mod c的值并返回结果。

int a_b_Mod_c(long a, long b, long c)

{ int digit[32];long i,k,resualt = 1;

i = 0;

while(b)

{ digit[i++] = b%2;

b >>= 1; }

for(k = i-1; k >= 0; k--)

{ resualt=(resualt*resualt)%c;

if(digit[k]==1) { resualt=(resualt*a)%c; }

}

return resualt;

}

2.总操作界面:

1. 输入两个素数P,Q

2. 输入公钥E

3. 查看当前密钥信息

4. 加密

5. 解密

6. 帮助

0. 退出

三.程序实现流程图:(1)流程图:

(2)各功能模块:

四.程序测试:

1输入两个素数p=47,q=71 则n=47*71=3337

2.输入e=79,计算得d=e?-1 mod (p-1)(q-1)=79?-1 mod 3220=1019 因此公钥为(79,3337)私钥为(1019,3337)

3.输入明文 688 并加密

4.输入密文1570 并解密

五.总结、改进思考:

1.大数类库的建立:

本程序作为RSA加密解密过程演示程序,变量均为long型,因此密钥长度较小,而RSA 的安全性建立在密钥长度很长,大素数难以分解的前提上。所以为了能够提高安全性,应该建立一个大数类库,对512位或1024位大数进行存取,及简单运算。

一个最容易理解的方法就是将大数用十进制表示,并将每一位(0 – 9)都做为一个单独的数用数组进行管理。做加减乘除等运算时,人工的对其进行进、借位。然而计算机对于10进制数的处理并不在行,而且表示非2n进制的数会浪费很多空间,所以应该采用8进制、16进制、32进制、64进制的表示法,使得每一位数字都能占据一个完整的内存空间。目前绝大多数PC机都是基于32位运算的,所以采用2 ?32进制表示大数将会很大提高计算机的处理效率。现实中,就使用32位的整数数组进行存储每一位数,另设一个布尔值表示正负。进行计算时常会遇到进位借位的情况,而且常常会超过2 ?32次方,幸好目前的编译器都支持64位整数,可以满足( 232 - 1 ) * ( 232 - 1 )以内的运算,所以使用64位整数作为运算中间量将会是很好的选择。

大数除了加减乘除等基本运算以外,还有一些如赋值、比较、左右移位、或、与等,为了方便使用,我们可以利用面向对象的方法把大数进行封装,并利用C++的特性进行运算符重载,使它成为一个整体对象来进行操作。这样我们就可像使用int一样来使用它了。

2.大素数随机生成,以及判断:

真正的RSA加密时密钥的生成应该是自动完成的,而不是用户手动制定p,q,e。所以在使用大数类库后随之而来一个问题就是如何随机的生成两个大素数,以及大素数的判断。由于素数有无穷多个,且没有固定的生成方式,所以大素数的生成基本是采用在一定范围内(比如奇数,且不会被小素数整除的)随机选取大数后再进行素数检测,直到有通过检测的数。

因此大数的素数检测算法就是关键了,如果按照之前的素数检测算法需要依次除2到√n的数,时间复杂度O(√n)太大。所以我们要用更为快速的算法。

米勒拉宾测试是一个不确定的算法,只能从概率意义上判定一个数可能是素数。是目前公认的最高效的素性测试之一。大体步骤如下: 输入奇数n ,判断n 为素数或者合数。

计算r 和R,使得R n r

21=-,R 奇。

随即选择a,}0{\z

n

a ∈

for i=0 to r ,计算a

b R

i

r 2=。

若)(mod 1n b a r

R

≠=,则输入合数。 若

)(mod 10

n b

a R

≡=,则输入素数。

设j=max{i:

)(mod 1n b i

≠},则输入素数。

)(mod 1n b

j

-≡,则输出素数,否则输出合数。

参考书目:

[1] 刘嘉勇等 《应用密码学》 [2] 胡道元 闵京华《网络安全》

[3]张四兰等 《可信赖的高效素数生成和检验算法》

附 程序代码:

#include #include #include

void input_P_Q(long &P,long &Q,long &N,long &N1); void input_E(long &E,long &D,long n1); void print_miyao(long e,long n,long d); void jiami(long e,long n); void jiemi(long d,long n); void print_help(); int sushu(long m);

int gcd(long a, long b);

long ExtendedEuclid(long f,long d ,long *result);

int a_b_Mod_c(long a, long b, long c);

void main()

{

long P=0,Q=0,E=0,N=0,N1=0,D=0;

cout<<"==========================RSA模拟==========================="<

cout<<" 2. 输入公钥E\n";

cout<<" 3. 查看当前密钥信息\n";

cout<<" 4. 加密\n";

cout<<" 5. 解密\n";

cout<<" 6. 帮助\n";

cout<<" 0. 退出\n";

cout<<"\n 输入你的选择:";

long ch;

do

{ cin>>ch;

switch(ch)

{case 1 : input_P_Q(P,Q,N,N1);break;

case 2 : input_E(E,D,N1);break;

case 3 : print_miyao(E,N,D);break;

case 4 : jiami(E,N);break;

case 5 : jiemi(D,N);break;

case 6 : print_help();break;

case 0 : break;}

}

while(ch);}

int gcd(long a, long b)

{if(b == 0)

return a;

return gcd(b, a % b);}

int sushu(long m)

{ int i;

for(i=2;i*i<=m;i++)

if(m%i==0) return 0;

return 1;}

long ExtendedEuclid(long f,long d ,long *result)

{int x1,x2,x3,y1,y2,y3,t1,t2,t3,q;

x1 = y2 = 1;x2 = y1 = 0;x3 = ( f>=d )?f:d;y3 = ( f>=d )?d:f; while( 1 )

{ if ( y3 == 0 )

{ *result = x3; return 0; }

if ( y3 == 1 )

{ *result = y2; return 1; }

q = x3/y3; t1 = x1 - q*y1; t2 = x2 - q*y2; t3 = x3 - q*y3; x1 = y1; x2 = y2; x3 = y3; y1 = t1; y2 = t2; y3 = t3;}

}

int a_b_Mod_c(long a, long b, long c)

{ int digit[32];long i,k,resualt = 1; i = 0;

while(b)

{ digit[i++] = b%2; b >>= 1; }

for(k = i-1; k >= 0; k--)

{ resualt=(resualt*resualt)%c;

if(digit[k]==1) resualt=(resualt*a)%c; }

return resualt;

}

void input_P_Q(long &P,long &Q,long &N,long &N1)

{ cout<<"输入第一个素数p:\n";

while(1)

{ if (cin>>P) break;

else

{ cout<<"P应为数字,请重新输入:"<

cin.clear(); cin.ignore(); }

}

while(1)

{ if (sushu(P)) break;

else

{ cout<<"P应为素数,请重新输入:"<

cin.clear(); cin.ignore(); }

cin>>P;

}

cout<<"输入第二个素数Q:\n";

while(1)

{ if (cin>>Q) break;

else

{ cout<<"Q应为数字,请重新输入:"<

cin.clear(); cin.ignore(); }

}

while(1)

{ if (sushu(Q)) break;

else

{ cout<<"Q应为素数,请重新输入:"<

cin.clear(); cin.ignore(); }

cin>>Q;

}

N=P*Q;N1=(P-1)*(Q-1);

}

void input_E(long &E,long &D,long n1)

{ if(n1==0)

{cout<<"请先输入两个素数P,Q"<

long z=0;

cout<<"输入一个小于"<

while(1)

{ if (cin>>E) break;

else

{ cout<<"E应为数字,请重新输入:"<

cin.clear(); cin.ignore(); }

}

while(1)

{ if (gcd(E,n1)==1) break;

else

{ cout<<"E应与"<

cin.clear(); cin.ignore(); }

cin>>E;

}

if(ExtendedEuclid(E,n1,&z)) D=z;

else cout<<"错误"<

}

void print_miyao(long e,long n,long d)

{ cout<<"公钥为:\n"; cout<<"("<

cout<<"公钥为:\n"; cout<<"("<

{ if(e==0,n==0)

{cout<<"请先输入密钥"<

long c,m; cout<<"输入要加密的明文:\n";

while(1)

{ if (cin>>m) break;

else

{ cout<<"明文应为数字,请重新输入:"<

cin.clear(); cin.ignore();}

}

while(1)

{ if (m

else

{ cout<<"明文应小于"<

cin.clear(); cin.ignore(); }

}

c=a_b_Mod_c(m,e,n); cout<<"密文为:"<

}

void jiemi(long d,long n)

{ if(d==0,n==0)

{cout<<"请先输入密钥"<

long c,m; cout<<"输入要解密的密文:\n";

while(1)

{ if (cin>>c) break;

else

{ cout<<"密文应为数字,请重新输入:"<

cin.clear(); cin.ignore(); }

}

m=a_b_Mod_c(c,d,n); cout<<"明文为:"<

}

void print_help()

{

cout<<" 1. 输入两个素数P,Q\n";

cout<<" 2. 输入公钥E\n";

cout<<" 3. 查看当前密钥信息\n";

cout<<" 4. 加密\n";

cout<<" 5. 解密\n";

cout<<" 6. 帮助\n";

RSA加密解密的设计与实现

RSA加密解密的设计与实现

上海电力学院 《应用密码学》课程设计 题目: RSA加密解密的设计与实现 院系:计算机科学与技术学院 专业年级:级 学生姓名:李正熹学号: 3273 指导教师:田秀霞 1月 8日 目录

目录 1.设计要求 2.开发环境与工具 3.设计原理(算法工作原理) 4.系统功能描述与软件模块划分 5.设计核心代码 6.参考文献 7. 设计结果及验证 8. 软件使用说明 9. 设计体会 附录 1.设计要求

1 随机搜索大素数,随机生成公钥和私钥 2 用公钥对任意长度的明文加密 3 用私钥对密文解密 4 界面简洁、交互操作性强 2.开发环境与工具 Windows XP操作系统 Microsoft Visual C++ 6.0 1.创立rsa工程

2.在rsa工程中创立 3273 李正熹cpp文件 3.设计原理 RSA算法简介 公开密码算法与其它密码学完全不同,它是基于数学函数而不是基于替换或置换。与使用一个密钥的对称算法不同,公开密钥算法是非对称的,而且它使用的是两个密钥,包括用于加密的公钥和用于解密的私钥。公开密钥算法有RSA、Elgamal等。 RSA公钥密码算法是由美国麻省理工学院(MIT)的Rivest,Shamir和Adleman在1978年提出来的,并以她们的名字的有字母命名的。RSA是第一个安全、实用的公钥密码算法,已经成为公钥密码的国际标准,是当前应用广泛的公钥密码体制。

RSA的基础是数论的Euler定理,其安全性基于二大整数因子分解问题的困难性,公私钥是一对大素数的函数。而且该算法已经经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这不恰恰说明该算法有其一定的可信度。 4.系统功能描述与软件模块划分 功能:

RSA加密算法加密与解密过程解析

RSA加密算法加密与解密过程解析 1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密。 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密。 所谓对称加密即是指在加密和解密时使用的是同一个密钥:举个简单的例子,对一个字符串C做简单的加密处理,对于每个字符都和A做异或,形成密文S。 解密的时候再用密文S和密钥A做异或,还原为原来的字符串C。这种加密方式有一个很大的缺点就是不安全,因为一旦加密用的密钥泄露了之后,就可以用这个密钥破解其他所有的密文。 非对称加密在加密和解密过程中使用不同的密钥,即公钥和私钥。公钥用于加密,所有人都可见,私钥用于解密,只有解密者持有。就算在一次加密过程中原文和密文发生泄漏,破解者在知道原文、密文和公钥的情况下无法推理出私钥,很大程度上保证了数据的安全性。 此处,我们介绍一种非常具有代表性的非对称加密算法,RSA加密算法。RSA 算法是1977年发明的,全称是RSA Public Key System,这个Public Key 就是指的公共密钥。 2.密钥的计算获取过程 密钥的计算过程为:首先选择两个质数p和q,令n=p*q。 令k=?(n)=(p?1)(q?1),原理见4的分析 选择任意整数d,保证其与k互质 取整数e,使得[de]k=[1]k。也就是说de=kt+1,t为某一整数。

3.RSA加密算法的使用过程 同样以一个字符串来进行举例,例如要对字符串the art of programming 进行加密,RSA算法会提供两个公钥e和n,其值为两个正整数,解密方持有一个私钥d,然后开始加密解密过程过程。 1. 首先根据一定的规整将字符串转换为正整数z,例如对应为0到36,转化后形成了一个整数序列。 2. 对于每个字符对应的正整数映射值z,计算其加密值M=(N^e)%n. 其中N^e表示N的e次方。 3. 解密方收到密文后开始解密,计算解密后的值为(M^d)%n,可在此得到正整数z。 4. 根据开始设定的公共转化规则,即可将z转化为对应的字符,获得明文。 4.RSA加密算法原理解析 下面分析其内在的数学原理,说到RSA加密算法就不得不说到欧拉定理。 欧拉定理(Euler’s theorem)是欧拉在证明费马小定理的过程中,发现的一个适用性更广的定理。 首先定义一个函数,叫做欧拉Phi函数,即?(n),其中,n是一个正整数。?(n)=总数(从1到n?1,与n互质整数) 比如5,那么1,2,3,4,都与5互质。与5互质的数有4个。?(5)=4再比如6,与1,5互质,与2,3,4并不互质。因此,?(6)=2

实验四RSA加解密算法的实现

实验四 RSA加解密算法的实现 一.实验目的 1、对算法描述可进行充分理解,精确理解算法的各个步骤。 2、完成RSA软件算法的详细设计。 3、用C++完成算法的设计模块。 4、编制测试代码。 二.实验内容 1.实验原理及基本技术路线图(方框原理图) 加密过程: 第一步,用户首先输入两个素数p和q,并求出 n = p*q,然后再求出n的欧拉函数值phi。 第二步,在[e,phi]中选出一个与phi互素的整数e,并根据e*d ≡1(mod phi),求出e的乘法逆元。至此我们已经得到了公开密钥{e,n}和秘密密钥{d,n}。 第三步,让用户输入要进行加密的小于n一组正整数(个数不超过MAXLENGTH=500),输入以-1为结束标志,实际个数存入size中,正整数以clear[MAXLENGTH]保存。 第四步,对第三步所得的明文clear[MAXLENGTH]进行加密。遍历clear[size],对每一个整数用以下算法进行加密,并将加密后的密文保存在Ciphertext[MAXLENGTH]中。 注意:此处不能用m2[j] = clear[j] ^ e整数的幂,因为当e和clear[j]较大时,会发生溢出,至使出现无法预料的结果。 第五步,输出加密后的密文。 解密过程: 第一步,根据在以上算法中求出的解密密钥[d,phi],对加密后的密文Ciphertext[MAXLENGTH]进行解密,结果保存在DecryptionText[MAXLENGTH]中,算法如下: 第二步,输出对加密前的明文和加密并解密后的密文进行比较,判断两个数组是否一致,从而得知算法是否正确。

2.所用仪器、材料(设备名称、型号、规格等) 计算机一台、vc6.0 3.实验方法、步骤 #include #include using namespace std; #define MAXLENGTH 500 //明文最大长度,即所允许最大整数个数 int size = 0;//保存要进行加密的正整数的个数 int p, q; //两个大素数 int n, phi; //n = p * q,phi = (p-1) * (q-1) 是n的欧拉函数值 int e; //{e, n}为公开密钥 int d; //{d, n}为秘密密钥 int clear[MAXLENGTH], Ciphertext[MAXLENGTH];//分别用于存放加//密前的明//文和加密后的密文int DecryptionText[MAXLENGTH];//存放解密后的明文 //////////////////////////////////////////////////////////// //以下为加密算法 void Encryption() {//加密算法 cout << " 请输入两个较大的素数:" ; cin >> p >> q ; cout << " p = " << p << ", q = " << q << endl; n = p * q;//求解 n, phi = (p - 1) * ( q - 1 );//求解 n 的欧拉函数值 cout << " n = " << n << ", phi = " << phi << endl; cout << " 请从[0," << phi - 1 << "]中选择一个与 " << phi << " 互素的数 e:"; cin >> e; 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;

rsa算法对字符串的加密解密

#include #include /*类型定义*/ typedef long int li_ELEMTYPE; typedef int i_ELEMTYPE; typedef char c_ELEMTYPE; /*宏定义*/ #define TEXT_MAX_NUM 20 #define RSA_ENCODE_TEXT "xidianuniversity" /*RSA编解码函数*/ /* 输入输出说明:r = a^b mod c 编码1.a-------原始加密明文数据 2.b-------加密指数(p-1)(q-1) 3.c-------p*q 4.r-------加密后密文数据 解码1.a-------原始解密密文数据 2.b-------解密指数d 3.c-------p*q 4.r-------解密后明文数据 */ li_ELEMTYPE Rsa_un_enCode(li_ELEMTYPE a,li_ELEMTYPE b,li_ELEMTYPE c) { li_ELEMTYPE r = 1; b = b + 1; while(b != 1) { r = r * a; r = r % c; b--; } return r; } /*main主函数*/ int main(int argc, char **argv) { li_ELEMTYPE p,q,e,d,n,t; i_ELEMTYPE i = 0; i_ELEMTYPE acSecret_Text[TEXT_MAX_NUM]; c_ELEMTYPE acPublic_Text[TEXT_MAX_NUM]; memset(acSecret_Text, 0, sizeof(acSecret_Text));

RSA加解密算法C语言的实现

#include #include #include #include #include #include #define MAX 100 #define LEN sizeof(struct slink) void sub(int a[MAX],int b[MAX] ,int c[MAX] ); struct slink { int bignum[MAX]; /*bignum[98]用来标记正负号,1正,0负bignum[99]来标记实际长度*/ struct slink *next; }; /*/--------------------------------------自己建立的大数运算库-------------------------------------*/ void print( int a[MAX] ) { int i; for(i=0;il2) return 1; if (l1=0;i--) { if (a1[i]>a2[i]) return 1 ; if (a1[i]

密码学-RSA加密解密算法的实现课程设计报告

密码学课程报告《RSA加密解密算法》 专业:信息工程(信息安全) 班级:1132102 学号:201130210214 姓名:周林 指导老师:阳红星 时间:2014年1月10号

一、课程设计的目的 当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。 RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。 公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。 二、RSA算法的编程思路 1.确定密钥的宽度。 2.随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。 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 n 9.将密文C解密为明文P,计算方法为:P = Cd mod n 然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 三、程序实现流程图: 1、密钥产生模块:

linux下Openssl RSA加密解密实例

1、生成秘钥文件 openssl genrsa -out secret.key 1024 openssl genrsa是生成密钥的命令,-out是指定所生成的密钥文件,secret.key这个文件里包含了公钥和密钥两部分,就是说这个文件即可用来加密也可以用来解密,如果想分开也可以用下面的命令将公钥导出。命令中的1024是指生成的密钥的长度。 2、将公钥导出 openssl rsa -in secret.key -pubout -out secret_pub.key 将公钥从secret.key中导出,-in指定输入文件,-out指定提取生成公钥的文件名。这样我们就有了一个公钥和一个私钥(包含公钥)。下面我们就可以用公钥来加密文件了。 3. 下面是一个用C实现的OpenSSL RSA加密的程序,程序实现的是公钥加密,私钥解密的过程,当然也可以实现私钥加密,公钥解密,大家可以根据程序后面的函数解释来进行各种更改。 下面将通过第一部分生成的加密文件中的公钥secret_pub.key来实现对字符串的加密,用密钥文件secret.key来实现字符串的解密,程序已经经过编译运行,可以直接实验、运行。 myRSA.h: 1 #ifndef _MY_RSA_H_ 2 #define _MY_RSA_H_ 3 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 11 #define BUFFSIZE 1024 12 #define PUBLICKEY “secret_pub.key” 13 #define OPENSSLKEY “secret.key” 14 15 char* my_EncryptFunc(char *str,char *path_key); //加密函数 16 char* my_DecryptFunc(char *str,char *path_key); //解密函数 17

RSA加密解密

苏州科技学院 实验报告 实验四 学生姓名:学号:指导教师: 实验地点:计算机学院大楼东309 实验时间:4.21 一、实验室名称:软件实验室 二、实验项目名称:RSA加密解密 三、实验学时:4学时 四、实验原理: 加密过程: 第一步,用户首先输入两个素数p和q,并求出 n = p*q,然后再求出n的欧拉函数值phi。 第二步,在[e,phi]中选出一个与phi互素的整数e,并根据e*d ≡1(mod phi),求出e的乘法逆元。至此我们已经得到了公开密钥{e,n}和秘密密钥{d,n}。 第三步,让用户输入要进行加密的小于n一组正整数(个数不超过MAXLENGTH=500),输入以-1为结束标志,实际个数存入size中,正整数以clear[MAXLENGTH]保存。 第四步,对第三步所得的明文clear[MAXLENGTH]进行加密。遍历clear[size],对每一个整数用以下算法进行加密,并将加密后的密文保存在Ciphertext[MAXLENGTH]中。 注意:此处不能用m2[j] = clear[j] ^ e整数的幂,因为当e和clear[j]较大时,会发生溢出,至使出现无法预料的结果。 第五步,输出加密后的密文。

解密过程: 第一步,根据在以上算法中求出的解密密钥[d,phi],对加密后的密文Ciphertext[MAXLENGTH]进行解密,结果保存在DecryptionText[MAXLENGTH]中,算法如下: 第二步,输出对加密前的明文和加密并解密后的密文进行比较,判断两个数组是否一致,从而得知算法是否正确。 五、实验目的: 1、对算法描述可进行充分理解,精确理解算法的各个步骤。 2、完成RSA软件算法设计。 3、用C++完成算法的设计模块。 六、实验内容: 通过编写的程序完成RSA加密解密功能 七、实验器材(设备、元器件): (1)个人计算机 (2) Windows 7系统平台 (3) C++开发环境 八、实验数据及结果分析: #include #include

RSA生成公私钥及加密解密过程演示

本练习主机A、B为一组,C、D为一组,E、F为一组。 首先使用“快照X”恢复Windows系统环境。 一.RSA生成公私钥及加密解密过程演示 (1)本机进入“密码工具”|“加密解密”|“RSA加密算法”|“公私钥”页签,在生成公私钥区输入素数p和素数q,这里要求p和q不能相等(因为很容易开平方求出p与q的值)并且p与q的乘积也不能小于127(因为小于127不能包括所有的ASCII码,导致加密失败),你选用的素数p与q分别是:p=11;q=13。 (2)单击“随机选取正整数e”下拉按钮,随机选取e,e= 103 。 (3)单击“生成公私钥”按钮生成公私钥,记录下公钥(e,n)=(103,143),私钥 (d,n)=(7,143)。 (4)在公私钥生成演示区中输入素数p=11 和素数q=13,还有正整数e=103。 单击“开始演示”按钮查看结果,填写表7-1-1。 表7-1-1 公私钥生成演示结果 (5)在加/解密演示区中输入明文m=45,公钥n=143(m

e*d=1 mod φ(n),d=47。(d,n)=(47,221)。 当公钥e=143时,写出对明文m=40的加密过程(加密过程计算量比较大,请使用密码工具 的RSA工具进行计算): c=m e mod n40 143 (mod 221)= 密文c: 105 。 利用生成的私钥d,对生成的密文进行解密:m=c d mod n105 47 (mod 221)= 明文 m:40 。 二.RSA加密解密 (1)本机在生成公私钥区输入素数p和素数q,这里要求p和q不能相等,并且p与q的乘积也不能小于127,记录你输入的素数,p=13,q=17。 (2)点击“随机选取正整数e:”下拉按钮,选择正整数e,e=143。 (3)点击“生成公私钥”按钮生成公私钥,记录下公钥e= 143 , n= 221 ;私钥d= 47 ,n= 221 。将自己的公钥通告给同组主机。 (4)本机进入“加密/解密”页签,在“公钥e部分”和“公钥n部分”输入同组主机的公钥,在明文输入区输入明文:计算机网络安全。 单击“加密”按钮对明文进行加密,单击“导出”按钮将密文导出到RSA共享文件夹 (D:\Work\Encryption\RSA\)中,通告同组主机获取密文。得到密文 -204,-141,-196,-61,-205,-37,-51,-83,-82,-168,-163,-182,-75,-119 (5)进入“加密/解密”页签,单击“导入”按钮,从同组主机的RSA共享文件夹中将密文导入,点击“解密”按钮,切换到解密模式,在“私钥d部分47”和“私钥n部分221”输入自己的私钥,再次点击“解密”按钮进行RSA解密。得到明文:计算机网络安全(6)将破解后的明文与同组主机记录的明文比较。

RSA加密算法及实现

数学文化课程报告题目:RSA公钥加密算法及实现

RSA公钥加密算法及实现 摘要 公钥密码是密码学界的一项重要发明,现代计算机与互联网中所使用的密码技术都得益于公钥密码。公钥密码是基于数学的上的困难问题来保证其性。其中RSA加密算法是一项重要的密码算法,RSA利用大整数的质数分解的困难性,从而保证了其相对安全性。但如果发现了一种快速进行质数分解的算法,则RSA算法便会失效。本文利用C 语言编程技术进行了RSA算法的演示[1]。 关键词:C语言编程、RSA算法、应用数学。

RSA public key encryption algorithm Abstract Public key cryptography is an important invention in cryptography, thanks to public key cryptography, and it is used in modern computer and Internet password technology. Public key cryptography is based on the mathematics difficult problem to ensure its confidentiality. The RSA public key encryption algorithm is an important cryptographic algorithm, RSA using the difficulty that large integer is hard to be factorized into prime Numbers to ensure it safety. But if you can find a kind of fast algorithm to do the factorization, RSA algorithm will be failure. In this paper we used C language programming technology to demonstrate the RSA algorithm. Keywords:C language programming、RSA algorithm、Applied mathematics

RSA加密的简易实现.

安全学实验报告 —RSA加密解密的简单实现 华南师范大学赵教授 RSA介绍: 当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。 RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。 公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。 一.系统总体方案: 1.要求:编写RSA加密解密演示程序,用户自己输入两个素数P,Q以及公钥E,程序判断P,Q为素数后计算得到公钥(e,n),私钥(d,n)并显示。 输入明文密文并可以进行加密解密。 2.数学原理: 1.密钥的生成选择p,q为两个大的互异素数计算n=p*q, ψ(n)=(p-1)(q-1) 选择整数e使gcd(ψ(n),e)=1(互质),(1

用实例给新手讲解RSA加密算法

RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。 (3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。 (4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。 三、什么是模指数运算? 指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1; 26 mod 6=2;28 mod 2 =0等等。

RSA加密机制

#include #include #include void sushu(int n) { for(int i=2;i<=sqrt(n);i++) if(n%i==0) { cout<>p1>>q1; sushu(p1); sushu(q1); n=p1*q1; T=(p1-1)*(q1-1); cout<<"请输入一个素数小于欧拉函数的值"<>a; sushu(a); b=T; r[0]=b;

r[1]=a; t[0]=0; t[1]=1; s[0]=1; s[1]=0; m=1; while(r[m]!=0) { q[m]=r[m-1]/r[m]; r[m+1]=r[m-1]-q[m]*r[m]; t[m+1]=t[m-1]-q[m]*t[m]; s[m+1]=s[m-1]-s[m]*s[m]; m++; } for(i=0;i>pub; for(i=0;i

RSA加解密过程及实现

******************** 本科生作业 ******************** 兰州理工大学 计算机与通信学院 2017年春季学期 信息安全课程 专业:物联网工程 姓名: 学号: 授课教师:郭显 成绩:

RSA 加解密过程及其实现 概述 RSA 算法 RSA 加密算法是一种最常用的非对称加密算法,CFCA 在证书服务中离不了它。在公钥加密标准和电子商业中,RSA 被广泛使用。 RSA 算法使用乘方运算,明文以分组为单位进行加密,每个分组的二进制值均小于n ,也就是说,分组的大小必须小于或等于1)(log 2+n 位,在实际应用中,分组的大小i 位,其中12 2+≤

RSA加密、解密方案

.NET实现加密、解密、签名、验签(转) RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德?李维斯特(Ron Rivest)、阿迪?萨莫尔(Adi Shamir)和伦纳德?阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。.Net的推出,我们能够利用.Net Framework中的类提供的加密服务来保证数据安全。目前应用较为广泛的加密方法是使用RSA算法进行加密。在.Net Framework中与RSA加密算法相关的类主要有两个:RSA 类和RSACryptoServiceProvider 类。按照MSDN的说法RSA 类是“表示RSA 算法的所有实现均从中继承的基类”,而RSACryptoServiceProvider 类是“使用加密服务提供程序(CSP) 提供的RSA 算法的实现执行不对称加密和解密”。另外,“表示RSA 算法的标准参数”的RSAParameters 结构也是很重要的,它保存了RSA算法的参数。 这里具体讲述一下在C#中如何使用框架提供的RSA算法来对我们的信息加密、签名、验证签名、解密的这个几个步骤的实现 代码 1using System.Security.Cryptography; 2 3using System.Management; 4 5using Microsoft.Win32; 6 7 8///

9 10///生成公私钥 11 12/// 13 14/// 15 16/// 17 18public void RSAKey(string PrivateKeyPath, string PublicKeyPath) 19 20 { 21 22try 23 24 { 25 26 RSACryptoServiceProvider provider = new RSACryptoServiceProvider();

RSA加解密算法

RSA加解密算法 1实验目的 了解RSA加解密算法 2实验内容 编程实现RSA加解密算法 3实验步骤 3.1选择素数p,q 选择p,q,p,q都是素数,p≠q。由于P和q都是大素数,所以为了方便由程序自动生成。 //产生随机素数p和q void prime_random(int *p,int *q) { int i,k; time_t t; p[0]=1; q[0]=3; // p[19]=1; // q[18]=2; p[MAX-1]=10; q[MAX-1]=11; do { t=time(NULL); srand((unsigned long)t); for(i=1;i

k=rand()%10; while (k==0) { k=rand()%10; } p[p[MAX-1]-1]=k; }while((is_prime_san(p))!=1); printf("素数p 为: "); for(i=0;i

RSA和DES加密解密实验

实验一加密解密实验 一、实验目的: 通过JAVA语言,来实现对称密钥加密算法,非对称秘钥加密算法对信息的加密解密,通过实际操作加深学生对对称密钥加密、非对称秘钥加密解密的理解。 二、实验内容: 安装JDK,配置Java开发环境,加压eclipse,编写对称秘钥的生成、对称密钥加密、解密的程序。编写非对称秘钥加密解密的程序,用私钥对信息进行加密,用公钥对信息进行解密,然后用公钥对信息进行加密,用私钥对信息进行解密。 三、实验用到的主要技术及工具 主要技术:Java、Bouncy Castle 主要工具:Eclipse 四、开发步骤: 1、安装JDK,配置JAVA环境变量。 2、解压eclipse。 3、在eclipse中新建项目

4、编写使用DES算法生成秘钥的程序。 1.初始化密钥,并对密钥进行Base64位编码 5、使用生成的秘钥对“电子商务安全技术”进行加密。 加密,使用生成的密钥和明文作为参数进行传递,并使用密钥对明文加密 以下是对明文进行初始化,在第4点中已对密钥初始化 已下是加密算法 6、用第4步骤中生成的秘钥对第5部中生成的加密后的内容进行解密。 inputData为第五步中出现的加密过后的明文,由于DES 为对称加密,所以解密密钥key和加密密钥key使用的是同一把密钥

以下是解密算法: 以下是DES加密与解密算法的结果 7、使用AES算法重复4-6步骤。 8、使用RSA算法生成公钥和私钥。 对密钥进行初始化

取得公钥 取得私钥 对密钥进行编码并输出到控制台 获取明文,并对明文进行编码 9、用公钥对“电子商务安全技术RSA”进行加密。 以下是加密算法

RSA加密解密算法

《网络安全》实验设计报告 RSA加密解密算法 学院(系): 班级: 组别: 指导教师:

一、实验设计的目的 当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。 RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。 公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。 二、RSA算法的编程思路 1.确定密钥的宽度。 2.随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。 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 n 9.将密文C解密为明文P,计算方法为:P = Cd mod n 然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 三、程序实现流程图: 1、密钥产生模块:

用实例讲解RSA加密算法(精)

用实例讲解RSA加密算法 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA 以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA公开密钥算法的发明人 (从左到右Ron Rivest, Adi Shamir, Leonard Adleman. 照片摄于1978年)RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。

二、什么是“互质数”(或“互素数”)? 小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种(不限于此): (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。(4)相邻的两个自然数是互质数。如15与16。 (5)相邻的两个奇数是互质数。如49与51。 (6)大数是质数的两个数是互质数。如97与88。 (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。 (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。 三、什么是模指数运算? 指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n 为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。模指数运算就是先做指数运算,取其结果再做模运算。如53 mod 7=125 mod 7=6 好,现在开始正式讲解RSA加密算法。 算法描述: (1)选择一对不同的、足够大的素数p和q。 (2)计算n=pq。 (3)计算f(n)=(p-1)(q-1),同时对p和q严加保密,不让任何人知道。 (4)找一个与f(n)互质的数e,且1

相关主题