给出p、q、e、M,设计一个RSA算法,求公钥,私钥,并且利用RSA算法加密和解密?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给出p、q、e、M,设计一个RSA算法,求公钥,私钥,并且利用RSA算法加密和解密?相关的知识,希望对你有一定的参考价值。

给出p、q、e、M,设计一个RSA算法,求公钥,私钥,并且利用RSA算法加密和解密?
有人知道怎么做这样的一道题目吗,可以的话最好举例子说明,麻烦详细点,可以追加悬赏。
如果需要私发的话,邮箱是这个gavineison@163.com,谢谢了

那我给你解释下RSA吧,尽量让你看懂:
*RSA是非对称加密体系,也就是说加密用一个公钥,解密用一个私钥,这2个密钥不同,这点非常非常重要。

其实RSA非常简洁,但很美

流程
1,寻找2个大的素数p,q n=p*q=33 N=(p-1)*(q-1)=20
公钥e一般是3 私钥d要通过公钥e去算出来
e*d=1(mod N) 就是说e和d的乘积模N得1 也就是e和d关于模N互为逆元
3*7=1(mod 20) 可知d=7

加密的明文设为M 加密后的密文设为c
加密过程:C=M^e(mod n)
解密过程:M=C^d(mod n)

举个具体的例子 假如M=2
加密过程:C=2^3(mod 33)=8(mod 33)
解密过程:M=8^7(mod 33)=2097152(mod 33)=2(mod 33) 可以看出和和本来的明文是相同的。

原理可以理解为 M=M^(ed) (mod n)
本例中 e*d=21 也就是是M^21次方等于M
RSA这个特性是数论中的费马定理推出的

在讲讲细节 比如楼主加密的是26的字母 就当明文的值是从1到26
就拿n=33说吧 加密后的密文的值是1到33 这很正常
但是解密后 一定和明文的值相同 也就是1到26

实际情况中 公钥e是公开的 私钥d是保密的
比如甲要给乙发个东西 乙的公钥由于是公开的 所以甲知道 但甲不知道乙的私钥
甲先用乙的公钥加密 之后 这个密文只能用乙的私钥 由于乙的私钥是保密的 只有他自己知道 所以保证了安全

RSA最大的安全问题是 n的分解 只要把n分解为p*q 则N=(p-1)(q-1)
根据 e*d=1(mod N) 就可以通过e算出d 那么私钥都被人算出来了 也就没安全性而言了
不过可惜的是 大数分解是一个单向的函数 你算知道p,q算n很容易,但是知道n算出p,q相当难

强调一句 n是加密解密用的 N是知道e算d的

楼主也没说你要干嘛 想看懂就这么多
如果要实现这个算法:
必须知道2点:
1.p,q这个两个大素数的生成,这牵扯到素性检验,数论中是一章的内容,没法和你展开
2.取模运算,由于加密解密过程可能取一个数的几十次方的模数,所以这个必须用简便的算法来化解复杂度,也就是模重复平方算法。

如果要编程中使用,太容易了
去下个dll
在java中 直接有可用于RSA的类 相当容易
参考技术A #include <iostream.h>
#include <math.h>
#include <stdio.h>

typedef int Elemtype;
Elemtype p,q,e;
Elemtype fn;
Elemtype m,c;
int flag = 0;
typedef void (*Msghandler) (void);
struct MsgMap
char ch;
Msghandler handler;
;
/* 公钥 */
struct PU
Elemtype e;
Elemtype n;
pu;
/* 私钥 */
struct PR
Elemtype d;
Elemtype n;
pr;
/* 判定一个数是否为素数 */
bool test_prime(Elemtype m)
if (m <= 1)
return false;

else if (m == 2)
return true;

else
for(int i=2; i<=sqrt(m); i++)
if((m % i) == 0)
return false;
break;


return true;


/* 将十进制数据转化为二进制数组 */
void switch_to_bit(Elemtype b, Elemtype bin[32])
int n = 0;
while( b > 0)
bin[n] = b % 2;
n++;
b /= 2;


/* 候选菜单,主界面 */
void Init()
cout<<"*********************************************"<<endl;
cout<<"*** Welcome to use RSA encoder ***"<<endl;
cout<<"*** a.about ***"<<endl;
cout<<"*** e.encrypt ***"<<endl;
cout<<"*** d.decrypt ***"<<endl;
cout<<"*** s.setkey ***"<<endl;
cout<<"*** q.quit ***"<<endl;
cout<<"**********************************by*Terry***"<<endl;
cout<<"press a key:"<<endl;

