RSA密码的密钥生成

具体步骤:

  1. 选择两个互素的素数p和q,计算n=pq, φ(n)=(p-1)(q-1).
  2. 选择整数e,使gcd(φ(n), e)=1,且1< e < φ(n);
  3. 计算d,使d ≡ e-1mod φ(n),即d的模φ(n)下的e的乘法逆元。

则公开密钥P={e,n},私用密钥S={d,n,p,q}.当明文为m,密文是c加密时使用公开密钥P,加密算法 c = me mod n;解密算法 m = cd mod n.故e也被称为加密指数,d被称为解密指数。

 

详解:

第一步:

欧拉定理——正整数a与n互,则af(n) =1 mod n. 

欧拉函数:对于一个正整数n,由小于n且与n互素的正整数构成的集合Zn,这个集合被称为n的完全余数集合。Zn元素个数记作f(n),称为欧拉函数,其中f(1)=1,无实质意义。

如果两个素数p和q,且n=pq,则f(n) = (p-1)(q-1)

大整数因子分解:已知p,q两个大素数,则求N=pq是容易的,但反过来已知N为两个大素数的积,求两个大素数p,q则是困难的。

第二步:

e的选择是随意的,只要它满足与φ(n)互素(gcd(φ(n), e)=1,φ(n)和e的最大公约数为1),且0< e <φ(n).

第三步:

d是e的乘法逆元,满足 ed mod n =1.可用欧拉定理或者辗转相除法求得。

代码如下:

#include
#include
#include
void eculid(long int a,long int b);
int mod(long int x,long int y);
void main()
{
	long int i,j;
	printf("输入两个数(第一个数大于第二个数):\n");
	scanf("%ld%ld",&i,&j);
	eculid(i,j);
 } 
 void eculid(long int a,long int b)         //假定a>b>0,求的是b模a的乘法逆元 
 {
 	char c = '%';
 	long int a0,b0,t0;
	long int t,q,r;
	long int temp,temp1;
	a0=a; b0=b; t0=0; t=1; q=a0/b0;
	r=a0-q*b0;                             //r为a对b的模
	while(r>0) 
	{
		temp1=t0-q*t;
		temp=mod(temp1,a);
		t0=t;
		t=temp;
		a0=b0;
		b0=r;
		q=a0/b0;
		r=a0-q*b0;
	}
	if(b0!=1) printf("no inverse.\n");
	else {
		printf("The multi-inverse is:%ld\n",t);
		printf("(%ld*%ld) %c %ld=%ld\n",b,t,c,a,1);
	} 
	printf("倒数定义为a*x=1,则x为a的倒数;\n而逆元为:a*x%cp=1.",c);
 }
 int mod(long int x,long int y)                  //求模 
 {
 	long int m,n;
 	m=x/y;
 	n=x-m*y;
 	return n;
 }
==========================================================================
运算结果:
输入两个数(第一个数大于第二个数):
3 14
The multi-inverse is:-1
(14*-1) % 3=1
倒数定义为a*x=1,则x为a的倒数;
而逆元为:a*x%p=1.
==========================================================================

 

另外 d ≡ e-1mod φ(n)  等价于 d mod φ(n) = e-1mod φ(n) 

当 0< m < n 时,m = cd mod  n =(me mod n)d mod n= med mod n mod n =med mod n = mkφ(n) +1 mod n = m mod n =m  ,解密成功,加密同理。

{

  e为单位元

  • 若 at mod n = e ,
    • 有 (at mod n)r mod n = emod n =e mod n = e; 
    • 有(at mod n)r mod n= atr mod n = e;
  • a mod n mod n = a mod n
  • ed = 1 mod φ(n)  等价于 ed / φ(n) = k ······1,所以 ed = kφ(n) + 1

}

感谢阅读!

posted @ 2019-09-17 22:23  叶际参差  阅读(1195)  评论(0编辑  收藏  举报