步骤:
随意选择两个大的质数p和q,p不等于q,计算n=pq。
根据欧拉函数,求得r=(p-1)(q-1)。
选择一个小于r,且与之互质的整数w,求得w关于模r的模反元素,命名为d。(dw mod n = 1)。
将p和q的记录销毁。
公钥:n, w
私钥:n, d
加密:密文c = m^w mod n
解密:明文m = c^d mod n
用到的算法:
1. 求互质:互质定义为如果两个数的两个数的最大公因数为1
int isOpprime(int w, int On)
{
if(On == 0)
return w;
else
return isOpprime(On, w % On);
}
当返回1是互质
2. 求模逆:知dw mod n = 1可以简单的使用穷举:dw = nk + 1if nk + 1 mod w == 0;d = nk +1 div w
3. 幂求模:求m^w mod n
由ab mod n = (a mod n) * (b mod n) mod n 即ab = (a mod n)(b mod n) (mod n);
ab mod n = (a - n)(b - n) mod n
先求w的二进制:bn * b(n-1)*...*b1*b0 即 w = b0*2^0 + b1*2^1 +...+b(n-1)*2^(n-1) + bn*2^n
m^w =m ^ (b0*2^0) * m ^ (b0*2^1) * ...* m ^ (b(n-1)*2^(n-1)) * m ^ (bn*2^n(mod n))
令A0 = m (mod n), Ai =( Ai-1) ^ 2 (mod n)
则m^w = A0 * A1 *...* An(mod n)
A0 = m;
A1 = m^2 mod n;
A2 = A1^2 mod n;
...
当bi = 0, Ai = 1且 Ai < n/2
举例:
p = 37, q = 43;
n = pq = 1591;
r = (p-1)(q-1);
取与r互质整数w = 29;则由dw mod r = 1, 求得d = 365;
设明文m = 12394;
密文c = m^w mod n = 1234^29 mod 1591;
w = 29的二进制位11101
A0 = 1234(> 1591/2 = 795)(mod 1591)
= 1234 - 1591 = -357(mod 1591)
A1 = (-357)^2 = 169(mod 1591)
A2 = 169^2 = 1514(> 1591/2 = 795)(mod 1591)
= 1514 - 1591 = -77(mod 1591)
A3 = (-77)^2 = 1156 = -435(mod 1591)
A4 = (-435)^2 = 1487 = -104(mod 1591)
c = (-357)*(-77)*(-435)*(-104) = 442*(-435)*(-104) = 241*(-104) = 392(mod 1591)
由c = 392, d = 365,也可逆推m = 1234,略