算法->RSA入门

202 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

RSA算法的由来

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

今天只有短的RSA钥匙才可能被强力方式解破。 到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。 只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。 但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战和质疑。

算法思想

算法本身基于一个简单的数论知识:给出两个素数,很容易将它们相乘,然而给出它们的乘积,想得到这两个素数就显得尤为困难。如果能够解决大整数(比如几百位的整数)分解的快速方法,那么 RSA 算法将轻易被破解。

公钥和私钥的生成

算法由两个密钥,即公钥和私钥组成。
1)准备两个非常大的素数 p 和 q(转换成二进制后 1024 个二进制位或者更多,位数越多越难破解);
2)利用字符串模拟计算大素数 p 和 q 的乘积 n=pq;
3)同样方法计算 m=(p−1)(q−1),这里的 m 为 n 的欧拉函数;
4)找到一个数 e(1<e<m),满足 gcd(m,e)=1(即 e 和 m 互素);
5)计算 e 在模 m 域上的逆元 d(即满足 ed mod m=1);
6)至此,公钥和私钥生成完毕:(n,e) 为公钥,(n,d) 为私钥;

RSA加密

对于明文 x,用公钥 (n,e) 对 x 加密的过程,就是将 x 转换成数字(字符串的话取其 ASCII码或者 unicode 值),然后通过幂取模计算出 y,其中 y 就是密文;

y = xe mod n

RSA解密

对于密文 y,用私钥 (n,d) 对 y 进行解密的过程和加密类似,同样是计算幂取模;

x=yd mod n