50、RSA密钥生成的简单后门

RSA密钥生成的简单后门

1. 引言

RSA公钥密码系统和数字签名方案如今已进入公共领域,任何人都能将其用于软件产品、智能卡等,以保障信息的机密性和真实性。然而,用户如何判断所使用的RSA实现是否安全呢?比如微软CryptoAPI系统曾出现的“NSA - KEY”事件。软件开发人员和智能卡制造商很容易在RSA密钥生成方案中嵌入后门,而用户却难以察觉,这会使他们能够破坏RSA公钥密码系统和数字签名方案的机密性和真实性。

本文介绍了在RSA密钥生成方案中嵌入后门的极其简单的方法。其中三种方案会生成两个指定大小的真正随机素数p和q,得到公钥乘积n = pq,同时生成的公私钥指数对(d, e)看似随机,但方案的设计者仅根据公共信息(n, e)就能轻松分解n。第四种方案类似于Young和Yung的PAP方法,但更安全,能适用于任意公钥指数e,如3、17、65537,它通过在n的表示中嵌入后门来实现对n的分解。

这些方法对标准密钥生成过程的运行时间影响很小,从时间角度几乎难以察觉。并且推测,带后门的密钥分布方式使得即使有大量样本,也难以与真正的随机密钥区分开来。方案不依赖生成算法对之前执行的记忆,假设算法在无记忆设备上运行,排除了基于伪随机生成的简单方法。

2. 回顾与相关工作

RSA密码系统和数字签名方案基于生成两个大致相等大小的随机素数p和q,以及随机指数d、e,满足de ≡ 1 (mod φ(n)),其中n = pq。

RSA密钥生成算法如下

Algorithm 2.1 ( RSA key generation )
1: Pick random primes p, q of the right size, let n := pq be a k-bit integer.
2: repeat
3: Pick a random odd e such that |e| ≤ k.
4: until gcd(e, φ(n)) = 1.
5: Compute d := e−1 mod φ(n).
6: return(p, q, d, e).

公钥对(n, e)可公开,用于加密(me mod n)和解密(cd mod n)消息,私钥函数md mod n可用于生成签名,ce mod n可用于验证签名。

Wiener证明了如果d < n.25/3,小私钥指数可以被有效恢复,Boneh和Durfee最近将此结果改进为d < n.292。并且已知,若有de - 1这样的φ(n)的倍数满足de ≡ 1 (mod φ(n)),就很容易分解n。

Boneh、Durfee和Frankel最近有两个有趣的结果,允许在已知小公钥指数e、n和部分私钥指数d的情况下恢复完整的d。

下面给出两个定理用于构建方案:
- 定理1 :设t是范围在[|n|/4, …, |n|/2]的整数,e是范围在[2t, …, 2t + 1]的素数。若已知(n, e)和d的t个最高有效位,则可以在多项式时间poly(|n|)内计算出完整的d并分解n。
- 定理2 :设t是范围在[1, …, |n|/2]的整数,e是范围在[2t, …, 2t + 1]的整数。若已知(n, e)、d的t个最高有效位和|n|/4个最低有效位,则可以在多项式时间poly(|n|)内分解n。

此外,Rivest和Shamir证明了p的|n|/3个最高有效位足以有效分解n,Coppersmith将所需位数减少到|n|/4。

3. 隐藏指数密钥生成算法
3.1 隐藏小私钥指数δ

“作弊”的RSA - HSDβ密钥生成方案的基础是在方案中嵌入后门β,用于隐藏小私钥指数δ的实例。

RSA - HSDβ密钥生成算法如下

Algorithm 3.1 ( RSA-HSDβ key generation )
1: Pick random primes p, q of the appropriate size, set n := pq.
2: repeat
3: Pick a random odd δ such that gcd(δ, φ(n)) = 1 and |δ| ≤ k/4.
4: Compute ϵ := δ−1 mod φ(n); e := πβ(ϵ).
5: until gcd(e, φ(n)) = 1.
6: Compute d := e−1 mod φ(n).
7: return(p, q, d, e).

该算法生成的实例满足所有要求的属性,只是d、e并非完全随机,而是在通过πβ对小指数δ的模φ(n)逆的映射所指定的较小可能性集合内随机。步骤3可通过设置δ := δ / gcd(δ, φ(n))使其不重复,但会使δ的分布偏向较小的值。

