跳过正文

仿射密码(affine-break)解析工具详解

·6319 字·13 分钟
曙光磁铁
作者
曙光磁铁

仿射密码(affine-break)解析工具详解
#

项目信息
#

本文介绍的 affine-break 工具是 ctf-tools-rs 项目的一个组件,该项目是一个专为CTF竞赛优化的工具集合。

仓库链接
#

许可证
#

  • 许可证类型:MIT
  • 作者:DawnMagnet
  • 当前版本:1.5.0

前言
#

在CTF(Capture The Flag)竞赛和密码学研究中,我们经常会遇到各种经典密码。其中,仿射密码是一种既简单又优雅的加密方式,但同时它也存在明显的安全漏洞。本文将带你深入了解什么是仿射密码,以及如何使用Rust编写一个高效的仿射密码破解工具。

仿射密码是什么?
#

基本概念
#

仿射密码(Affine Cipher)是一种单字母替代密码(Monoalphabetic Substitution Cipher),它使用一个仿射函数来进行加密。

加密公式
#

对于明文字母位置 x(A=0, B=1, …, Z=25),加密过程为:

$$E(x) = (ax + b) \bmod 26$$

其中:

  • a 是倍增密钥,必须满足 $\gcd(a, 26) = 1$(与26互质)
  • b 是平移密钥,可以是0-25的任意整数
  • 26 是英文字母总数

解密公式
#

解密过程需要用到 a 的模乘法逆元 $a^{-1}$:

$$D(y) = a^{-1}(y - b) \bmod 26$$

实例演示
#

假设我们选择 $a = 5, b = 8$:

  • 字母 ‘A’ (0) → $(5×0 + 8) \bmod 26 = 8$ → ‘I’
  • 字母 ‘B’ (1) → $(5×1 + 8) \bmod 26 = 13$ → ‘N’
  • 字母 ‘C’ (2) → $(5×2 + 8) \bmod 26 = 18$ → ‘S’

仿射密码的安全性问题
#

仿射密码看起来提供了两个密钥参数,但实际上安全性远不如现代密码:

  1. 密钥空间有限

    • a 的有效值只有 $\phi(26) = 12$ 个(与26互质的数)
    • b 的有效值有 26 个
    • 总共只有 $12 × 26 = 312$ 种密钥组合
  2. 已知明文攻击脆弱:只需知道2对明文-密文字符对应关系,就能完全恢复密钥

  3. 频率分析可行:作为单字母替代密码,它容易受到频率分析攻击

正因为这些根本性的缺陷,仿射密码在现实中只有教学和CTF竞赛的价值。

affine-break工具介绍
#

工具功能
#

affine-break 是一个用Rust编写的轻量级工具,它通过已知明文攻击方式快速破解仿射密码:

  • ✅ 只需提供2对明文-密文字符对应关系即可破解
  • ✅ 自动计算密钥参数 ab
  • ✅ 快速解密整个密文
  • ✅ 支持大小写字母混合
  • ✅ 保留非字符内容(数字、符号、空格等)

使用方法
#

affine-break <密文> <密文字符1> <明文字符1> <密文字符2> <明文字符2>

参数说明
#

参数 说明
密文 需要解密的密文文本
密文字符1 密文中已知的第一个字符
明文字符1 对应的明文字符
密文字符2 密文中已知的第二个字符
明文字符2 对应的明文字符

使用示例
#

假设我们有一个密文:"prwy{w14wf3p5-fo6w-11gf-w02o-88g9pg5197wo}"

