RSA算法总结

RSA算法逻辑

1 选择一对不同的、足够大的素数p,q。
2 计算n=pq。
3 计算f(n)=(p-1)(q-1)
4 找一个与f(n)互质的数e,且1 5 计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡ e^{\smash{-1}} mod f(n)
6 公钥KU=(e,n),私钥KR=(d,n)。
7 加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:C \equiv M^e \pmod n
8 解密过程为:M \equiv C^d \pmod n

RSA 参数的选择

安全性方面需注意参数的选取:(建议参考:《应用密码学》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的Padding

无填充,就是直接对明文进行加密

PKCS1。将数据长度分成密钥长度-11byte,比如密钥是1024bit,那么长度就是1024/8-11=117bytes,具体的格式:先填0,2,然后随机生成其他的byte,后面才是真正的数据

PKCS1_OAEP将数据长度分成密钥长度-41byte,比如密钥是1024bit,那么长度就是1024/8-41=77bytes,先填0,随机或者是固定的测试向量加20个bytes,然后加20个数字签名的数据,最后才是数据

SSLV23,将数据长度分成密钥长度-11byte,比如密钥是1024bit,那么长度就是1024/8-11=117bytes,具体的格式:先填0,2,填入8个3,填入一个'\0',最后才是真正的数据。

你可能感兴趣的:(RSA算法总结)