构造一个公钥密码系统的要求
- 产生一对密钥是计算可行的
- 发送方利用公钥和明文,产生密文是计算可行的
- 接收方利用私钥和密文,产生明文是计算可行的
- 对于攻击者,利用公钥来推断私钥是计算不可行的
- 已知公钥和密文,恢复明文是计算不可行的
- (可选) 加密和解密的顺序可交换
RSA 算法的起源
- RSA 算法在1977年由MIT 的Ron Rivest、Adi Shamir 和Leonard Adleman 一起提出,并以他们三人姓氏开头字母命名,是一种获得广泛使用的非对称加密算法。
- 1983年麻省理工学院在美国为RSA 算法申请了专利。这个专利2000年9月21日失效。由于该算法在申请专利前就已经发表,在世界上大多数其它地区这个专利权不被承认。
RSA 算法的安全性概述
-
对极大整数进行因数分解的难度(The Factoring Problem) 决定了RSA 算法的可靠性。换言之,对一个极大整数做因数分解愈困难,RSA 算法就愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA 加密的信息的可靠性就肯定会极度下降。目前看来找到这样的算法的可能性非常小。
-
目前还没有可靠的攻击RSA 算法的方式。短的RSA 钥匙可能被强力方式解破(比如768-bit,即232个十进制位以下的整数)。只要其钥匙的长度足够长(比如1024-15360-bit),用RSA 加密的信息看来很难被破解。
-
在分布式计算技术和量子计算理论日趋成熟的今天,RSA 加密的安全性受到了挑战。
RSA公钥和密钥的生成
-
挑选两个不同的大素数 ,令
-
利用欧拉 函数来计算$\phi (N) $。 有 。
-
挑选一个整数 ,满足条件:小于 并与之互素。
-
通过式子 计算得到 , 也就是说 是 的模 逆元。
-
销毁 , 当 足够大时,几乎不可能反向推导出 。
-
作为公钥, 作为私钥。
RSA加密过程
-
假设Bob发送明文M给Alice,Bob有Alice的公钥 。
-
要加密,Bob首先需要使用与Alice约定好的方式将明文M转换成 一个整数n, 整数n小于N。(如果信息N较大,可能需要分段加密)
-
Bob引用公钥 利用以下同余式,将n加密为c:
即
-
Bob算出c之后可以公开传播。
!接收方公钥加密 !
RSA解密过程
-
Alice得到Bob的消息c,后利用Alice的私钥 解密。
-
利用以下同余式将c转换为
或者
-
得到的 就是 Bob的n,因此就可以按照约定的方式将信息M复原。
! 接收方私钥解密 !
RSA算法大素数选择问题
RSA算法中 的选择原则:
- (D. Coppersmith) p 和q 不能离得太近。如果N 的位数为k,那么 要同时满足 以及 。
- (D. Coppersmith) 较短的e 可以提高加密算法计算ne 的速度,但可能存在计算d 的快速算法。PKCS#1 建议 。
- (M. Wiener) d 不能太小,否则可以通过快速算法计算得到d。如果N 的位数为k,那么d 的值要满足 。
- (O. Schirokauer) N 的非相邻形式(Non-Adjacent Form, NAF) 的海明权重(Hamming weight, 非0元总数) 不能太小,否则应用数筛法可能会快速对N 进行质因数分解。一般要求N 的 表述权重大于 。
RSA 算法中p 和q 的选择流程:
-
确定RSA 所要求N 的位数k。k = 1024、2048、3072、4096 …
-
随机选择一个位数为 的素数p。
即 。
-
选择一个位数为 的素数q。
-
求|p - q|;如果log|p - q| 过小,则返回(2),重新选取p。
-
计算 ,确认N 的位数为 ;否则返回(2),重新选取p。
-
计算N 的NAF 权重;如果权重过小,则返回(2),重新选取p。
-
计算 (N),选择公钥e, 且 。
一般建议选择素数 。
- 求e 的模 逆元d;如果d 过小,则返回(2),重新选取p。
- 返回RSA 的参数p、q、e、d。或者销毁p、q,返回N、e、d。
大素数的生成
- 素数的存在性 – 素数理论:在正整数N 附近,每ln(N) 个整数中有一个素数。
- 素数的生成过程:
- 随机选择一个奇数n (比如通过伪随机数发生器);
- 随机选择a, 使0<a<n;
- 进行素性测试(例如用Miller-Rabin 算法),若n 没有通过测试,抛弃n,转到(1);
- 如果通过了足够次数的测试,概率上可以认为n 是素数,算法结束;否则转(2)。