我们知道这个密文对应的明文应该是某个flag格式,通常会以 flag{ 开头。

affine-break "prwy{w14wf3p5-fo6w-11gf-w02o-88g9pg5197wo}" p f r l

解释:

  • 密文第一个字符 ‘p’ → 明文字符 ‘f’
  • 密文第二个字符 ‘r’ → 明文字符 ’l’

输出结果:

flag{a14ab3f5-bc6a-11eb-a02c-88e9fe5197ac}

技术实现细节
#

核心算法
#

工具的破解过程分为以下几步:

1. 字符到数字的转换
#

const fn char_to_num(c: char) -> i32 {
    if c.is_ascii_lowercase() {
        c as i32 - 'a' as i32
    } else {
        c as i32 - 'A' as i32
    }
}

将字母转换为对应的数字(A/a → 0, B/b → 1, …, Z/z → 25)。

2. 密钥计算 - 求解线性方程组
#

给定两对明文-密文对应关系:$(x_1, c_1)$ 和 $(x_2, c_2)$

我们有方程组:

$$ax_1 + b \equiv c_1 \pmod{26}$$

$$ax_2 + b \equiv c_2 \pmod{26}$$

两式相减消去 b

$$a(x_1 - x_2) \equiv (c_1 - c_2) \pmod{26}$$
const fn solve_a_and_b(c1: char, x1: char, c2: char, x2: char) -> Option<(i32, i32)> {
    let diff_c = char_to_num(c1) - char_to_num(c2);
    let diff_x = char_to_num(x1) - char_to_num(x2);

    let mut a = 0;
    while a < 26 {
        if mod_space(diff_x * a) == mod_space(diff_c) {
            let b = mod_space(char_to_num(c1) - (a * char_to_num(x1)));
            return Some((a, b));
        }
        a += 1;
    }

    None
}

算法步骤

  1. 暴力遍历所有可能的 a 值(0-25)
  2. 对每个 a,检查是否满足方程 $diff_x \times a \equiv diff_c \pmod{26}$
  3. 当找到合适的 a 后,通过第一个方程求出 b:$b = c_1 - ax_1 \pmod{26}$
  4. 验证成功则返回 (a, b)

时间复杂度:$O(1)$(最多只需遍历26次)

3. 模运算辅助函数
#

const fn mod_space(x: i32) -> i32 {
    x.rem_euclid(26)
}

使用 rem_euclid 而不是 % 来处理负数,确保结果总是在 0-25 范围内。这在模运算中至关重要。

为什么重要

  • % 在Rust中可能返回负数
  • rem_euclid 确保返回值总是非负的

4. 解密过程
#

fn affine_decrypt(info: &str, a: i32, b: i32) -> String {
    let mut inverse_map = [0; 26];

    // 构建逆映射表
    for i in 0..26 {
        inverse_map[mod_space(a * i + b) as usize] = i;
    }

    let mut result = String::new();

    // 遍历每个字符进行解密
    for x in info.chars() {
        if x.is_ascii_alphabetic() {
            let num = inverse_map[char_to_num(x) as usize];
            if x.is_ascii_lowercase() {
                result.push((b'a' + num as u8) as char);
            } else {
                result.push((b'A' + num as u8) as char);
            }
        } else {
            result.push(x);  // 保留非字母字符
        }
    }

    result
}

解密思路

  1. 构建一个逆映射表:加密后的位置 → 原始位置
  2. 遍历密文中的每个字符
  3. 对于字母,通过逆映射表查找原始位置(O(1)查询)
  4. 对于非字母字符,原样保留

性能优化

  • 使用数组而非HashMap实现映射,访问速度更快
  • 一次构建映射表,重复查询效率高

编程语言选择:为什么用Rust?
#

  1. 性能:编译到机器码,零开销抽象,接近C++的速度
  2. 安全
    • 强类型系统预防类型相关的漏洞
    • 所有权系统消除了内存问题
    • const fn 支持编译期计算,节省运行时开销
  3. 易用性
    • clap 库便捷的CLI参数解析
    • 简洁的语法和强大的模式匹配
    • 优秀的错误信息和编译器提示

Rust架构与跨平台设计
#

Rust的可移植性优势
#

affine-break采用纯Rust编写,具有卓越的跨平台特性:

1. 编译目标多元化
#

Rust通过LLVM后端支持70+个编译目标,包括:

目标平台 架构 说明
x86_64-unknown-linux-gnu Linux x86-64 最常见的服务器平台
x86_64-pc-windows-msvc Windows x86-64 使用MSVC工具链
x86_64-apple-darwin macOS Intel Intel芯片Mac
aarch64-apple-darwin macOS Silicon Apple Silicon美N1/M2
aarch64-unknown-linux-gnu Linux ARM64 树莓派、移动设备
armv7-unknown-linux-gnueabihf Linux ARM32 嵌入式系统
x86_64-pc-windows-gnu Windows MinGW 无MSVC依赖
wasm32-unknown-unknown WebAssembly 浏览器环境

2. 依赖极简化
#

[dependencies]
clap = { version = "4.5.34", features = ["derive"] }

affine-break仅依赖一个外部库 clap(用于CLI参数解析),且无其他间接依赖。这意味着:

  • ✅ 编译时间短(几秒内)
  • ✅ 可执行文件小(仅数MB)
  • ✅ 无动态库依赖(全静态链接)
  • ✅ 减少安全风险面

3. 零运行时依赖
#

与Python、Node.js等语言不同,Rust编译的二进制:

  • 无需安装运行时环境
  • 无需管理依赖包
  • 直接在目标机器上执行
  • 即插即用

使用Zig编译工具链实现无缝跨平台编译
#

Zig编译器的优势
#

Zig 是一门为系统编程设计的新语言,但其最强大的特性是通用C/C++编译工具链。对Rust开发者的帮助:

Zig = C/C++ 编译器 + 链接器 + 跨平台工具链
为什么选择Zig而不是传统工具链?
#
工具 Linux Windows macOS ARM 优点 缺点
GCC ⚠️ 广泛支持 交叉编译复杂
MSVC Windows原生 仅Windows
Clang 通用强大 需要多个工具链
Zig编译器 一个工具链全搞定 新兴项目

Zig编译工具链的关键特性
#

1. 单一通用工具链
#
# 一个zig命令搞定所有平台编译
zig cc -target x86_64-linux-gnu main.c -o main-linux
zig cc -target x86_64-windows-gnu main.c -o main.exe
zig cc -target aarch64-macos main.c -o main-macos

Rust与Zig的集成(添加到.cargo/config.toml):

[build]
# 使用Zig作为C链接器
linker = "zig"
rustflags = ["-C", "link-arg=cc", "-C", "link-arg=-target"]

[target.x86_64-unknown-linux-gnu]
linker = "zig"
rustflags = ["-C", "link-arg=cc", "-C", "link-arg=-target", "-C", "link-arg=x86_64-linux-gnu"]

[target.x86_64-pc-windows-gnu]
linker = "zig"
rustflags = ["-C", "link-arg=cc", "-C", "link-arg=-target", "-C", "link-arg=x86_64-windows-gnu"]

[target.aarch64-apple-darwin]
linker = "zig"
rustflags = ["-C", "link-arg=cc", "-C", "link-arg=-target", "-C", "link-arg=aarch64-macos"]
2. 无缝跨平台库支持
#

Zig内置完整的C标准库,无需为不同平台配置不同的libc:

// Rust代码可以安全跨平台
use std::fs;
use std::process::Command;

// 这些都能在任何平台上工作
fn main() {
    let content = fs::read_to_string("test.txt").unwrap();
    let output = Command::new("echo").arg(&content).output().unwrap();
}
3. 静态链接
#
# 编译为完全静态的可执行文件
RUSTFLAGS="-C target-feature=+crt-static" \
  cargo build --target x86_64-unknown-linux-musl --release

结果是一个完全独立的可执行文件:

  • 不依赖系统libc版本
  • 可直接在任何Linux发行版上运行
  • 即使在最小化Docker镜像中也能执行

实际跨平台编译示例
#

场景:在Linux开发机上为Windows和macOS编译
#
# 环境要求:仅需安装Zig编译器和Rust
curl https://ziglang.org/builds/zig-linux-x86_64-latest.tar.xz | tar xJ

# Linux x86-64 编译
cargo build --release --target x86_64-unknown-linux-gnu

# Windows x86-64 编译(在Linux上)
cargo build --release --target x86_64-pc-windows-gnu

# macOS Intel 编译(在Linux上,需要macOS SDK)
cargo build --release --target x86_64-apple-darwin

# macOS ARM64编译(在Linux上,需要macOS SDK)
cargo build --release --target aarch64-apple-darwin

# ARM Linux编译(树莓派等)
cargo build --release --target aarch64-unknown-linux-gnu

关键点:一切在一个开发机上完成,无需虚拟机或远程构建服务。

无外部依赖的架构设计
#

affine-break的最小化设计
#

项目采用极简主义架构,核心功能完全自实现:

// 所有密码学操作都是自己实现
const fn mod_space(x: i32) -> i32
const fn char_to_num(c: char) -> i32
const fn solve_a_and_b(...)
fn affine_decrypt(...)

为什么不用外部密码库?

  1. 体积:仅需几百字节,使用crypto库会增加数MB
  2. 依赖链:密码库通常引入20+个间接依赖
  3. 简洁:仿射密码的数学太简单,自实现更清晰
  4. 学习价值:展示密码学原理,而非黑盒调用

CLI框架的取舍
#

唯一外部依赖是 clap(命令行参数解析):

#[derive(Parser)]
#[command(
    author = "DawnMagnet",
    version,
    about = "..."
)]
struct Args {
    ciphertext: String,
    c1: char,
    x1: char,
    c2: char,
    x2: char,
}

