2026/4/6 10:26:13
网站建设
项目流程
CTF逆向实战从凯撒密码到SM4国密手把手教你识别并破解10种常见加密算法在CTF逆向竞赛中加密算法识别与破解是每位参赛者必须掌握的核心技能。本文将带你深入10种典型加密算法的特征识别与实战破解通过侦探破案的视角从二进制程序的蛛丝马迹中还原加密逻辑。无论你是刚入门的新手还是准备进阶的选手这套系统化的分析方法都将大幅提升你的解题效率。1. 古典密码凯撒与ROT家族的快速识别凯撒密码作为最古老的加密方式之一在CTF中常以变种形式出现。识别它的关键特征包括字母位移操作在反汇编代码中会看到明显的ASCII值加减操作如ord(A)3范围检查通常伴随对大写字母65-90和小写字母97-122的范围判断模26运算位移后常见% 26操作确保不超出字母表范围以下是一个典型的凯撒密码Python解密模板def caesar_decrypt(ciphertext, shift): result for char in ciphertext: if char.isupper(): result chr((ord(char) - shift - 65) % 26 65) elif char.islower(): result chr((ord(char) - shift - 97) % 26 97) else: result char return resultROT系列密码本质是凯撒密码的变种常见四种类型类型作用范围位移量典型特征ROT5仅数字5数字加减5后模10ROT13字母13字母加减13自逆操作ROT18数字字母513混合处理逻辑ROT47所有ASCII47可见字符范围循环提示遇到ROT13时加密解密使用相同函数即可这是它的独特性质2. Base编码家族从Base64到Base58的特征解析Base系列编码在CTF中高频出现识别要点包括Base64核心特征特征常量表ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/补位等号末尾常出现1-2个号长度检查代码中会有len%30的判断逆向工程中典型的Base64处理逻辑// 典型Base64编码片段 for(i0; ilen; i3){ output[j] table[(input[i] 2) 0x3F]; output[j] table[((input[i] 0x3) 4) | (input[i1] 4)]; // ... }Base58特殊之处比特币常用去除了易混淆字符0,O,I,l等特征常量表123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz代码中常见%58和/58运算Python处理Base58的推荐方式import base58 encoded base58.b58encode(bflag) decoded base58.b58decode(2NEpo7)3. 哈希算法MD5的识别与碰撞利用MD5作为消息摘要算法在CTF中主要有两种考查形式识别特征初始化常量0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476典型移位操作(a 7) | (a 25)等循环移位64次循环处理分16轮每组进行4种非线性函数处理实战技巧哈希爆破当已知MD5值需要反推原文时使用预计算彩虹表import hashlib hashlib.md5(bsecret).hexdigest()哈希长度扩展攻击当知道md5(secretmessage)和secret长度时可构造新哈希特殊值利用寻找以0e开头的MD5值PHP弱类型比较时会视为0注意现代CTF中单纯的MD5破解已较少见更多考查与其他漏洞的组合利用4. 现代对称加密AES的快速定位与破解AES作为最常用的对称加密算法在逆向中可通过以下特征识别关键识别点S盒/逆S盒查找63 7c 77 7b...等固定字节序列密钥扩展代码中会有Rcon轮常量数组加密轮数根据密钥长度10轮对应128bit12轮对应192bit14轮对应256bit常见加密模式判断模式特征破解难度ECB相同明文块产生相同密文块低CBC需要初始化向量IV密文块依赖前一块中CTR使用计数器类似流加密高Python解密示例ECB模式from Crypto.Cipher import AES cipher AES.new(key, AES.MODE_ECB) plaintext cipher.decrypt(ciphertext)实战技巧使用IDA的FindCrypt插件自动识别算法常量注意密钥可能隐藏在程序资源段或通过动态调试获取遇到白盒AES时考虑侧信道攻击或代数分析5. 国密算法SM4的特征与逆向分析SM4作为中国商用密码标准在近年CTF中逐渐增多主要特征包括识别标志FK常量0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dcCK常量32个4字节固定值以0x00070e15开头S盒8bit输入的固定置换表算法特点分组长度128bit32轮非线性迭代每轮使用循环移位和异或操作Python解密示例from pysm4 import decrypt ciphertext int(0123456789ABCDEFFEDCBA9876543210, 16) key int(0123456789ABCDEFFEDCBA9876543210, 16) plaintext decrypt(ciphertext, key)6. 非对称加密RSA的识别与攻击手法RSA在CTF逆向题中通常以下列形式出现典型特征大数运算常见gmpy2库函数调用公钥指数e多为655370x10001模数n长度通常为1024/2048bit关键操作pow(m,e,n)和pow(c,d,n)常见攻击方法攻击类型适用条件工具模数分解n可分解yafu, factordb共模攻击相同n不同e扩展欧几里得小指数攻击e3且明文较短直接开方Python解密示例import gmpy2 d gmpy2.invert(e, (p-1)*(q-1)) m pow(c, d, n)实战技巧检查是否有已知的p或q片段尝试Wiener攻击当d较小时注意padding模式PKCS#1 v1.5可能受Bleichenbacher攻击7. 流加密RC4的识别与密钥恢复RC4作为流加密算法逆向时关注以下特征识别要点256字节的S盒初始化密钥调度算法KSA和伪随机生成算法PRGA最终的明文与密钥流异或操作典型代码模式// KSA阶段 for (i0; i256; i) { j (j S[i] key[i%keylen]) % 256; swap(S[i], S[j]); } // PRGA阶段 i (i 1) % 256; j (j S[i]) % 256; swap(S[i], S[j]); t (S[i] S[j]) % 256; keystream S[t];破解方法当密钥较短时可暴力破解已知部分明文时恢复密钥流利用弱密钥如00 00 00...产生的偏差Python实现示例from Crypto.Cipher import ARC4 cipher ARC4.new(key) plaintext cipher.decrypt(ciphertext)8. TEA系列算法XXTEA的识别与解密TEA家族算法在CTF中常见变种核心特征识别标志魔数0x9E3779B9或等价计算64位分组处理轮数通常为32的倍数XXTEA特点可变分组长度更复杂的MX函数需要识别delta值和轮数C语言解密示例void btea_decrypt(uint32_t *v, int n, uint32_t const key[4]) { uint32_t y, z, sum; unsigned p, rounds; rounds 6 52/n; sum rounds*DELTA; y v[0]; do { e (sum 2) 3; for (pn-1; p0; p--) { z v[p-1]; y v[p] - MX; } z v[n-1]; y v[0] - MX; sum - DELTA; } while (--rounds); }实战技巧注意数据可能采用小端序存储动态调试时观察轮函数中的移位和异或操作Python实现需注意无符号整数处理9. 分组密码DES的识别与弱密钥分析尽管DES已不再安全但在CTF中仍会出现主要特征识别要点初始置换IP和逆置换IP^-1表16轮Feistel结构扩展置换E和S盒置换密钥调度中的PC-1和PC-2置换攻击方法弱密钥检测当子密钥相同或成对时已知明文攻击差分分析理论攻击Python解密示例from Crypto.Cipher import DES cipher DES.new(key, DES.MODE_ECB) plaintext cipher.decrypt(ciphertext)提示现代CTF中的DES题目通常会结合其他漏洞如密钥生成缺陷10. 综合实战多算法嵌套的破解策略高阶CTF题目常采用多种算法组合破解策略包括分析流程使用file和strings初步分析二进制文件通过FindCrypt识别算法常量动态调试定位关键加密函数绘制算法调用关系图从最终比较点逆向追踪数据流工具链推荐静态分析IDA Pro Ghidra Binwalk动态调试GDB pwndbg ltrace密码分析CyberChef SageMath RsaCtfTool典型组合模式Base64编码后接AES加密RSA加密对称密钥再用该密钥加密数据多轮不同算法的嵌套处理逆向工程中遇到加密算法时最关键的技能是快速识别算法特征并找到对应的破解工具。建议建立自己的算法特征速查表记录各算法的常量值、典型结构和已知漏洞。在实际比赛中时间有限的情况下优先尝试已知的通用破解方法如检查是否存在硬编码密钥尝试空密钥或默认密钥查找算法实现中的逻辑错误利用侧信道信息如时间差最后记住CTF中的密码学题目往往存在非预期解当标准方法无效时不妨从程序的其他漏洞入手如缓冲区溢出、格式化字符串等可能会发现更简单的突破路径。