http://blog.chinaunix.net/uid-21880738-id-1813145.html

现有的大部分RSA算法实现都遵循PKCS#1 v2.1/v1.5 (2002/1993)。根据PKCS#1的建议,公钥指数e是可以选取较小的素数3或65537(=2^16+1)。这样选取主要是为了提高加密或签名验证的性能,因为3或65537分别只需要2或17次模乘运算,而一个随机选择的e(假设n是1024-bit)则大约需要1000次。这种选用小公钥指数的方法使用户相信RSA在签名验证和加密操作方面确实要比“以高效著称的ECC”还要高效很多。

然而在选用小公钥指数时,有很多人则更倾向于选e=65537而不是e=3,他们认为3“似乎不安全”,然而又给不出所以然。今天我想说的是,在“正确使用”RSA算法的情况下,至今为止还没有发现公开的攻击方法能有效攻击e=3。那么何为正确使用呢?很简单,如果你不是密码专家,那么实现时请遵守PKCS#1 v2.1或IEEE P1363的建议,而不要局限于自己对RSA的教科书式的理解。或者使用公开的密码算法库,如OpenSSL,这些算法的实现一般都会遵守相关标准或建议。

选择e=3究竟有什么问题?
对于e=3的情形,至今以来,其签名验证或加密的性能优势是任何公钥密码算法都无法超越的。但对其所存在的安全脆弱性,我们应实事求是地进行分析,而不要轻易放弃使用e=3。下面我来梳理一下自从1977年RSA算法诞生以来针对小公钥指数(e=3)的密码分析中值得一提的结论。
(1) Hastad攻击
Hastad描述的攻击经常也被称为广播攻击[1]。
攻击场景:如果Alice打算将消息M加密发送给一组用户,并且这组用户选择的公钥指数e=3,那么攻击者Malice可以通过截获3个密文
C1 = M^3 mod N1, C2 = M^3 mod N2, C3 = M^3 mod N3
便能够有效地恢复出明文M。Hastad进一步指出,即使Alice在加密M之前对M进行了f运算(这里f是一个公开的多项式函数),攻击者仍然能有效地恢复出明文M。所以建议在进行消息填充时一定要选择随机化填充方法,比如OAEP[2],而不是一个确定的填充方法。
影响:PKCS#1 v2.1和v1.5均不受此攻击的影响。
(2) Franklin-Reiter攻击
Franklin-Reiter攻击是一种明文相关性攻击[3]。
攻击场景:假设Bob的公钥为(3, N),Alice发送消息M1和M2给Bob,并且M1 = f(M2) mod N,f是一个已知的多项式。那么攻击者Malice可以截获密文
C1 = M1^3 mod N, C2 = M2^3 mod N
便能够有效地恢复出明文M。所以建议明文在加密前一定要做随机化处理。
影响:PKCS#1 v2.1和v1.5均不受此攻击的影响。
(3) Coppersmith攻击
首先我们介绍Coppersmith发现的短填充攻击[4]。
攻击场景:假设Bob的公钥为(3, N),Alice发送消息M给Bob。消息M的填充方法是遵循PKCS#1 v1.5,即在消息尾部或头部直接填充随机串。如果攻击者截获到Alice发送给Bob的关于消息M的两个不同的密文,即
C1 = (0002||r1||M)^3 mod N, C2 = (0002||r2||M)^3 mod N
如果填充的随机串r的长度低于消息长度的1/9,那么攻击者便能够有效地恢复出明文M。注意该攻击对e = 65537无效。
影响:PKCS#1 v2.1不受影响,但PKCS#1 v1.5受此攻击的影响。
[补充说明] Coppersmith在密码分析领域做了很多杰出的工作,比如Coppersmith定理[4]已经成为一个密码分析工作的奠基石。
Coppersmith定理:令N为大整数,f是度为e的多项式。给定N和f,可以有效地计算出方程f(x)=0 mod N所有小于N^(1/e)的解。
应用该定理,另一个简单的攻击如下:当e=3时,给定一个密文,如果攻击者已知2/3的明文比特,则能恢复出整个明文。

