AlexMelanFromRingo/KalynaMode

GitHub: AlexMelanFromRingo/KalynaMode

为 hashcat 添加乌克兰国标加密算法 Kalyna(DSTU 7624:2014)全部五种变体的已知明文攻击模式,覆盖 CUDA 和 CPU 后端,并附带便携式参考实现与哈希生成工具。

Stars: 0 | Forks: 0

# KalynaMode — 用于 hashcat 的 Kalyna (DSTU 7624:2014) 为乌克兰国家标准加密算法 **Kalyna** (DSTU 7624:2014) 添加了已知明文攻击模式到 [hashcat](https://github.com/hashcat/hashcat)。 | 模式 | 变体 | 分组 | 密钥 | 轮数 | 状态 | |-----------|---------------|-------|------|--------|--------| | `-m 36000`| Kalyna‑128/128| 128 b | 128 b| 10 | ✅ 端到端 (CUDA + PoCL) | | `-m 36100`| Kalyna‑128/256| 128 b | 256 b| 14 | ✅ 端到端 (CUDA + PoCL¹) | | `-m 36200`| Kalyna‑256/256| 256 b | 256 b| 14 | ✅ 端到端 (CUDA) | | `-m 36300`| Kalyna‑256/512| 256 b | 512 b| 18 | ✅ 端到端 (CUDA) | | `-m 36400`| Kalyna‑512/512| 512 b | 512 b| 18 | ✅ 端到端 (CUDA) | ¹ 在 PoCL CPU 上,使用 `--self-test-disable` 可以正确破解 `m36100`。这里显式的 OpenCL 自检步骤属于误报——即使是只输出预期摘要的存根 (stub) kernel,也会在相同的自检中失败,因此问题出在 PoCL 的自检流程而非本插件中。 ## 功能说明 对于每种模式,破解程序都会测试: ``` encrypt(key = $pass, plaintext = $salt) == $digest ``` 哈希格式: ``` : ``` 每一半都是恰好一个以十六进制表示的 Kalyna 块。候选密码会被视为原始的密钥字节——密码长度必须等于相应变体以字节为单位的密钥大小(16、32 或 64)。其格式与 hashcat 已有的 `-m 14000` (DES KPA) 使用的哈希结构相同。 ## 快速开始 ``` # 获取 hashcat git clone --depth 1 https://github.com/hashcat/hashcat.git cd hashcat # 放入 Kalyna plugin git clone --depth 1 https://github.com/AlexMelanFromRingo/KalynaMode.git /tmp/KalynaMode /tmp/KalynaMode/apply.sh . # 构建 hashcat make -j # 构建 host-side hash generator 并运行其 self-test make -C /tmp/KalynaMode/tools test # 生成 hash 并破解它(五种变体中的任意一种) /tmp/KalynaMode/tools/kalyna_gen 128/128 "MyKalyna1234567!" \ "0011223344556677aabbccddeeff0011" > /tmp/k.hash echo "MyKalyna1234567!" > /tmp/k.dict ./hashcat -m 36000 -a 0 /tmp/k.hash /tmp/k.dict # 32-byte key: /tmp/KalynaMode/tools/kalyna_gen 256/256 "test123testtesttesttesttesttest!" \ "00112233445566778899aabbccddeeff112233445566778899aabbccddeeff00" > /tmp/k.hash echo "test123testtesttesttesttesttest!" > /tmp/k.dict ./hashcat -m 36200 -a 0 /tmp/k.hash /tmp/k.dict ``` ## 生成哈希 `tools/kalyna_gen` 接收一个 `/` 变体标签、一个密码以及一个可选的明文(如果省略则随机生成): ``` ./kalyna_gen 128/128 "<16-byte pw>" [<32-hex pt>] ./kalyna_gen 128/256 "<32-byte pw>" [<32-hex pt>] ./kalyna_gen 256/256 "<32-byte pw>" [<64-hex pt>] ./kalyna_gen 256/512 "<64-byte pw>" [<64-hex pt>] ./kalyna_gen 512/512 "<64-byte pw>" [<128-hex pt>] ``` 或者提供 `--hex` 以使用原始密钥字节: ``` ./kalyna_gen --hex 128/128 <32-hex-key> <32-hex-pt> ``` ## 目录结构 ``` src/modules/module_36000.c - Kalyna-128/128 module src/modules/module_36100.c - Kalyna-128/256 module src/modules/module_36200.c - Kalyna-256/256 module src/modules/module_36300.c - Kalyna-256/512 module src/modules/module_36400.c - Kalyna-512/512 module OpenCL/inc_cipher_kalyna.h - device-side public API OpenCL/inc_cipher_kalyna.cl - device-side Kalyna (KALYNA_NB / NK / NR are compile-time parameters set by each kernel) OpenCL/m360{00,100,200,300,400}_a{0,3}-pure.cl - kernels OpenCL/m360{00,100,200}_a1-pure.cl - combinator kernels for the small-key modes tools/kalyna.{c,h} - portable host reference for all five DSTU variants tools/kalyna_tables.h - S-box tables tools/kalyna_gen.c - hash generator + self-test tools/kalyna128_kernel_check.c - cross-checks the device-side Kalyna-128/128 algebra against the reference implementation apply.sh - copies plugin files into a hashcat tree ``` ## 自检 (Self-test) 宿主机端的参考实现能够完美匹配 DSTU 参考向量中的每一个 Kalyna 密文: ``` Kalyna-128/128 ct = 81bf1c7d779bac20e1c9ea39b4d2ad06 Kalyna-128/256 ct = 58ec3e091000158a1148f7166f334f14 Kalyna-256/256 ct = f66e3d570ec92135aedae323dcbd2a8ca03963ec206a0d5a88385c24617fd92c Kalyna-256/512 ct = 606990e9e6b7b67a4bd6d893d72268b78e02c83c3cd7e102fd2e74a8fdfe5dd9 Kalyna-512/512 ct = 4a26e31b811c356aa61dd6ca0596231a67ba8354aa47f3a13e1deec320eb56b8 95d0f417175bab662fd6f134bb15c86ccb906a26856efeb7c5bc6472940dd9d9 ``` 运行 `make -C tools test` 在本地进行验证。 ## 设计说明 设备端的实现位于单一的 `inc_cipher_kalyna.cl` 文件中,在编译时通过 `KALYNA_NB`/`KALYNA_NK`/`KALYNA_NR` 进行参数化。每个 `m36X00_*-pure.cl` kernel 文件都 `#define` 了这些宏并包含了该 inc 文件;JIT 编译器会将最终生成的固定大小循环进行展开。 对于 256 位和 512 位的块,其密文大于 hashcat 的 `find_hash`/`COMPARE_*` 宏所比较的 16 字节。`_mxx` 多重哈希 kernel 仍然对前 4 个 u32 进行位图过滤以保持快速路径,然后在调用 `mark_hash` 之前,根据匹配到的摘要显式验证剩余的密文字。`_sxx` 单哈希 kernel 则直接对整个密文进行差异比较。 ## 已知问题 * PoCL CPU 可能会针对 `m36100` 输出一条烦人的 `OpenCL kernel self-test failed` 警告。加上 `--self-test-disable` 后,破解过程本身可以正常工作。 * `m36300` / `m36400` 没有组合 (`-a 1`) kernel(在原始的 64 字节密钥上进行组合并不是一个典型的应用场景)。 ## 许可证 MIT。S 盒表和算法骨架取自 Ruslan Kiianchuk、Ruslan Mordvinov 和 Roman Oliynykov 基于 MIT 许可证的参考实现 ([rkiyanchuk/kalyna](https://github.com/rkiyanchuk/kalyna))。
标签:CUDA, DSTU 7624:2014, hashcat插件, Kalyna算法, KPA, OpenCL, PoCL, Vectored Exception Handling, Veh, 乌克兰国家标准, 客户端加密, 密码分析, 密码学, 对称加密, 已知明文攻击, 手动系统调用, 数据加密, 自动化审计