djareddirdjad/crypto-attack-simulator
GitHub: djareddirdjad/crypto-attack-simulator
纯 C 从零实现的密码学攻击演示工具,手写大整数库与 AES-128 并复现 RSA 攻击、填充预言机、经典密码分析和时序侧信道等密码分析方法。
Stars: 0 | Forks: 0
# crypto-attack-simulator
一个从零开始的 C 语言实现,包含经典和现代密码学攻击,
基于手动实现的大整数库(无 GMP)和从零开始的 AES-128 实现(无 OpenSSL)构建。本仓库中的每一个攻击都是针对真实且有效的密码实现运行的——而不是模拟。
## 为什么
大多数“密码学”作品集项目只是调用一下库就结束了。而这个项目
自行构建了数论和分组密码本身,然后利用它们来
破解故意设置的存在漏洞的环境:从弱参数中恢复 RSA 私钥和
明文,从真实的 AES-CBC 填充预言机中提取明文,利用统计密码分析破解经典密码,以及通过时序侧信道恢复秘密。
## 状态 — 已完成
- [x] Bignum 核心:add/sub/mul/div/mod, modpow, gcd/egcd/modinv, isqrt, iroot
- [x] 经典密码分析:频率分析,Caesar 破解,Vigenere 密钥长度检测(重合指数)+ 密钥恢复
- [x] RSA 攻击:Fermat 分解,Wiener 攻击,共同模数攻击,Hastad 广播攻击
- [x] AES-128(FIPS-197,已通过官方测试向量验证)+ CBC 模式 + PKCS#7 填充预言机攻击
- [x] 针对简单早期退出比较的时序侧信道攻击
所有模块均已通过已知向量进行测试(参见下文的“验证”)。
## 构建
```
make # builds ./crack
make test # builds and runs the bignum self-test suite
```
## 使用方法
```
./crack bignum-selftest verify the math core
./crack classical freq letter frequency histogram
./crack classical caesar brute-force break a Caesar cipher
./crack classical vigenere [maxlen] break a Vigenere cipher (default maxlen=20)
./crack rsa fermat factor n when p,q are close
./crack rsa wiener recover a small private exponent d
./crack rsa common-modulus recover m from same message under two coprime exponents
./crack rsa hastad ... recover m broadcast unpadded to e recipients
./crack padding-oracle demo full AES-CBC padding oracle attack demo
./crack timing demo full timing side-channel attack demo
```
所有 RSA 参数均接受十进制或以 `0x` 为前缀的十六进制。
## 验证
- Bignum:modpow/modinv/gcd/isqrt 均已通过已知值进行检查(`make test`)
- AES-128:encrypt/decrypt 逐位通过官方 FIPS-197 测试向量验证(密钥 `000102030405060708090a0b0c0d0e0f`,明文 `00112233445566778899aabbccddeeff` -> 密文 `69c4e0d86a7b0430d8cdb78070b4c55a`)
- Wiener 攻击:恢复教科书示例(n=90581, e=17993 -> d=5, p=379, q=239)
- Fermat 分解:恢复一个由两个相差 54 的 16 位素数组成的模数的 p,q
- 共同模数攻击:恢复在 e=65537 和 e=65539 下加密的 30 位消息
- Hastad 广播:恢复在 3 个独立生成的 ~100 位模数上以 e=3 广播的消息
- Vigenere:从约 500 个字母的密文中恢复 9 个字母的密钥("discovery")
- 填充预言机:仅使用填充有效性响应(无需访问密钥)恢复 47 个字符的秘密消息
- 时序攻击:仅使用响应时间测量恢复 11 个字符的密码
## 架构
```
include/ public headers, one per module
src/
bignum.c arbitrary-precision arithmetic (base 2^32 limbs, schoolbook algorithms)
aes.c AES-128 block cipher + CBC mode + PKCS#7 padding, from scratch
classical.c frequency analysis, Caesar breaking, Vigenere key recovery
rsa_attacks.c Fermat factorization, Wiener's attack, common modulus, Hastad broadcast
padding_oracle.c vulnerable oracle simulation + byte-at-a-time CBC attack
timing_attack.c naive early-exit comparison + timing-based recovery
main.c CLI dispatcher
```
Bignum 和 AES 层均为基础/教科书级别的实现——
它们是正确的,但故意设计为非常量时间或未经过侧信道加固的,
因为它们存在的目的是演示攻击,而不是防御攻击。
标签:RSA攻击, 侧信道攻击, 大数运算, 密码分析, 密码学, 手动系统调用