安全性方面需注意参数的选取:(建议参考:《应用密码学》2017版 P156-P157)
1、不同的用户不能用相同的模数 n,即一个模数只能一个人用
2、p 和 q 的差值要大,一般相差几个 bit ,比如:n 为 1024 bit 时,p 取 508 bit ,q 取 516 bit,如果 n 为 2048 bit,p q 就相差 12 bit 吧
3、p-1 和 q-1 都应有大的素因子,就是说 一般这样选择两个大素数(即先选择素数 p1 与 p2,使得 p=2p1+1 与 q=2q1+1 也是素数),要选择这样的 p 和 q 才好
4、私钥 d 的选择,一般要求私钥 d>=n**0.25
5、更换密钥,如果私钥 d 泄露,再在模 n 的情况下重新计算一对密钥是不佳的选择,应该必须换新的公钥 n
6、公钥 e 不可以太小,否则不安全,一般根据 PKCS#1 的建议,可以选择 3 或 65537(=2**16+1),选择 e=3 时,如果遵循 PKCS#1 v2.1 描述的填充方法(OAEP),目前仍是安全的
e 一般采用 16 位素数
7、如果 n 是模数,k 为任意正整数,m 是明文,那么 e!=log(kn+m)(以 m 为底),否则密文和明文是一样的字符串,算法中最好自动检测明文等于密文时,提示更换密钥对或p q
8、e 的选择应该使其在 mod(q(n)) 的阶最大。即存在 i ,使得 e**i ==== 1mod(q(n)),i>=q(n)/2 这样可以有效抵抗破解,其中,“====” 表示同余
9、p-1 和 q-1 的最大公因子要小,最好是 2 ,或足够 小
注:最好先选择 d(秘钥) ,再算出 e(公钥),选一个大于 p、q,而小于q(n)并较靠近q(n) ,并满足 (d,q(n))=1(最大公因子)的强素数 d ,之后计算 e,
如果 e 不是很小,也不很大,同时 e!=log(kn+m)(以 m 为底),则 e 为所求,否则重新计算 d,然后再计算 e
简单来说,顺序是这样的:
1、选择 p=1018 bit q=1030 bit 左右的大素数
2、大素数 p q 是安全素数 (即 p1 是素数,2p1+1 也是素数,而 p=2p1+1)
3、q(n) 是 n 的欧拉数,q(q(n))>=q(n)/2 (条件2满足,这个一定满足,可不看)
4、(p-1,q-1)==2 或 足够小 ,其中 (a,b) 表示 a 和 b 的最大公因子 (条件2满足,这个一定满足,可不看)
5、选一个强素数 d 大于 p q 小于 q(n) 并较接近 q(n) ,且 d,q(n) 互素,在计算 e
(其中,若 d 为安全素数,大于 p q ,则 d,q(n) 肯定互素)
注:e 最好在 16 bit 左右,不大也不小就行
d>n**0.25 (必须)(条件5满足,这个一定满足,可不看)
强素数:即安全素数
另外,当明文等于密文时,程序应有提示
参考:超重点 RSA 参数选择
RSA算法参数选择
RSA算法中几种可能泄密的参数选择
RSA 填充方法 看第二个回答
RSA 填充方法
PKCS1Padding
强素数生成方法