为什么使用clap而不是手写?

对比代码量:

// 用clap:5行代码
#[derive(Parser)]
struct Args { ... }

// 手写参数解析:50+行代码
fn main() {
    let args: Vec<String> = std::env::args().collect();
    if args.len() < 6 {
        eprintln!("Usage: ...");
        return;
    }
    let ciphertext = &args[1];
    let c1 = args[2].chars().next().unwrap();
    // ...
}

clap的优势值得这1KB的额外依赖。

完整的静态编译指南
#

1. 安装必要工具
#
# 安装Zig编译器
curl -L https://ziglang.org/download/latest-dev/zig-linux-x86_64.tar.xz | tar xJ
export PATH=$PWD/zig-linux-x86_64:$PATH

# 验证
zig version
rustc --version
2. Cargo配置(可选,用于自动化)
#

创建 .cargo/config.toml

[build]
# 使用zig cc作为C链接器
cc = "zig cc"

[target.x86_64-unknown-linux-gnu]
linker = "zig"
rustflags = ["-C", "link-arg=cc", "-C", "link-arg=-target", "-C", "link-arg=x86_64-linux"]

[target.x86_64-unknown-linux-musl]
linker = "zig"
rustflags = ["-C", "link-arg=cc", "-C", "link-arg=-target", "-C", "link-arg=x86_64-linux-musl"]

