)
文档网络安全教程【免费下载链接】ctf-wikiCome and join us, we need you!项目地址https://gitcode.com/gh_mirrors/ct/ctf-wiki点击查看免费下载Simon 与 Speck 是由 NSA 于 2013 年公布的姊妹轻量级分组密码前者面向硬件实现优化其单轮结构、参数配置与密钥扩展机制是理解现代轻量级密码设计的关键。本文以 ctf-wiki 仓库中的 Simon and Speck 文档 为骨架完整梳理 Simon 的 Feistel 轮函数、轮数与密钥扩展常数并结合 2017 SECCON CTF 真题演示如何利用已知明文-密文对与 pwntools 爆破出 4 字节未知密钥。读完本文你将掌握 Simon 分组密码的参数体系与轮结构并能独立完成短密钥未知段爆破这类 CTF 密码学题的完整解题流程。背景块加密与轻量级密码的定位在深入 Simon 之前先明确它所属的上下文。仓库的 块加密总览 指出块加密每次加密一整块明文本质可看作一次替代一大块的替代密码由于明文空间巨大、无法预建替换表必须依靠复杂的加解密算法。分组密码设计充分使用了 Shannon 提出的两大策略混淆Confusion让密文与密钥之间的统计关系尽可能复杂常借助 S 盒、乘法等非线性变换扩散Diffusion让明文中的每一位影响密文中的许多位常借助线性变换、置换与循环移位。主流块加密多采用迭代结构包含密钥置换、轮加密函数与轮解密函数三个部分轮函数的设计方法则主要有Feistel Network如 DES与SPN如 AES。Simon 正是 Feistel 网络在轻量级场景下的代表性实现而轻量级意味着它牺牲部分通用性换取更小的硬件面积、更低的功耗与更简单的电路实现。Simon Block Cipher 基本介绍Simon 块加密算法由 NSA 于2013 年 6 月公布主要在硬件实现上进行了优化。它是一个平衡的 Feistel 密码若每块大小为 n 比特则明文总大小为2n 比特左右各 n 比特。通常密钥长度是块长度的整数倍例如 2n、4n 等。算法按Simon 2n/mn的约定命名其中 n 为块大小m 是密钥长度与块大小的倍数关系。例如Simon 48/96表示明文分组为 48 比特、密钥为 96 比特的加密算法。需要留意的是SECCON 题目中的Simon_96_64采用的是密钥比特数_分组比特数的书写顺序明文 64 比特、密钥 96 比特。常见参数组合文档配图 simon_cipher_mode.png 给出了 Simon 各参数组合的完整对照表涵盖分组大小Block size、可选密钥大小Key size与对应轮数Rounds图中确认的规则包括分组大小可选32、48、64、96、128 比特同一分组可搭配多种密钥长度轮数随参数组合不同而变化。例如32 比特分组 64 比特密钥 →32 轮128 比特分组 256 比特密钥 →72 轮本文实战部分用到的 64 比特分组 96 比特密钥即Simon_96_64同样在表中列出的组合之内。选参启示轮数随着块/密钥尺寸增加而增长目的是在更多轮扩散中保证同等的安全冗余CTF 中遇到此类算法时第一步应当先根据题面确认 (块大小, 密钥大小, 轮数) 三元组再决定是爆破、差分分析还是降轮攻击。单轮加密过程Feistel 轮函数对于 Simon 而言每一轮的加密过程完全相同结构如下从轮函数图中可以清晰地读出 Simon 单轮的全部运算全部为硬件友好的位操作无 S 盒、无乘法输入为左半部分PT₁与右半部分PT₂左半部分PT₁分别执行1 位左循环移位与8 位左循环移位两者做按位与上述与运算结果再与PT₁的2 位左循环移位结果做按位异或⊕该异或结果与右半部分PT₂、以及该轮轮密钥Kᵣ依次异或得到新的右半部分CT₂右半部分PT₂直接成为新的左半部分CT₁输出时左右两部分交叉排列。用标准符号可将该轮函数记为图中三个循环移位分别为 1、8、2 位R(x, y) ((x 1) (x 8)) ⊕ (x 2) ⊕ y ⊕ K_r (x, y) (y, R(x, y))这套移位 与 异或的组合正是轻量级密码的典型风格用最少的门电路实现充分的比特扩散同时保持轮函数可逆、可并行评估。密钥扩展与 z_j 常数Feistel 密码的每一轮都需要独立的轮密钥。Simon 的密钥扩展方案如图 simon_key_schedule.svg 所示对于每一轮以及不同的 m密钥/块倍数扩展出的轮密钥有所不同。其中常数序列 $z_j$ 由线性反馈移位寄存器Linear Feedback Shift Register, LFSR生成虽然不同 $z_j$ 的反馈逻辑抽头多项式不同但初始向量是固定的。文档给出的五个常数序列如下它们是密钥扩展中逐轮注入的非线性来源也是区分不同算法变体的关键Constant$z_{0}$11111010001001010110000111001101111101000100101011000011100110$z_{1}$10001110111110010011000010110101000111011111001001100001011010$z_{2}$10101111011100000011010010011000101000010001111110010110110011$z_{3}$11011011101011000110010111100000010010001010011100110100001111$z_{4}$11010001111001101011011000100000010111000011001010010011101111从实现角度看这组常数可在实现中按位提取后参与轮密钥生成在 CTF 分析中若攻击者已知全部轮密钥则可直接逆向出主密钥因此密钥扩展的常数与 LFSR 结构常是降轮攻击如相关密钥攻击、slide attack的研究对象。2017 SECCON Simon and Speck Block Ciphers 实战理解了算法原理之后最直接的应用便是利用其密钥空间可分割性完成暴力破解。2017 年 SECCON CTF 的题目描述如下Simon and Speck Block Ciphers Simon_96_64, ECB, keySECCON{xxxx}, plain0x6d564d37426e6e71, cipher0xbb5d12ba422834b5题面分析把 96 比特密钥缩小到 32 比特由Simon_96_64可知密钥 96 比特12 字节、明文 64 比特8 字节采用ECB 模式可参考仓库中 ECB 模式说明即每块独立加密、密文与明文块一一对应密钥格式已给出SECCON{xxxx}前缀SECCON{共 8 个字节已知只剩下 4 个字节未知$2^{32}$ 种可能。由于已知一对明文0x6d564d37426e6e71与密文0xbb5d12ba422834b5我们可以把未知 4 字节密钥当作爆破对象逐一枚举 4 字节候选用 Simon 加密已知明文比对密文是否一致。脚本中使用的 simon 加密实现取自开源 NSA-ciphers 项目中的simon.py该文件提供SIMON(block_size, key_size, key)类与encrypt()接口。爆破脚本from pwn import * from simon import SIMON plain 0x6d564d37426e6e71 cipher 0xbb5d12ba422834b5 def compare(key): key SECCON{ key } key key.encode(hex) key int(key, 16) my_simon SIMON(64, 96, key) test my_simon.encrypt(plain) if test cipher: return True else: return False def solve(): visible string.uppercase string.lowercase string.digits string.punctuation key pwnlib.util.iters.mbruteforce(compare, visible, 4, methodfixed) print key if __name__ __main__: solve()脚本要点逐行解读compare(key)接收 4 字节候选拼接为SECCON{xxxx}按十六进制编码转为整数密钥构造SIMON(64, 96, key)块 64 比特、密钥 96 比特对已知明文加密并与目标密文比对visible候选字符集覆盖大小写字母、数字、标点与空格贴合 Flag 常见形态pwnlib.util.iters.mbruteforce(compare, visible, 4, methodfixed)pwntools 提供的多线程爆破函数——第一个参数为判定函数第二个为字符集第三个为候选长度methodfixed表示只尝试恰好 4 字节的固定长度组合。仓库中 ElGamal 签名示例 与 SHA1 碰撞示例 也使用了同一函数处理固定长度未知段的爆破可交叉参考其参数语义。运行结果如下➜ 2017_seccon_simon_and_speck_block_ciphers git:(master) python exp.py [] MBruteforcing: Found key: 6Pz0即完整密钥为SECCON{6Pz0}。解题经验小结优先缩小密钥空间Flag 格式如SECCON{...}天然给出了密钥前缀把 96 比特的暴力空间压缩为 32 比特使 $2^{32}$ 次加密在 pwntools 多线程爆破下数分钟内即可完成注意符号顺序Simon_96_64与Simon 64/96的书写习惯不同构造SIMON(block, key, ...)时必须与题面明文的比特数对齐否则永远比对不出密文ECB 模式简化比对ECB 下分组独立加密一组已知明密文对即可完成密钥验证无需构造多分组线性约束。延伸Speck 与姊妹算法的关系文档标题与 SECCON 题目均同时提及Simon 与 Speck 这对姊妹轻量级算法正文以 Simon 为主线展开。两者出自同一份 NSA 规范2013/404共享极致简约的位运算轮函数设计哲学Speck 在轮结构上同样只依赖循环移位、加与异或是理解 Simon 后顺理成章可以迁移学习的下一站。遇到以 Speck 出题的 CTF 时可复用本文的爆破框架确认块/密钥尺寸与轮数 → 选用对应开源实现 → 利用已知明密文对与 Flag 格式压缩密钥空间。参考文献本文主体内容源自仓库文档 Simon and Speck Block Ciphers相关配图位于 blockcipher/figure 目录Simon 的轮函数、参数与密钥扩展常数表均依据该文档及其配图整理块加密整体背景混淆/扩散、Feistel 与迭代结构见 块加密总览pwntoolsmbruteforce的同类用法可参考 ElGamal 签名攻击示例 与 SHA1 碰撞示例。赞分享文档网络安全教程【免费下载链接】ctf-wikiCome and join us, we need you!项目地址https://gitcode.com/gh_mirrors/ct/ctf-wiki点击查看免费下载相关推荐CTF 中的 Simon 与 Speck 轻量级分组密码原理剖析与 SECCON 2017 实战破解CTF 中的 Simon 与 Speck 轻量级分组密码原理剖析与 SECCON 2017 实战破解 导读 Simon 与 Speck 是由美国国家安全局N文档网络安全教程margin-analyzer 利润率分析避坑指南小型企业定价决策中七大数据陷阱的识别与规避margin analyzer 利润率分析避坑指南小型企业定价决策中七大数据陷阱的识别与规避 本文是知识工作插件仓库knowledge work plugi文档网络安全教程flame_bloc在 Flame 游戏引擎中使用 Bloc 状态管理的桥接库实战指南flame_bloc在 Flame 游戏引擎中使用 Bloc 状态管理的桥接库实战指南 flame_bloc 是 Flame 生态为游戏开发者提供的一个桥接库文档网络安全教程上一篇Plate 的 Markdown 功能覆盖矩阵解析主版本发布门禁、权威模型与现有功能状态下一篇SymPy Polyhedron用置换群为多面体建模与旋转的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考