RSA公钥加密系统中,公钥和密钥的产生:
假设密文为 c ,明文为 m
RSA的加密过程为:$c = m^e\pmod n$
RSA的解密过程为:$m = c^d\pmod n$
这里是公钥加密,私钥解密。
如果用于数字签名,则与之相反,即私钥加密公钥解密。
素数分布函数$\pi(n)$描述了小于或等于n的素数的数目。例如$\pi(n) = 4$,分别为$2,3,5,7$
素数定理
$\lim \limits_{n \rightarrow \infty}\frac{\pi(n)}{n/\ln n} = 1$
对于较小的n,近似式$n/\ln n$能精确的给出$\pi(n)$的估计值,如:$n=10^9$,误差不超过6%
为了找一个长度与n相同的质数大概需要在n的附近找大约$\ln n$个数,如找一个1024位长度的质数,大约需要测试$\ln 2^{1024} \approx 710$个随机选取的长度为1024位长的整数素性。
// rand big prime in 2^15
ll rand_prime(ll rd) {
ll prime = time(NULL) * rd % (2LL << 15);
while (!miller_rabin(prime, 10)) {
prime++;
// cout << prime << endl;
}
return prime;
}