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

news/2025/11/15 16:09:43/文章来源:https://www.cnblogs.com/luminescence/p/19225698

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.mzph.cn/news/966346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年RFID服装标签批发厂家权威推荐榜单:RFID服装吊牌标签/服装门店盘点标签/服装零售电子标签源头厂家精选

服装行业数字化转型加速,RFID技术作为新质生产力的代表,正深刻改变着服装产业的运营模式。据QYResearch调研统计,2025年全球服装RFID方案市场保持稳定增长态势。 RFID服装标签通过无线射频识别技术,为每一件服装赋…

2025 年木包装箱厂家最新推荐榜:木托盘、出口木箱、钢边木箱、免熏蒸包装箱优质厂家权威测评

在全球工业物流领域,木包装箱作为精密仪器、重型设备运输的核心保障,其品质直接决定物流安全与成本控制。据国际包装协会(IOPA)2024 年度测评数据显示,全球仅 38% 的木包装箱厂家能同时满足承重误差≤2%、防潮性能…

arch配置swap分区并做休眠设置

原有的swap分区是zram0,但是它的UUID每次启动都会变化,因此不能用来做休眠。 另外分出一块16G的分区格式化为swap。 sudo swapoff -a # 先关掉当前所有 swap(安全起见) sudo mkswap /dev/nvme1n1p4 sudo blkid /…

2025 年结晶装备厂家最新推荐榜:连续结晶器、煤化工蒸发设备、盐硝分离器等工业核心装备权威品牌指南多效蒸发/硫酸钠蒸发结晶器/煤化工盐硝分离器公司推荐

在化工、锂电新能源等产业持续升级的背景下,结晶装备作为物料分离提纯的核心设备,其技术水平与可靠性直接决定生产效率与产品品质。当前市场装备同质化与技术壁垒并存,为精准筛选优质品牌,本次榜单基于国际蒸发技术…

2025年遥控平板车厂家权威推荐榜单:平板运输车/顶升电动平车/电动地平车源头厂家精选

在智能制造与绿色物流浪潮的推动下,2023年国内电动平板车市场规模已达87.6亿元,预计2025年将突破120亿元。遥控平板车以其高效、安全、灵活的特性,正成为现代工厂和仓库中不可或缺的搬运工具。 选择合适的遥控平板车…

2025 最新新能源装备厂家企业品牌权威推荐榜,含芒硝结晶器/碳化热解设备/碳酸锂碳化提纯设备优质厂商

引言 全球清洁能源转型进入加速期,新能源装备市场规模年复合增长率超 18%,但行业乱象仍制约发展。为破解选型难题,本次榜单联合国际能源装备协会(IEEMA)、全球清洁技术测评中心(GCTC),基于三大核心测评体系:技…

【AI白皮书】AI原生应用及其架构

1.1 大模型技术发展回顾和产业价值 1.1.1 大模型发展回顾与展望 2022年11月,ChatGPT横空出世,模型即服务(MaaS)模式快速兴起,AI从实验室走向商业场景。2024年,OpenAI推出o1模型和4o模型,大模型技术迎来质的飞跃…

2025 年最新脚轮厂家推荐!万向脚轮、工业脚轮、医用脚轮等全品类优质厂家品牌权威排行榜,助力采购决策设备脚轮/重型脚轮/医疗脚轮公司推荐

引言 脚轮作为物流、工业、医疗等领域短程移动的核心部件,其品质直接关联设备安全与运营效率。据国际脚轮工业协会(ICCA)最新测评数据显示,全球合格脚轮产品仅占市场总量的 62%,劣质产品导致的设备故障占比达 38%…

2025 最新干燥装备厂家权威推荐排行榜,盘式/桨叶/流化床/闪蒸/真空喷雾干燥器优质公司精选

引言 在化工、锂电新能源、制药等产业高速发展的背景下,干燥装备作为核心物料处理设备,其技术水平直接关乎生产效率与产品品质。据国际干燥技术协会(IDTA)最新测评数据显示,全球高端干燥装备市场中,具备智能化、…

接口自动化,用例独立还是用例复用

"用例独立。用例相互之间没有依赖,随便拉出一条用例就能执行。" 这是我在文章《接口自动化框架设计漫谈V1.0》提到的,也是我一直坚持的接口自动化用例设计方式。 这么做的依据是某些开源测试框架是这样设计…

2025 最新净水器厂家推荐排行榜:母婴级安全、无阻垢弱碱、杜邦 / 陶氏 RO 膜,高性价比国货品牌精选斯里兰卡椰壳炭/制冰/DIY/厨下净水器公司推荐

健康饮水需求日益升级,净水器已成为家庭必备家电,但市场乱象让消费者决策艰难:“滤芯刺客” 导致年换芯成本飙升至数千元,部分产品虚假宣传 “母婴级” 却过滤不达标,售后响应慢、乡镇安装难等问题频发,中间商加…

【Python3.13】官网学习之控制流

if if语句是最常见的控制流: >>> x = int(input("Please enter an integer: ")) Please enter an integer: 42 >>> if x < 0: ... x = 0 ... print(Negative changed to zero…

2025 年 11 月空气电加热器,法兰电加热器,土壤修复电加热器厂家最新推荐,聚焦资质、案例、售后的七家企业深度解读

随着工业生产对加热设备的精准性、安全性和环保性要求不断提升,空气电加热器、法兰电加热器、土壤修复电加热器作为关键配套设备,其品质直接影响生产效率与合规性。据行业协会最新测评数据显示,当前市场上仅 35% 的…

2025年11月三丰粗糙度仪,三丰圆度仪,三丰物镜厂家最新推荐,精准检测与稳定性能深度解析

引言在全球精密制造产业持续升级的背景下,三丰粗糙度仪、三丰圆度仪、三丰物镜作为高精度检测的核心设备,其品质稳定性与服务专业性直接决定生产效率与产品合格率。据国际精密测量协会最新测评数据显示,当前市场中该…

C# 中,依赖注入(DI)的实现方式 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

mns 1115

A 简单题,一眼秒了。详情见 洛谷题解与第一个评论 B throw std::bad_brain("syncing failed"); throw std::bad_statement("可以根据询问的结果来决定策略"); 总之由于我一开始认为策略必须是固定…

Python遍历pandas数据方法总结

一、使用 iterrows() iterrows() 是 pandas 中最常用的遍历 DataFrame 行的方法之一。它将 DataFrame 的每一行作为一个 Series 进行迭代。 import pandas as pd def iterrows_example(): # 创建一个示例 DataFrame da…

2025 年 11 月温州电商财税律师,温州执行律师,温州法律顾问律师最新推荐,聚焦资质、案例、售后的七家机构深度解读

在商业活动日益复杂的当下,专业的法律支持成为企业与个人规避风险、保障权益的关键。无论是电商企业面临的财税合规难题、执行案件中的财产处置困境,还是企业日常运营所需的法律顾问服务,优质的律师资源都能提供核心…

P2966 [USACO09DEC] Cow Toll Paths G 题解

P2966 [USACO09DEC] Cow Toll Paths G 题解Floyd只有50pts,原因竟是......P2966 [USACO09DEC] Cow Toll Paths G 题解 题目链接 我的博客 思路 首先看数据范围。发现 \(1 \leq n \leq 250\),此题还是一个最短路问题,…

【System Beats!】第八章 异常控制流

异常控制流 控制流与异常控制流控制流:一条条指令的执行顺序 从一条指令到下一条指令的过渡称为控制转移。 控制转移的常见类型:跳转、分支、调用、返回,即对程序状态的变化作出反应。 现代系统通过使控制流发生突变…