RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法是一种非对称加密算法,与对称加密算法不同的是,RSA算法有两个不同的密钥,一个是公钥,一个是私钥。
RSA是被研究得最广泛的公钥算法,从提出后经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
一、先导知识
素性检测
随机数生成
中国剩余定理
二、算法流程
1. 密钥生成
1.1 选取大素数p、q
选取两个大素数 p p p、 q q q,保密。
1.2 计算乘积n、欧拉函数值 φ ( n ) \varphi(n) φ(n)
计算 n = p × q n=p \times q n=p×q,计算 φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n)=(p-1)(q-1) φ(n)=(p−1)(q−1),其中 φ ( n ) \varphi(n) φ(n)是 n n n的欧拉函数值。
1.3 选取整数e
选取一个整数 e e e,满足 1 < e < φ ( n ) 1<e<\varphi(n) 1<e<φ(n),且 g c d ( φ ( n ) , e ) = 1 gcd(\varphi(n),e)=1 gcd(φ(n),e)=1。
1.4 计算乘法逆元d
计算 d d d,满足 d ⋅ e ≡ 1 m o d φ ( n ) d \cdot e \equiv 1 \; mod \; \varphi(n) d⋅e≡1modφ(n)。
1.5 生成密钥
以 { e , n } \{ e, n \} {e,n}为公开钥,以 { d , n } \{d , n \} {d,n}为秘密钥。
2. 加密
加密时需要将明文比特串进行分组,分组长度小于 log 2 n \log_{2}n log2n,然后对每个明文分组 m m m作加密运算。
c ≡ m e m o d n c \equiv m^e \; mod \; n c≡memodn
3. 解密
对密文分组的解密运算为
m ≡ c d m o d n m \equiv c^d \; mod \; n m≡cdmodn
三、计算问题
密钥的产生
产生密钥时,需要考虑两个大素数p和q的选取。寻找大素数时,一般是先随机选取一个大的奇数,然后使用素性检测算法检验这一奇数是否为素数,若不是,则重新选取另一个大奇数,进行素性检测,知道找到素数为止。
选定 p p p和 q q q后,需要考虑 e e e的选取和 d d d的计算,这一问题可由扩展欧几里得算法完成。
算法速度提升
利用中国剩余定理,可以极大的提高解密运算的速度。