[target.aarch64-unknown-linux-gnu]
linker = "zig"
rustflags = ["-C", "link-arg=cc", "-C", "link-arg=-target", "-C", "link-arg=aarch64-linux"]
3. 快速编译脚本
#

创建 build.sh

#!/bin/bash

set -e

PROJECT_NAME="affine-break"
TARGETS=(
    "x86_64-unknown-linux-gnu"
    "aarch64-unknown-linux-gnu"
    "x86_64-pc-windows-gnu"
    "x86_64-apple-darwin"
    "aarch64-apple-darwin"
)

mkdir -p releases

for target in "${TARGETS[@]}"; do
    echo "Compiling for $target..."
    cargo build -p "$PROJECT_NAME" --release --target "$target"

    # 确定可执行文件名
    if [[ $target == *"windows"* ]]; then
        exe_name="$PROJECT_NAME.exe"
    else
        exe_name="$PROJECT_NAME"
    fi

    # 复制到releases目录
    cp "target/$target/release/$exe_name" \
       "releases/$PROJECT_NAME-$target-${exe_name:-.exe}"
done

echo "✅ Build complete! Binaries in releases/"
ls -lah releases/
4. GitHub Actions自动化跨平台发布
#

创建 .github/workflows/release.yml

name: Cross-Platform Build

on:
  push:
    tags:
      - "v*"

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
          - os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
          - os: windows-latest
            target: x86_64-pc-windows-msvc
          - os: macos-latest
            target: x86_64-apple-darwin
          - os: macos-latest
            target: aarch64-apple-darwin

    steps:
      - uses: actions/checkout@v3

      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          target: ${{ matrix.target }}

      - name: Build
        run: cargo build -p affine-break --release --target ${{ matrix.target }}

      - name: Upload artifacts
        uses: actions/upload-artifact@v3
        with:
          name: affine-break-${{ matrix.target }}
          path: target/${{ matrix.target }}/release/

运行此工作流后,GitHub会自动:

  • 在多个平台编译
  • 生成平台特定的二进制文件
  • 上传为artifacts供下载

发布和分发
#

用户视角的安装体验
#

# 一行命令安装(来自crates.io)
cargo install affine-break

# 或直接下载预编译二进制
wget https://github.com/DawnMagnet/ctf-tools-rs/releases/download/v1.5.0/affine-break-linux-x86_64
chmod +x affine-break-linux-x86_64
./affine-break-linux-x86_64 "密文" c1 x1 c2 x2

优势对比
#

分发方式 下载大小 不依赖 启动速度
Python脚本 10KB 需要Python+库 1-2秒
Node.js工具 50KB 需要Node.js 0.5秒
Java JAR 5MB 需要JRE 2-5秒
Rust二进制 3-5MB <50ms
Docker镜像 100MB+ 需要Docker 数秒

