当前位置: 首页 > news >正文

序列密码算法RC4的实现与攻击

RC4的实现

RC4的整个过程可以清晰地分为两个阶段:
密钥调度算法:使用密钥混淆一个内部状态数组(S盒),为生成密钥流做准备
伪随机生成算法:在KSA基础上,不断地生成伪随机的密钥流字节

密钥调度算法

KSA是初始化步骤。接收一个长度可变的密钥(1-256byte),来打乱一个256字节的状态向量 S

from typing import List, Generatordef ksa(key: bytes) -> List[int]:"""Key-Scheduling Algorithm (KSA)返回初始化并经过 KSA 的 S 数组(长度 256)"""key_len = len(key)# 1. 初始化 S 数组s = list(range(256))j = 0# 2. 用密钥打乱 Sfor i in range(256):j = (j + s[i] + key[i % key_len]) & 0xFFs[i], s[j] = s[j], s[i]return s

伪随机生成算法

PRGA接收KSA处理过的 S 数组,产生密钥流字节

def prga(s: List[int]) -> Generator[int, None, None]:"""Pseudo-Random Generation Algorithm (PRGA)输入已经运行过 KSA 的 S 数组,返回一个生成器,按需产生字节(0-255)"""# 复制 S 以保证纯函数行为s = s.copy()i = 0j = 0while True:i = (i + 1) & 0xFFj = (j + s[i]) & 0xFFs[i], s[j] = s[j], s[i]t = (s[i] + s[j]) & 0xFFyield s[t]

接口

def keystream(key: bytes, n: int) -> bytes:"""返回给定 `key` 下的前 `n` 个 RC4 keystream 字节"""s = ksa(key)g = prga(s)return bytes(next(g) for _ in range(n))def encrypt(key: bytes, plaintext: bytes) -> bytes:"""使用 RC4 对 `plaintext` 进行加密/解密(异或)并返回 ciphertextRC4 是对称流密码,加密和解密相同"""ks = keystream(key, len(plaintext))return bytes(p ^ k for p, k in zip(plaintext, ks))def hexd(b: bytes) -> str:return b.hex()

keystream:先用 ksa 准备好 S 数组,然后用 prga 创建一个生成器,最后通过 next(g) 调用 n 次生成器,收集前 n 个字节并打包成 bytes 对象
encrypt:先生成与明文等长的密钥流,然后使用一个生成器表达式将明文和密钥流的每个字节逐个进行异或,最终返回密文

调用演示

key = b"key"
pt = b"Hello, world!"
c = encrypt(key, pt)
m = encrypt(key, ct)

对RC4的攻击

对密钥重用的攻击

如果使用同一个密钥 K 加密两个不同的明文 P1 和 P2,会得到两个密文 C1 和 C2
C1 = P1 ⊕ RC4(K)
C2 = P2 ⊕ RC4(K)
攻击者截获 C1 和 C2 后,可以将它们进行异或:
C1 ⊕ C2 = (P1 ⊕ RC4(K)) ⊕ (P2 ⊕ RC4(K)) = P1 ⊕ P2
密钥流 RC4(K) 被完全消除,攻击者现在得到了 P1 ⊕ P2

def attack_key_reuse_demo():# 场景设定reused_key = b'HardcodedPassword'# 攻击者可能已知的消息 (例如,一个标准协议的问候语)known_plaintext1 = b"client hello"# 用户想要保密的真实消息secret_plaintext2 = b"secret data"print(f"重用的密钥: {reused_key.decode()}")print(f"已知明文1: {known_plaintext1.decode()}")print(f"秘密明文2: {secret_plaintext2.decode()}\n")ciphertext1 = encrypt(reused_key, known_plaintext1)ciphertext2 = encrypt(reused_key, secret_plaintext2)print("服务器发送了两个密文...")print(f"密文1: {hexd(ciphertext1)}")print(f"密文2: {hexd(ciphertext2)}\n")# 攻击者 Eve 的操作# 截获 C1 和 C2,并计算它们的异或c1_xor_c2 = bytes(a ^ b for a, b in zip(ciphertext1, ciphertext2))print(f"计算 C1 ⊕ C2: {hexd(c1_xor_c2)}\n")# 攻击者知道 P1,现在可以恢复 P2print(f"已知 P1: {known_plaintext1.decode()}")recovered_plaintext2 = bytes(a ^ b for a, b in zip(c1_xor_c2, known_plaintext1))print(f"恢复的秘密 P2: {recovered_plaintext2.decode()}\n")

对密钥流偏向攻击

研究发现,RC4生成的密钥流并非完全随机,某些字节或字节组合出现的概率会偏离理论值
原理
RC4的密钥流存在多种已知的偏向,其中最著名的是:
第二字节偏向:密钥流的第二个字节是 0x00 的概率约为 1/128,而不是期望的 1/256
初始字节偏向:密钥流的前几个字节(例如前256字节)存在多种统计偏差