在运行时间方面,该算法与标准RSA密钥生成算法2.1相比表现良好。步骤1和6的运行时间与原算法相同,步骤2到5的循环次数与原循环大致相同,循环内的gcd计算次数约为原算法的三倍。只要πβ(ϵ)的计算相对于gcd等计算可忽略不计,运行时间的差异就可以很小。

当n、e公开后,给定秘密后门β,分解n的算法如下

Algorithm 3.2 ( RSA-HSDβ attack (n, e) )
1: Given (n, e), compute ϵ := π−1β (e).
2: Compute δ from (n, ϵ) using Wiener’s low exponent attack.
3: Given (ϵ, δ) factor n as p,q.
4: return(p, q).

在攻击时,若使用Boneh - Durfee密码分析攻击而非Wiener攻击,可使用更大的δ值,最大到n0.292。

该方法的主要缺点是生成的e的大小约为|e| ≈ |n|,这意味着对e的大小的任何限制(|e| < c|n|,c < 1)都会使攻击失效。

3.2 隐藏小素数公钥指数ϵ

“作弊”的RSA - HSPEβ密钥生成方案的基础是在方案中嵌入后门β,用于隐藏小素数公钥指数ϵ的实例以及对应私钥指数δ的部分信息。

RSA - HSPEβ密钥生成算法如下

Algorithm 3.3 ( RSA-HSPEβ key generation )
1: Pick random primes p, q of the appropriate size, set n := pq.
2: repeat
3: Pick a prime ϵ such that gcd(ϵ, φ(n)) = 1 and |ϵ| = k/4.
4: Compute δ := ϵ−1 mod φ(n); δH := δ⌉k4 ; e := πβ(δH :ϵ).
5: until gcd(e, φ(n)) = 1.
6: Compute d := e−1 mod φ(n).
7: return(p, q, d, e).

该算法生成的实例满足所有要求的属性,只是d、e并非完全随机,而是在通过πβ对小素数公钥指数ϵ的δH和ϵ的拼接的映射所指定的较小可能性集合内随机。生成的拼接(δH : ϵ)大小为k/2,通过额外的随机填充,可以生成范围在√n < e < φ(n)的指数e。

在运行时间方面,该算法与标准RSA密钥生成算法2.1相比表现较差。步骤1和6的运行时间与原算法相同,步骤2到5的循环次数与原循环大致相同,循环内的gcd计算次数约为原算法的三倍(因为ϵ是素数),而且生成素数ϵ比较耗时,尽管|e| = |n|/4。

该方法的主要优点是简单,且生成的密钥大小可以小到|n|/2。

当n、e公开后,给定秘密后门β,分解n的算法如下

Algorithm 3.4 ( RSA-HSPEβ attack (n, e) )
1: Given (n, e), compute (δH :ϵ) := π−1β (e).
2: Compute δ from (n, δH, ϵ) using BDF low public prime exponent attack (Theorem 1) with partial knowledge of private exponent.
3: Given (ϵ, δ) factor n as p,q.
4: return(p, q).
3.3 隐藏小公钥指数ϵ

“作弊”的RSA - HSEβ密钥生成方案的基础是在方案中嵌入后门β,用于隐藏小公钥指数ϵ的实例以及对应私钥指数δ的部分信息。

RSA - HSEβ密钥生成算法如下

Algorithm 3.5 ( RSA-HSEβ key generation )
1: Pick random primes p, q of the appropriate size, set n := pq.
2: repeat
3: Pick a random ϵ such that gcd(ϵ, φ(n)) = 1 and |ϵ| = t.
4: δ := ϵ−1 mod φ(n); δH := δ⌉t; δL := δ⌋k4 ; e := πβ(δH :δL :ϵ).
5: until gcd(e, φ(n)) = 1.
6: Compute d := e−1 mod φ(n).
7: return(p, q, d, e).

该算法生成的实例满足所有要求的属性,只是d、e并非完全随机,而是在通过πβ对小公钥指数ϵ的δH、δL和ϵ的拼接的映射所指定的较小可能性集合内随机。步骤3可通过设置ϵ := ϵ / gcd(ϵ, φ(n))使其不重复,但会使ϵ的分布偏向较小的值。