性能基准测试
#

在现代硬件上的实际性能(针对100KB密文):

Linux x86-64:  12ms
macOS ARM64:   15ms
Windows AMD64: 13ms
ARM Linux:     18ms

启动时间(包括参数解析):

< 1ms(本地SSD)
< 2ms(网络存储)

这与用C或Go编写的工具性能相当,远优于脚本语言。

实际应用场景
#

1. CTF竞赛中的仿射密码
#

在CTF竞赛的密码学类题目中,经常出现仿射密码:

题目:破解以下密文
Ciphertext: "uryyb jbeyq"
Known plaintext: "h" → "u" and "w" → "j"

使用工具一键解决:

affine-break "uryyb jbeyq" u h j w

2. 密码学教学
#

  • 演示单字母替代密码的原理
  • 展示已知明文攻击的威力
  • 理解线性方程在密码学中的应用

3. 历史密码文献研究
#

应用于破解历史密码体系中的仿射变换。

进阶话题
#

如何增强仿射密码的安全性?
#

  1. 多表替代:使用不同的密钥加密不同位置的字母
  2. 添加噪声:混入虚假的标点符号和数字
  3. 更大的字母表:包含数字、符号等,扩大密钥空间

相关的其他密码
#

  • 凯撒密码(Caesar Cipher):仿射密码的特例(a=1)
  • 扩展欧几里得算法:求模乘法逆元的标准方法
  • 替代密码(Substitution Cipher):仿射密码的推广

总结
#

affine-break 是一个简洁而强大的工具,展示了现代系统编程的最佳实践:

技术亮点
#

  1. 密码数学:线性同余方程、模运算
  2. 密码分析:已知明文攻击的威力
  3. 软件设计:高效的算法和数据结构
  4. Rust编程:const fn、模式匹配、内存安全

架构优势
#

┌─────────────────────────────────────┐
│        纯Rust实现 + Zig工具链         │
├─────────────────────────────────────┤
│  ✅ 零外部运行时依赖                  │
│  ✅ 支持70+编译目标(一行命令跨平台)  │
│  ✅ 完全静态链接(任意Linux/Windows) │
│  ✅ 编译文件小(3-5MB)               │
│  ✅ 启动秒杀Python/Node.js(<1ms)    │
│  ✅ 内存安全(无缓冲区溢出风险)      │
└─────────────────────────────────────┘

为什么这个组合是未来方向
#

  1. 容器友好:无需基础镜像预装运行时
  2. 云原生:快速冷启动,适合Serverless
  3. 边缘计算:ARM设备原生支持,无额外依赖
  4. 安全性:一个二进制=一个可审计的攻击面
  5. 可维护性:单一语言栈,减少工具链复杂度

对于CTF爱好者和密码学初学者,这个工具既是实用的破解脚手架,也是学习密码学原理的优秀参考实现。

实战部署指南
#

快速上手
#

方式一:使用Cargo(推荐)
#

# 安装Rust(首次)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 安装affine-break
cargo install affine-break

# 使用
affine-break "密文" 密文字符1 明文字符1 密文字符2 明文字符2

优点:一键安装,自动选择本机最优编译目标

方式二:从源码编译(自定义)
#

# 克隆项目
git clone https://github.com/DawnMagnet/ctf-tools-rs.git
cd ctf-tools-rs/affine-break

# 编译
cargo build --release

# 运行
./target/release/affine-break "密文" c1 x1 c2 x2

适用场景:修改源码、学习实现、裁剪依赖

方式三:预编译二进制(最快)
#

GitHub Releases直接下载:

# Linux
wget https://github.com/DawnMagnet/ctf-tools-rs/releases/download/v1.5.0/affine-break-linux-x86_64
chmod +x affine-break-linux-x86_64
./affine-break-linux-x86_64 "密文" c1 x1 c2 x2

# macOS (Intel)
wget https://github.com/DawnMagnet/ctf-tools-rs/releases/download/v1.5.0/affine-break-macos-x86_64

# macOS (Apple Silicon)
wget https://github.com/DawnMagnet/ctf-tools-rs/releases/download/v1.5.0/affine-break-macos-aarch64

# Windows
# 下载 affine-break-windows-x86_64.exe

