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
}
感谢阅读!

浙公网安备 33010602011771号