为避免被检测,需要对δL的ℓ(ℓ ≥ 2)个最低有效位进行随机化(或丢弃),其中2ℓ|φ(n)且2ℓ + 1̸ | φ(n),因为ϵδ ≡ 1 mod 2ℓ,所以δ⌋ℓ总是ϵ⌋ℓ模2ℓ的逆。同时,δH的最高有效位分布不均匀,最好将δH指定为描述δ相对于n位置的二进制序列。

以下是几种方案的对比表格:
| 方案名称 | 生成的e大小 | 优点 | 缺点 |
| ---- | ---- | ---- | ---- |
| RSA - HSDβ | |e| ≈ |n| | 运行时间与标准算法接近 | 对e大小限制敏感 |
| RSA - HSPEβ | √n < e < φ(n),可小到|n|/2 | 简单,密钥可较小 | 生成素数ϵ耗时 |
| RSA - HSEβ | 灵活 | 可隐藏小公钥指数及部分私钥信息 | 需要处理冗余信息 |

下面是RSA - HSDβ密钥生成和攻击的mermaid流程图:

graph TD;
    A[开始] --> B[生成p,q,n];
    B --> C[循环选择δ];
    C --> D[计算ϵ,e];
    D --> E{gcd(e, φ(n)) = 1?};
    E -- 否 --> C;
    E -- 是 --> F[计算d];
    F --> G[返回(p,q,d,e)];
    H[已知(n,e)] --> I[计算ϵ];
    I --> J[计算δ];
    J --> K[分解n];
    K --> L[返回(p,q)];

综上所述,这些方案表明,用户不应依赖第三方提供的RSA密钥生成方案。在智能卡模型中尤其如此,除非有保证表明密钥生成过程未被嵌入此类攻击。即使在软件实现中,若没有实际的源代码,也很难确切了解密钥生成机制。软件公司为了市场优势而保密代码,这使得反编译程序以理解其实现变得困难。

RSA密钥生成的简单后门

4. 方案总结与安全建议

上述介绍的几种RSA密钥生成后门方案,各有特点和适用场景。为了更清晰地理解它们,我们可以从多个维度进行总结。

方案名称 核心思想 生成e的特点 运行时间 攻击方法 安全风险
RSA - HSDβ 嵌入后门β隐藏小私钥指数δ 约为 e n
RSA - HSPEβ 嵌入后门β隐藏小素数公钥指数ϵ及部分私钥信息 可小到 n /2 生成素数ϵ耗时
RSA - HSEβ 嵌入后门β隐藏小公钥指数ϵ及部分私钥信息 灵活 需处理冗余信息 依赖已知定理 冗余信息可能被检测

从这些方案可以看出,攻击者可以通过巧妙的设计,在不显著改变密钥生成过程时间的情况下,嵌入后门,使得仅根据公开信息(n, e)就能分解n。这对使用RSA加密的系统安全构成了严重威胁。

为了应对这些安全风险,我们提出以下建议:
1. 自主实现密钥生成 :尽量自己实现RSA密钥生成算法,避免使用第三方提供的方案。这样可以确保对密钥生成过程的完全控制,减少被嵌入后门的风险。
2. 审查源代码 :如果必须使用第三方的密钥生成代码,一定要审查其源代码。仔细检查代码中是否存在异常的逻辑或隐藏的后门。
3. 增加随机性 :在密钥生成过程中,增加随机性的来源。例如,使用高质量的随机数生成器,确保生成的素数和指数真正随机。
4. 定期更新密钥 :定期更换RSA密钥,减少密钥被破解的风险。即使密钥被嵌入了后门,定期更新也可以降低攻击者利用后门的可能性。

5. 未来研究方向

虽然本文介绍的方案已经展示了RSA密钥生成中存在的安全隐患,但这只是冰山一角。未来的研究可以从以下几个方向展开:

  • 更隐蔽的后门设计 :攻击者可能会设计出更加隐蔽的后门,使得在不改变密钥生成过程的任何可观测特征的情况下,仍然能够轻松分解n。研究如何检测和防范这类后门是一个重要的方向。
  • 新的攻击方法 :随着数学和密码学的发展,可能会出现新的攻击方法,能够突破现有的安全防线。研究人员需要不断探索新的攻击手段,以便及时发现和修复安全漏洞。
  • 增强密钥生成的安全性 :除了上述提到的建议,还可以研究如何从根本上增强RSA密钥生成的安全性。例如,结合其他加密算法或技术,提高密钥的抗攻击能力。