(4) BDF攻击
BDF攻击[5]是针对私钥d在部分暴露之后的攻击。
攻击结论:令(N, d)为私钥,N的长度为n-bit。假若d的n/4个低位比特信息被泄露,那么在e < sqrt(N)条件下,攻击者可以有效地恢复出私钥d。
另外值得一提的是,如果e = 3,我们很容易知道d的取值范围,而且这个取值范围的区间为sqrt(N)量级。这也就是说,如果e = 3,RSA就天然地泄露了d的一半比特位信息,只不过泄露的是高位比特,而不是低位比特。但是目前还没有发现针对d的高位比特泄露的有效攻击。
影响:PKCS#1 v2.1和v1.5均不受此攻击的影响。

(5) 其它攻击

关于RSA的其它相关攻击,如小私钥指数攻击、共模攻击、盲化攻击、时间攻击等,请参见[6, 7].

结论

(I) 对于RSA加密来说,如果在实现上遵循PKCS#1 v2.1 (OAEP填充),目前还没有发现有效的攻击;但如果是遵循PKCS#1 v1.5 (明文尾部直接填充),那么存在Coppersmith攻击。

(II) 对于RSA签名来说,目前对于PKCS#1 v2.1 (PSS填充)和PKCS#1 v1.5 (填充方法:0001FF...FF00||ASN.1||H(M))来说都还没有发现有效的攻击。

综上所述,选用e=3作为RSA的公钥指数,只要使用正确的填充方案,目前仍然是安全的。

关于e=65537的说明

这是一个推荐使用的公钥指数,我认为选这个值的目的只是一个介于低指数攻击和运算效率之间的一个折中考虑,即以防万一"e=3"被攻破而侥幸"e=65537"可能还是安全的。另外,NIST SP800-78 Rev 1 (2007) 也曾强调“不允许使用比65537更低的公钥指数e”,但对于该限制却没有给出任何理由。而PKCS#1却从未有过类似的建议。

参考文献:

[1] J. Hastad, Solving simultaneous modular equations of low degree. SIAM J. of Computing, 17: 336-341, 1988
[2] M. Bellare and P. Rogaway. Optimal asymmetric encryption. In EUROCRYPT'94, LNCS 950, pp 92-111, 1994.
[3] M. Franklin and M. Reiter, Low-exponent RSA with related messages. In EUROCRYPT'96, LNCS 1070, pp 1-9, 1996.
[4] D. Coppersmith. Small solutions to polynomial equations, and low exponent RSA vulnerabilities. Journal of Cryptology, 10: 233-260, 1997.
[5] D. Boneh, G. Durfee, and Y. Frankel. An attack on RSA given a fraction of the private key bits. In AsiaCrypt'98, LNCS 1514, pp 25-34, 1998
[6] D. Boneh, Twenty years of attacks on the RSA cryptosystem, 1999.
[7] http://www.rsa.com/rsalabs/node.asp?id=2216

