Lazy loaded image
加解密
🔑深入理解RSA加密
Words 5653Read Time 15 min
2024-12-28
2025-12-26
type
Post
status
Published
date
Dec 28, 2024
slug
rsa
summary
RSA是以其发明者Ron Rivest、Adi Shamir和Leonard Adleman姓氏首字母命名的公钥加密算法,于1977年提出,1978年正式发表。RSA是第一个既能用于数据加密也能用于数字签名的算法,其安全性基于大整数分解的困难性——将两个大质数的乘积分解回原来的质数在计算上是不可行的。
tags
加解密
category
加解密
icon
password
上次编辑时间
Dec 26, 2025 07:46 AM
comment
AI 总结

引言:非对称加密的革命

在对称加密的世界里,AES凭借其高效和安全成为主流。但当我们需要在不安全信道上安全传输密钥,或者需要验证数据来源的真实性时,对称加密就显得力不从心了。1977年,RSA算法的出现彻底改变了这一局面——它首次实现了非对称加密,使得加密和解密可以使用不同的密钥,开启了现代密码学的新纪元。在爬虫数据采集过程中,RSA常出现在登录加密、API签名、数据传输等关键环节,理解它对于应对现代网站安全措施至关重要。

1. RSA加密算法简介

RSA是以其发明者Ron Rivest、Adi Shamir和Leonard Adleman姓氏首字母命名的公钥加密算法,于1977年提出,1978年正式发表。RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。发送者能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称之为公钥和私钥。如果用公钥进行加密,则只能通过对应的私钥去解密,如果用私钥进行加密,则只能通过对应的公钥去解密。两者之间有数字相关,该加密算法的原理就是对一极大整数做因数分解的困难行来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。RSA是第一个既能用于数据加密也能用于数字签名的算法,其安全性基于大整数分解的困难性——将两个大质数的乘积分解回原来的质数在计算上是不可行的。
RSA的划时代意义在于解决了密钥分发难题:
  • 公钥可以公开给任何人,用于加密数据
  • 私钥由接收方秘密保存,用于解密数据
  • 无需事先共享密钥,即可建立安全通信

2. RSA算法的数学原理

2.1 基础数论概念

模运算(Modular Arithmetic)

text

欧拉函数 φ(n)

  • 对于质数p:φ(p) = p-1
  • 对于两个不同质数p和q:φ(pq) = (p-1)(q-1)
  • 表示小于n且与n互质的正整数个数

模反元素(模逆元)

对于整数a和n,如果存在整数b使得:
text

2.2 RSA核心数学原理

RSA的安全性建立在大数分解难题之上,其数学基础是欧拉定理:
text
由此推导出RSA的加密解密过程:
  1. 选择两个大质数p和q
  1. 计算n = p × q
  1. 计算φ(n) = (p-1)(q-1)
  1. 选择整数e,满足1 < e < φ(n)且gcd(e, φ(n)) = 1
  1. 计算d,满足d × e ≡ 1 (mod φ(n))
  1. 公钥:(e, n),私钥:(d, n)
  1. 加密:c ≡ m^e (mod n)
  1. 解密:m ≡ c^d (mod n)

3. RSA密钥生成详细过程

3.1 质数选择

3.2 密钥生成完整流程

4. RSA加密模式与填充方案

4.1 纯RSA加密的问题

原始RSA加密(教科书RSA)存在安全问题:
  1. 确定性加密:相同明文产生相同密文
  1. 小明文攻击:如果明文太小,可能直接开方恢复
  1. 无完整性保护:无法检测密文是否被篡改

4.2 填充方案的必要性

为了解决上述问题,必须对明文进行填充:

PKCS1 v1.5(旧标准)

text

OAEP(最优非对称加密填充)- 现代推荐

4.3 混合加密系统

由于RSA计算较慢,实际中常与对称加密结合使用:
  1. 生成随机的对称密钥(如AES密钥)
  1. 用RSA公钥加密对称密钥
  1. 用对称密钥加密实际数据
  1. 传输加密后的对称密钥和加密数据

5. RSA的数字签名功能

