P1rate5ec/caesar-salad

GitHub: P1rate5ec/caesar-salad

一个基于频率分析和重合指数校验的凯撒密码编码、解码与自动破解工具,专为密码学教学和 CTF 准备而设计。

Stars: 0 | Forks: 0

# 🥗 Caesar Salad ### 清脆的经典密码分析。 ![python](https://img.shields.io/badge/python-3.11%2B-3776AB?logo=python&logoColor=white) ![license](https://img.shields.io/badge/license-MIT-blueviolet) ![tests](https://img.shields.io/badge/tests-26%20passing-brightgreen) ![interface](https://img.shields.io/badge/interface-CLI%20%2B%20Web-22c55e) ![transmits](https://img.shields.io/badge/transmits-nothing%20by%20default-success) *两千年的历史,依然是所有人首选的密码。*
`caesar-salad` 用于对 Caesar 密码进行编码、解码和**破解**。给定密文 且没有密钥的情况下,它会根据英语字母统计信息对全部 26 种可能的 偏移量进行评分,并提供最有可能的明文——附带置信度结论和 重合指数(Index-of-Coincidence)健全性检查,让你知道尝试破解 Caesar 密码 到底是不是正确的工具。 它的存在是为了让一个教训深入人心:**替换密码会将其结构 直接泄露到加密过程中。** 它是一个用于教学、CTF 准备和 演示的工具——而不是用于保密的工具。 ## 工作原理 Caesar 密码将每个字母移动固定的数量 *k*(mod 26)。解码 只需移动 *-k*。破解则是要在不被告知的情况下,判断使用了 *哪一个* *k*。 ``` ciphertext ──► for k in 0..25 ──► decode(text, k) ──► score each candidate ──► rank │ ┌───────────────────────────────┴───────────────┐ │ chi-squared vs. English letter frequencies │ lower = more English │ minus a bonus per common English word found │ ("the", "and", "is"…) └────────────────────────────────────────────────┘ ``` 三个信号驱动了该分析: 1. **卡方频率距离。** 每个候选明文的字母 分布会与标准英语频率进行比较。英语文本得分 *低*;混乱的偏移得分*高*。这是一个干净的统计量——没有截断, 因此强有力的候选者会保持其排序(以前的版本将分数 截断为零,从而丢失了正确猜测之间的排名)。 2. **常用词奖励。** 真实的单词(`the`、`and`、`is`、…)会在单词 边界上进行匹配,并从分数中扣除。真正的解码通常会在频率 *和*单词上双双胜出,因此这些信号会相互增强。 3. **重合指数(IoC)。** 两个随机抽取的 字母相等的概率。英语 ≈ 0.067,均匀随机 ≈ 0.038。至关重要的是, Caesar 偏移只是*重新标记*了字母,因此 **IoC 在密码下是不变的** ——在密文上计算时,它可以预先告诉你该文本是否 是合理的英语偏移(相对于随机的、多字母的或非英语的)。 **置信度**结论(`high`/`medium`/`low`)将分数相对于第二名的优势 与获胜者的单词计数混合在一起,并且对于 太短而不可信的样本(< 20 个字母),会降级为 `low`。 ### 数据模型 没有数据库。`CrackCandidate` 包含 `shift`、`score`、`plaintext`、 `explanation` 和 `word_hits`。`CrackReport` 使用 `letters`、`index_of_coincidence`、`ioc_verdict` 和 `confidence` 包装排名的候选者。两者 都可以序列化为纯 JSON,以便进行脚本化处理。 ## 安装与设置 ``` cd caesar-salad python -m venv .venv # Windows: .venv\Scripts\activate POSIX: source .venv/bin/activate pip install -r requirements.txt pip install -e . # optional: installs the `caesar-salad` command cp .env.example .env # optional: sets serve host/port ``` 没有可编辑安装?每个命令也可以通过 `PYTHONPATH=src python -m caesar_salad.cli …` 运行。 ## CLI 用法 全局:`--plain` / `--no-color` 强制使用无样式文本。当设置了 `NO_COLOR` 或 stdout 不是终端时,颜色也会自动禁用(因此管道保持干净)。 任何命令上的 `--json` 都会向 stdout 输出**纯 JSON**,没有任何修饰。 输入可以来自 `--text`、`--file PATH`(≤ 5 MiB)或**管道 stdin**。 ### `encode` / `decode` — 已知偏移量 ``` caesar-salad encode --text "meet at dawn" --shift 7 echo "meet at dawn" | caesar-salad encode --shift 7 caesar-salad decode --file secret.txt --shift 3 --json ``` 偏移量归一化为 mod 26(`--shift 29` ≡ `--shift 3` ≡ `--shift -23`)。JSON: ``` {"operation": "encoded", "shift": 7, "input_length": 12, "result": "tlla ha khdu"} ``` ### `crack` — 未知偏移量 ``` caesar-salad crack --text "wkh vhfuhw phhwlqj lv dw qrrq elg wkh eulgjh dw gdzq" caesar-salad crack --file intercept.txt --top 3 cat intercept.txt | caesar-salad crack --json caesar-salad crack --text "..." --all # show all 26 shifts ``` 终端输出示例: ``` ┌───────── 🥗 caesar-salad ─────────┐ │ crunchy classical cryptanalysis │ └───────────────────────────────────┘ ┌──────────────────────── cryptanalysis ─────────────────────────┐ │ letters analysed: 42 │ │ index of coincidence: 0.0697 (English-like distribution) │ │ confidence in top pick: HIGH │ └────────────────────────────────────────────────────────────────┘ │ shift │ score │ words │ plaintext ────┼────────┼─────────┼────────┼────────────────────────────────────────── ★ │ 3 │ -24.68 │ 5 │ the secret meeting is at noon bid the ... │ 15 │ 97.60 │ 0 │ hvs gsqfsh asshwbu wg oh bccb pwr hvs ... │ 18 │ 214.94 │ 0 │ esp dpncpe xppetyr td le yzzy mto esp ... ``` `--plain` 提供可用 grep 搜索的行: ``` # letters=42 ioc=0.0697 confidence=high (类似 English 的分布 ...) shift= 3 score=-24.680 words=5 the secret meeting is at noon bid the bridge at dawn shift=15 score= 97.600 words=0 hvs gsqfsh asshwbu wg oh bccb pwr hvs pfwrus oh rokb ``` ### `serve` — 本地浏览器工作区 ``` caesar-salad serve # http://127.0.0.1:5066 caesar-salad serve --host 127.0.0.1 --port 8080 ``` 一个单页工作区,用于交互式地编码 / 解码 / 破解,并显示 相同的 IoC 和置信度读数。 **内置的安全防护:** - 默认绑定到 `127.0.0.1`(环回接口)。任何其他主机都会打印警告—— 仅在您获得授权可以进行服务对外开放的网络上公开它。 - `--debug` 启用 Werkzeug 交互式调试器,这在任何回溯页面上都是 **远程代码执行**。它总是会发出警告,并且在 非环回主机上会被**拒绝**,除非您传递 `--unsafe-allow-remote-debug`。 - 请求体大小受限(256 KiB),分析的文本受限(20 000 个字符); 非数字的偏移量输入会被强制转换,绝不会导致崩溃。 ## 退出代码 | 代码 | 含义 | | --- | --- | | `0` | 成功 | | `1` | 用户错误(输入错误、文件不可读、拒绝不安全的服务) | | `2` | argparse 使用错误(未知标志、缺少必需的参数) | | `130` | 被中断(Ctrl-C) | ## 测试 ``` cd caesar-salad PYTHONPATH=src python -m pytest -q ``` 快速且轻依赖:无网络,无休眠。涵盖了密码转换、 修正后的评分、偏移下的 IoC 不变性、置信度结论、CLI 输入 处理 / 大小限制 / JSON 输出、`serve` 安全拒绝,以及 Flask 应用的输入强化(非数字偏移量 → 200 而不是 500,超大请求体 → 413)。 ## 前置条件 Python 3.11+,以及 `flask`、`rich` 和 `pytest`(参见 `requirements.txt`)。 ## 🏷️ 为什么叫 "Caesar Salad"? Caesar 的密码,被 tossing(抛拌)。它之所以配得上 *salad*(沙拉)这个名字,是因为只有 25 个错误答案和 1 个正确答案,而整个工作就是从碗中挑出那清脆爽口的部分。频率分析完成了挑选工作。接着,重合指数检查提出了一个直击要害的后续问题——*我们确定吗?*——这样当密文太短而无法判断时,该工具可以坦然承认,而不是自信满满地塞给你一堆废话。 ## 🔬 这个工具是如何构建的 **目的。** 一个频率分析 Caesar 密码破解器,被重新构想为 值得信赖的密码分析教学工具。给定密文且没有密钥的情况下,它 会对所有 26 种偏移量进行排名,告诉你它的置信度,而且——至关重要的是—— 在你费心之前就会告诉你该文本是否是一个合理的英语偏移。 **工作原理。** 对于每个偏移量 `k`,它会解码并根据 与英语字母频率的卡方距离(越低 = 越像英语)减去常用词 奖励来对候选者进行评分。它还会在 *密文*上计算重合指数:因为 Caesar 偏移只是重新标记了字母,IoC 在 密码下是不变的,所以它可以预先告诉你文本是类英语的 (≈0.067)、平坦/随机的(≈0.038),还是完全其他的东西。 **出色的 CLI。** 一个密码分析摘要面板(分析的字母、IoC + 结论、 一个带有颜色编码的置信度徽章),一个排名的候选表格,在 最佳选择上有一颗洋红色的星星,获胜行显示为绿色,使用 `--all` 显示所有 26 种偏移量,以及 stdin 管道。 **关键改进。** *功能性:* 修复了一个评分错误,该错误中卡方值 被截断为零(`max(0.0, ...)`),这压平了每个强有力的候选者并 破坏了排名顺序——现在是一个干净的、未截断的统计量,可以正确排序; 添加了 IoC 结论和高/中/低置信度混合(分数相对于 第二名的优势 × 获胜者的单词计数,在 20 个字母以下降级)。*安全性:* 文件/stdin 读取限制在 5 MiB,并使用 UTF-8 `errors='replace'`;Flask 应用 将请求体限制在 256 KiB,分析文本限制在 20k 字符,强制转换非数字偏移量 输入,而不是返回 500 错误,并且在脱离环回接口时拒绝 `--debug`。 **示例。** ``` PYTHONPATH=src python -m caesar_salad.cli crack \ --text "wkh vhfuhw phhwlqj lv dw qrrq elg wkh eulgjh dw gdzq" ``` ## ⚖️ 授权使用与安全准则 **这些是用于您拥有或 获得明确授权评估的系统、文件、网络和人员的防御性工具。** 在运行任何内容之前阅读此内容: - **授权不是可选项。** 钓鱼模拟、网络扫描、IP 信誉查询和 Web 应用探测都会触及他人的系统或 数据。请先获得书面授权。有几个工具*拒绝执行操作*,直到您 主张权限(`--yes`、`--authorized-training`、`--i-have-authorization`、 `--i-am-authorized` 等等)。 - **默认安全。** 每个 Web UI 都绑定到 `127.0.0.1`(环回接口)。出站流量、 实时发送和主动扫描都被置于显式标志之后——dry-run(试运行)、 被动或拒绝并警告始终是默认设置。 - **杜绝意外的危险操作。** Flask `--debug`(Werkzeug 交互式 调试器在任何回溯页面上都是远程代码执行)会受到响亮的警告,并且 在脱离环回接口时会被完全拒绝。不受信任的输入有大小限制、经过验证,并 被渲染为无害状态,因此恶意的文件或日志行不会导致崩溃——或接管—— 您的终端。 - **输出中不含机密。** API 密钥保留在请求头中,密码来自 环境变量,不会记录或打印任何敏感信息。 这些不是攻击性工具。它们不包含任何漏洞利用、凭证 收集器和 payload。如果某个工具*可能*被滥用,它在构建上就会 抵御这种滥用。 ## 🧪 开发 ``` python -m venv .venv && source .venv/bin/activate pip install -e . pytest -q # 26 tests, no network, no sleeps caesar-salad --help ``` ## 📄 许可证 在 **MIT License** 下发布。参见 [LICENSE](LICENSE)。
防御性工具。无漏洞利用,无 payload,无凭证收集器。
标签:Python, 凯撒密码, 动态分析, 古典密码分析, 安全规则引擎, 密码学, 手动系统调用, 无后门, 逆向工具, 频率分析