RSA选用小公钥指数(e=3)真的不安全吗?相关推荐

  1. 为什么RSA 公钥指数(e=65537)

    1. 引言 学术界普遍认为绝对不能选用e=3作为RSA公钥指数,就好像说我们再也不能用md5一样.但实际上,md5今天仍然广泛使用.一个密码算法在理论上被攻破,并不等于实践中就一定会有安全风险.比如, ...

  2. RSA加密算法(公钥+私钥加密)

    公开密钥加密 公开密钥加密(public-key cryptography),也成为非对称加密,是密码学的一种算法,他需要两个密钥,一个是公开密钥,另一个是私有密钥,一个用作加密的时候,另一个则用作解 ...

  3. rsa私钥和公钥_如何创建RSA公钥和私钥?

    rsa私钥和公钥 RSA is an algorithm used for Cryptography. It was patented until 2000 in the USA (not the w ...

  4. python rsa 公钥解密_python利用rsa库做公钥解密的方法教程

    前言 对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文.D 和 N 的组合就是私钥(private key). 算法的加密 ...

  5. 签名算法sha256withrsa,RSA数字证书公钥私钥生成,base64转码和文件日志

    RSA数字证书公钥密钥生成: 在Linux系统下运行以下命令生成: 如果提示输出密码,可以为空,直接回车 生成的公钥rsa_public_key.pem和密钥rsa_private_key.pem文件 ...

  6. 怎样选择合适的PoE交换机?POE交换机选用小常识!

    交换机除了普通交换机外还有POE交换机,POE交换机主要用来给POE设备进行供电,免去复杂的网络设备供电接线,实现的更加方便网络覆盖,那么,我们如何选择一款合适的交换机至关重要.接下来飞畅科技的小编就 ...

  7. C#中用RSA算法生成公钥和私钥

    转自:https://www.cnblogs.com/micenote/p/7862989.html C#中用RSA算法生成公钥和私钥 方法一: 公钥密钥生成后,保存在同名文件夹下面,如下图: 公钥密 ...

  8. 使用RSA生成一对公钥和私钥

    使用RSA生成一对公钥和私钥 package com.demoinfo.support.utils;import sun.misc.BASE64Decoder; import sun.misc.BAS ...

  9. iOS安全之RSA加密/生成公钥、秘钥 pem文件

    在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于 ...

最新文章

  1. 光荣与梦想 | XMove动作捕捉系统(一)
  2. CentOS如何查看端口是被哪个应用/进程占用
  3. python 条形图图注怎么集中注意力_如何用每个条形图的总和(Matplotlib)注释堆积条形图?...
  4. acme云服务器生成证书_使用 acme.sh 申请 SSL 证书并且定期自动更新
  5. 优秀博客链接(linux c/c++ java go php android ios 前端 j2ee windows linux 算法 ACM 深度/机器学习 AI opencv nlp)
  6. 一起读懂传说中的经典:受限玻尔兹曼机
  7. 使用JAVASCRIPT实现弹出框,过一段时间自动消失
  8. python企业微信特定用户_python3调用企业微信api!开发一款属于自己的企业微信...
  9. WinPE作为启动硬盘
  10. 解决Visual Studio 2008 下,打开.dbml(LINQ) 文件时,提示The operation could not be completed. 的问题。...
  11. UVa 116 (多段图的最短路) Unidirectional TSP
  12. easymock接口模拟_EasyMock好又严格的模拟
  13. 【数学建模】模糊综合评价模型
  14. log4cpp 使用完全手册
  15. 使用CSS给文字添加描边效果
  16. python数据标注工具_数据标注工具大全汇总,有了这些工具再也不用自己开发了...
  17. win10网络诊断为DNS服务器未响应,Win10系统下电脑无法连接网络诊断提示DNS服务器未响应解决方法...
  18. matlab改变图像像素吗,在图像中随机更改像素值程序——matlab
  19. 解决方案的四种落地形态
  20. SVN误删的文件可以恢复

热门文章

  1. 装饰者设计模式,简单代码实现
  2. 数据结构与算法之选择排序图文详解及代码 (C++实现)
  3. Java 接口(interface)的用途和好处
  4. c++ 多重背包状态转移方程_串讲:控制理论:全状态反馈控制(FSFB)
  5. 怎么把一台华为路由器配置为FTP服务器?
  6. gpu的单位表示_GPU编程1--GPU中的基本概念
  7. 阿里云联合中国信通院发布《云计算开放应用架构》标准
  8. 安全容器的发展与思考
  9. 云原生生态周报 Vol.10 | 数据库能否运行在 K8s 当中?
  10. 加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...