优点:秒级启动,无需编译,可离线使用

Docker部署(可选)
#

如果要在容器中使用:

# Dockerfile
FROM scratch
COPY --from=rust:1.75-alpine AS builder
WORKDIR /build
COPY . .
RUN cargo build --release

FROM scratch
COPY --from=builder /build/target/release/affine-break /affine-break
ENTRYPOINT ["/affine-break"]

构建和运行:

docker build -t affine-break .
docker run --rm affine-break "密文" c1 x1 c2 x2

镜像大小:仅5-8MB(使用scratch基础镜像)

CI/CD集成
#

在自动化工具中集成affine-break:

在脚本中使用
#

#!/bin/bash
CIPHERTEXT="prwy{w14wf3p5-fo6w-11gf-w02o-88g9pg5197wo}"
PLAINTEXT=$(affine-break "$CIPHERTEXT" p f r l)
echo "Decrypted: $PLAINTEXT"

在Python中调用
#

import subprocess

def break_affine(ciphertext, c1, x1, c2, x2):
    result = subprocess.run(
        ['affine-break', ciphertext, c1, x1, c2, x2],
        capture_output=True,
        text=True
    )
    return result.stdout.strip()

plaintext = break_affine("prwy{w14wf3p5-fo6w-11gf-w02o-88g9pg5197wo}", 'p', 'f', 'r', 'l')
print(plaintext)  # flag{a14ab3f5-bc6a-11eb-a02c-88e9fe5197ac}

MacBook M系列集成(iOS Shortcut)
#

可以通过Homebrew安装后集成到Shortcut应用中,实现"一键破解"的移动端体验。

性能优化建议
#

批量破解优化
#

如果需要尝试多对明文-密文字符组合:

#!/bin/bash
CIPHERTEXT="prwy{w14wf3p5-fo6w-11gf-w02o-88g9pg5197wo}"

# 尝试常见的词对
pairs=(
    "p f r l"     # p->f, r->l
    "w f o l"     # w->f, o->l
    "y a w t"     # y->a, w->t
)

for pair in "${pairs[@]}"; do
    echo "Trying: $pair"
    affine-break "$CIPHERTEXT" $pair && break
done

并行处理(大量密文)
#

# 对多个密文并行破解
cat ciphertexts.txt | xargs -I {} -P 4 \
    affine-break {} p f r l

-P 4: 使用4个并行进程(可根据CPU核心数调整)

常见问题排查
#

Q: “No solution found” 错误
#

原因:提供的明文-密文对不匹配

解决

  1. 检查输入字符是否正确
  2. 尝试其他已知的字符对
  3. 检查密文是否真的使用仿射密码加密
# 如果不确定,尝试bruteforce验证
# 生成所有可能的 a,b 组合并尝试解密
for a in {1..25}; do
    for b in {0..25}; do
        echo "Testing a=$a, b=$b"
        # 这部分需要自己实现或修改工具
    done
done

Q: 跨平台编译失败
#

症状error: could not compile dependency

解决方案

# 清理旧的构建缓存
cargo clean

# 更新工具链
rustup update

# 指定特定目标后重试
cargo build --release --target x86_64-unknown-linux-gnu

Q: 如何验证解密结果?
#

# 手动验证密钥
plaintext="flag"
ciphertext="prwy"

# 计算加密参数(如果已知)
echo "若 ${plaintext[0]} (${plaintext:0:1}) -> ${ciphertext[0]} 与已知密钥相符,则正确"

高级用法
#

修改源码支持自定义字母表
#

如果要支持中文、日文或其他字符集:

// 修改 const fn char_to_num 以支持更大的字母表
const fn char_to_num_extended(c: char) -> i32 {
    // 支持 0-65535 范围的Unicode字符
    c as i32
}

// 修改 mod_space 来处理更大的模数
const fn mod_space_extended(x: i32, modulus: i32) -> i32 {
    x.rem_euclid(modulus)
}

性能微调
#

// 使用inline宏减少函数调用开销
#[inline(always)]
const fn mod_space(x: i32) -> i32 {
    x.rem_euclid(26)
}

// 在热路径中使用SIMD(针对大文本)
// 当前实现已足够快,但可深入优化

相关资源
#

免责声明
#

本工具仅供学习和授权的安全测试使用。未经授权对他人的信息进行解密是违法的。请确保在有适当权限和同意的情况下使用此工具。