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攻击, 侧信道攻击, 大数运算, 密码分析, 密码学, 手动系统调用