/* 将两个数排序,大的在前面*/
void order(Elemtype &in1, Elemtype &in2)
Elemtype a = ( in1 > in2 ? in1 : in2);
Elemtype b = ( in1 < in2 ? in1 : in2);
in1 = a;
in2 = b;

/* 求最大公约数 */
Elemtype gcd(Elemtype a, Elemtype b)
order(a,b);
int r;
if(b == 0)
return a;

else
while(true)
r = a % b;
a = b;
b = r;
if (b == 0)
return a;
break;





/* 用扩展的欧几里得算法求乘法逆元 */
Elemtype extend_euclid(Elemtype m, Elemtype bin)
order(m,bin);
Elemtype a[3],b[3],t[3];
a[0] = 1, a[1] = 0, a[2] = m;
b[0] = 0, b[1] = 1, b[2] = bin;
if (b[2] == 0)
return a[2] = gcd(m, bin);

if (b[2] ==1)
return b[2] = gcd(m, bin);

while(true)
if (b[2] ==1)
return b[1];
break;

int q = a[2] / b[2];
for(int i=0; i<3; i++)
t[i] = a[i] - q * b[i];
a[i] = b[i];
b[i] = t[i];



/* 快速模幂算法 */
Elemtype modular_multiplication(Elemtype a, Elemtype b, Elemtype n)
Elemtype f = 1;
Elemtype bin[32];
switch_to_bit(b,bin);
for(int i=31; i>=0; i--)
f = (f * f) % n;
if(bin[i] == 1)
f = (f * a) % n;


return f;

/* 产生密钥 */
void produce_key()
cout<<"input two primes p and q:";
cin>>p>>q;
while (!(test_prime(p)&&test_prime(q)))
cout<<"wrong input,please make sure two number are both primes!"<<endl;
cout<<"input two primes p and q:";
cin>>p>>q;
;
pr.n = p * q;
pu.n = p * q;
fn = (p - 1) * (q - 1);
cout<<"fn = "<<fn<<endl;
cout<<"input e :";
cin>>e;
while((gcd(fn,e)!=1))
cout<<"e is error,try again!";
cout<<"input e :";
cin>>e;

pr.d = (extend_euclid(fn,e) + fn) % fn;
pu.e = e;
flag = 1;
cout<<"PR.d: "<<pr.d<<" PR.n: "<<pr.n<<endl;
cout<<"PU.e: "<<pu.e<<" PU.n: "<<pu.n<<endl;

/* 加密 */
void encrypt()
if(flag == 0)
cout<<"setkey first:"<<endl;
produce_key();

cout<<"input m:";
cin>>m;
c = modular_multiplication(m,pu.e,pu.n);
cout<<"c is:"<<c<<endl;

/* 解密 */
void decrypt()
if(flag == 0)
cout<<"setkey first:"<<endl;
produce_key();

cout<<"input c:";
cin>>c;
m = modular_multiplication(c,pr.d,pr.n);
cout<<"m is:"<<m<<endl;

/* 版权信息 */
void about()
cout<<"*********************************************"<<endl;
cout<<"*** by Terry ***"<<endl;
cout<<"*** copyright 2010,All rights reserved by ***"<<endl;
cout<<"*** Terry,technology supported by weizuo !***"<<endl;
cout<<"*** If you have any question, please mail ***"<<endl;
cout<<"*** to 18679376@qq.com ! ***"<<endl;
cout<<"*** Computer of science and engineering ***"<<endl;
cout<<"*** XiDian University 2010-4-29 ***"<<endl;
cout<<"*********************************************"<<endl;
cout<<endl<<endl;
Init();

/* 消息映射 */
MsgMap Messagemap[] =
'a',about,
's',produce_key,
'd',decrypt,
'e',encrypt,
'q',NULL
;
/* 主函数,提供循环 */
void main()
Init();
char d;
while((d = getchar())!='q')
int i = 0;
while(Messagemap[i].ch)
if(Messagemap[i].ch == d)
Messagemap[i].handler();
break;

i++;




本程序由520huiqin编写,详情见参考资料

参考资料:http://hi.baidu.com/520huiqin/blog/item/f6bf271bef19be76dab4bd9b.html

本回答被提问者采纳
参考技术B lz给个邮箱吧。因为这个是自己写的,不希望发到这里来。

以上是关于给出p、q、e、M,设计一个RSA算法,求公钥,私钥,并且利用RSA算法加密和解密?的主要内容,如果未能解决你的问题,请参考以下文章

RSA已知明文和公钥能得到私钥加密的密文吗

rsa算法中p,q,n,e,d一般大小都为多少啊?

RSA加密算法已知公钥对,求d

RSA加密算法已知公钥对,求d

RSA算法及一种"旁门左道"的***方式

RSA 算法