def attack_keystream_bias_demo():"""演示RC4密钥流偏斜攻击"""import collectionsimport secrets# 场景:WEP 风格 key = IV(3 bytes) || secret(1 byte)secret = secrets.token_bytes(1)print(f"真实 secret (1 byte): 0x{secret.hex()}\n")# 捕获若干个使用不同 IV 的第一个 keystream 字节(明文假设为 0x00,密文即 keystream)num_captures = 2000captures = []  # list of (iv, observed_keystream_byte)for _ in range(num_captures):iv = secrets.token_bytes(3)ks0 = keystream(iv + secret, 1)[0]captures.append((iv, ks0))# 先展示观察到的分布freq = collections.Counter(b for (_, b) in captures)print(f"捕获数量: {num_captures}")print("观察到的前 10 个最常见 keystream 字节:")for byte, c in freq.most_common(10):print(f"  0x{byte:02x}: {c} ({c/num_captures:.4f})")# 方法 A:严格穷举,要求候选与所有捕获逐一匹配def brute_force_recover(captures):for candidate in range(256):cand = bytes([candidate])ok = Truefor iv, observed in captures:if keystream(iv + cand, 1)[0] != observed:ok = Falsebreakif ok:return candreturn Nonerecovered = brute_force_recover(captures[:12])  # 用12个包尝试严格匹配if recovered is not None:print(f"恢复到 secret: 0x{recovered.hex()}")else:print("未找到完全匹配的候选(样本不足或非完全匹配场景)")# 方法 B:统计评分(更稳健)——对每个候选统计与观察值相等的次数,得分最高者为猜测scores = []for candidate in range(256):cand = bytes([candidate])score = 0# 只使用部分样本for iv, observed in captures[:500]:if keystream(iv + cand, 1)[0] == observed:score += 1scores.append((candidate, score))scores.sort(key=lambda x: x[1], reverse=True)print("\n统计评分(前 5 个候选):")for cand, sc in scores[:5]:print(f"  candidate=0x{cand:02x} score={sc}")best = scores[0][0]print(f"\n统计评分猜测的 secret: 0x{best:02x} (真实: 0x{secret.hex()})")
http://www.zskr.cn/news/50474.html

相关文章:

  • arch配置swap分区并做休眠设置
  • 2025 年结晶装备厂家最新推荐榜:连续结晶器、煤化工蒸发设备、盐硝分离器等工业核心装备权威品牌指南多效蒸发/硫酸钠蒸发结晶器/煤化工盐硝分离器公司推荐
  • 2025 最新新能源装备厂家企业品牌权威推荐榜,含芒硝结晶器/碳化热解设备/碳酸锂碳化提纯设备优质厂商
  • 【AI白皮书】AI原生应用及其架构
  • 2025 年最新脚轮厂家推荐!万向脚轮、工业脚轮、医用脚轮等全品类优质厂家品牌权威排行榜,助力采购决策设备脚轮/重型脚轮/医疗脚轮公司推荐
  • 2025 最新干燥装备厂家权威推荐排行榜,盘式/桨叶/流化床/闪蒸/真空喷雾干燥器优质公司精选
  • 2025 最新净水器厂家推荐排行榜:母婴级安全、无阻垢弱碱、杜邦 / 陶氏 RO 膜,高性价比国货品牌精选斯里兰卡椰壳炭/制冰/DIY/厨下净水器公司推荐
  • 2025年11月三丰粗糙度仪,三丰圆度仪,三丰物镜厂家最新推荐,精准检测与稳定性能深度解析
  • Python遍历pandas数据方法总结
  • 2025 年 11 月温州法律顾问律师,温州婚姻律师,温州刑事律师最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 2025年跨境电商ERP系统权威推荐:赛狐ERP系统适配多平台、多站点智能化管理,跨境电商卖家首选
  • P14507 缺零分治 mexdnc
  • 2025年共享观光车厂家权威推荐榜单:封闭式观光车/电动观光车/电动游览车源头厂家精选
  • 聚焦成都留学服务:藤校申请、语言培训、就业规划一站式解决,2025优质机构榜单出炉
  • 用wireshark抓包
  • everything如何设置 取消打开时默认置顶在最前面
  • 50019_基于微信小程序的校园互助系统
  • 2025年有实力的维修企业一览:行业洞察与权威推荐
  • 2025年国内工业制冷公司口碑排行榜前十强权威解析
  • 留学生课程衔接选哪家?98%满意度机构榜单,覆盖30+国家学业适配方案
  • rag调优
  • 2025留学生求职机构首选清单,高录取率/名企资源/个性化规划一键get
  • 主标题:2025 年 11 月杭州护照翻译,杭州出生证翻译,杭州签证翻译,聚焦资质、案例、售后的五家机构深度解读
  • 过敏
  • 2025年南京办公楼监控代理公司权威推荐榜单:监控批发/监控代理/监控经销商源头公司精选
  • 2025 最新温州律师事务所推荐!电商财税 / 执行 / 法律顾问 / 婚姻 / 刑事领域顶尖律师事务所权威榜单
  • 2025年11月国内窗帘电机工厂综合实力排行榜单
  • 肌肉扭伤与骨折
  • pytest 接口自动化测试面试问题汇总
  • MySQL Elasticsearch HBase Hive Redis 设计哲学和应用场景的区别