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, 乌克兰国家标准, 客户端加密, 密码分析, 密码学, 对称加密, 已知明文攻击, 手动系统调用, 数据加密, 自动化审计