RSA不仅可以加密,还可以用于数字签名,验证数据的完整性和来源真实性。

5.1 签名流程

  1. 签名生成:对数据的哈希值用私钥加密
  1. 签名验证:用公钥解密签名,与数据哈希值比对

6. 常见应用场景与算法特征

6.1 应用场景

Web安全

  • HTTPS/TLS握手:RSA用于交换对称密钥
  • 登录加密:密码使用RSA公钥加密后传输
  • API签名验证:使用RSA验证请求的合法性

数字证书

  • SSL证书:验证网站身份
  • 代码签名:验证软件来源可信
  • 文档签名:确保文档完整性和来源

区块链与加密货币

  • 比特币地址:基于椭圆曲线,但概念源自RSA
  • 智能合约验证:验证交易签名

6.2 算法特征识别

在爬虫中识别RSA使用的特征:
  1. 数据特征
      • 公钥通常包含模数n和指数e
      • 密钥长度:2048位、3072位或4096位
      • 常见指数:65537(0x10001)
      • 使用Base64编码的PEM格式密钥
  1. 代码特征
      • JavaScript中搜索RSApublicKeyencrypt等关键词
      • 常见库:jsencrypt、node-rsa、Web Crypto API
      • 函数调用如new JSEncrypt().encrypt(data)
  1. 网络特征
      • 登录请求包含encryptedPassword或类似字段
      • 响应中包含X-SignatureX-Public-Key
      • 初始页面加载时返回公钥

7. 爬虫中处理RSA的实战方法

7.1 分析流程

notion image

7.2 静态分析技巧

查找JavaScript中的RSA逻辑

7.3 动态分析工具

  1. 浏览器开发者工具
      • 在加密函数上设置断点
      • 监控网络请求,找到公钥获取请求
      • 使用Console执行代码测试
  1. 自动化提取公钥

    7.4 实战处理策略

    情况1:固定公钥

    情况2:动态公钥

    情况3:完整登录流程模拟

    8. Python实现完整示例

    9. 知识点串联与实战总结

    9.1 完整爬虫处理RSA的流程

    1. 识别阶段
        • 检查登录表单或API请求中的加密字段
        • 搜索页面源代码中的RSA相关关键词
        • 分析网络请求的密钥获取过程
    1. 分析阶段
        • 定位公钥存储位置(HTML、JS、API)
        • 确定加密模式(OAEP、PKCS1 v1.5)
        • 分析密钥更新机制(固定或动态)
    1. 实现阶段
        • 实现公钥提取和解析逻辑
        • 模拟前端加密过程
        • 处理可能的挑战响应机制
    1. 集成阶段
        • 创建RSA加密中间件
        • 实现密钥缓存和更新
        • 错误处理和重试机制

    9.2 高级技巧与注意事项

    处理JavaScript加密库差异

    应对反爬虫策略

    • 动态密钥:每次会话使用不同的公钥
    • 密钥绑定:公钥与用户会话或时间戳绑定
    • 额外验证:加密数据需要包含时间戳、随机数等

    性能优化建议

    1. 密钥缓存:缓存提取的公钥,避免重复提取
    1. 连接复用:使用会话保持连接,减少握手开销
    1. 并行处理:批量处理需要加密的数据
    1. 适当降级:对于不重要数据,考虑其他验证方式

    结语:RSA在爬虫中的定位与展望

    RSA算法作为非对称加密的基石,在现代Web安全中扮演着关键角色。对于爬虫开发者而言,理解RSA不仅是技术挑战,更是对网络安全机制的深入认识。通过本文的学习,你应该能够:
    1. 理解RSA的数学原理,知其然更知其所以然
    1. 识别RSA的应用场景,快速定位加密逻辑
    1. 掌握RSA的破解策略,在合法范围内解决问题
    1. 实现RSA的Python模拟,重现前端加密行为
    上一篇
    一文读懂公钥、私钥(建议收藏)
    下一篇
    爬虫数据采集加密算法全景指南
    • Author:24th
    • URL:https://24th.top/article/rsa
    • Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!

    Comments
    Loading...