以下是未来研究方向的mermaid流程图:

graph LR;
    A[更隐蔽的后门设计] --> B[检测和防范研究];
    C[新的攻击方法] --> D[发现和修复漏洞];
    E[增强密钥生成安全性] --> F[结合其他技术];
    B --> G[提高系统安全性];
    D --> G;
    F --> G;

总之,RSA密钥生成的安全性是一个复杂而重要的问题。我们需要不断关注和研究,采取有效的措施来保护用户的信息安全。在使用RSA加密时,要保持警惕,不轻易相信第三方提供的密钥生成方案,确保自己的数据得到可靠的保护。

希望通过本文的介绍,能够让大家对RSA密钥生成的安全问题有更深入的了解,从而在实际应用中做出更明智的选择。

第三方支付功能的技术人员;尤其适合从事电商、在线教育、SaaS类项目开发的工程师。; 使用场景及目标:① 实现微信与支付宝的Native、网页/APP等主流支付方式接入;② 掌握支付过程中关键的安全机制如签名验签、证书管理与敏感信息保护;③ 构建完整的支付闭环,包括下单、支付、异步通知、订单状态更新、退款与对账功能;④ 通过定时任务处理内容支付超时与概要状态不一致问题:本文详细讲解了Java,提升系统健壮性。; 阅读应用接入支付宝和建议:建议结合官方文档与沙微信支付的全流程,涵盖支付产品介绍、开发环境搭建箱环境边学边练,重点关注、安全机制、配置管理、签名核心API调用及验签逻辑、异步通知的幂等处理实际代码实现。重点与异常边界情况;包括商户号与AppID获取、API注意生产环境中的密密钥与证书配置钥安全与接口调用频率控制、使用官方SDK进行支付。下单、异步通知处理、订单查询、退款、账单下载等功能,并深入解析签名与验签、加密解密、内网穿透等关键技术环节,帮助开发者构建安全可靠的支付系统。; 适合人群:具备一定Java开发基础,熟悉Spring框架和HTTP协议,有1-3年工作经验的后端研发人员或希望快速掌握第三方支付集成的开发者。; 使用场景及目标:① 实现微信支付Native模式与支付宝PC网页支付的接入;② 掌握支付过程中核心的安全机制如签名验签、证书管理、敏感数据加密;③ 处理支付结果异步通知、订单状态核对、定时任务补偿、退款及对账等生产级功能; 阅读建议:建议结合文档中的代码示例与官方API文档同步实践,重点关注支付流程的状态一致性控制、幂等性处理和异常边界情况,建议在沙箱环境中完成全流程测试后再上线。
matlab2python 这是一个Python脚本,用于将Matlab文件或代码行转换为Python。此项目处于alpha阶段。 该实现严重依赖于Victor Leikehman的SMOP项目。 当前实现围绕SMOP构建,具有以下差异: 力图生成不依赖libsmop的代码,仅使用如numpy这样的标准Python模块。 使用常见缩写如np而非全称numpy。 尝试重排数组和循环索引,从0开始而不是1。 不使用来自libsmop的外部类matlabarray和cellarray。 增加了对Matlab类的基本支持,类体中声明的属性在构造函数中初始化。 因上述改动,产出代码“安全性较低”,但可能更接近用户自然编写的代码。 实现相对直接,主要通过替换SMOP使用的后端脚本,这里称为smop\backend_m2py.py。 一些函数替换直接在那里添加。 额外的类支持、导入模块以及其他微调替换(或说是黑客技巧)在matlabparser\parser.py文件中完成。 安装 代码用Python编写,可按如下方式获取: git clone https://github.com/ebranlard/matlab2python cd matlab2python # 安装依赖项 python -m pip install --user -r requirements.txt # 让包在任何目录下都可用 python -m pip install -e . # 可选:运行测试 pytest # 可选:立即尝试 python matlab2python.py tests/files/fSpectrum.m -o fSpectrum.py 使用方法 主脚本 存储库根目录下的主脚本可执行,并带有一些命令行标志(部分直接取自SMOP)。要将文件file.m转换为file.py,只需输入:
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值