RSA密码的密钥生成
具体步骤:
- 选择两个互素的素数p和q,计算n=pq, φ(n)=(p-1)(q-1).
- 选择整数e,使gcd(φ(n), e)=1,且1< e < φ(n);
- 计算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 = er mod 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
}
感谢阅读!