DubheCTF 2024 中 MDH(基于矩阵群的 DH 密钥交换) 和 ezcrc (CRC 的代数表达式)的题解。
MDH
题目信息
1 | from sage.all import * |
题解
基于矩阵群的 DH 密钥交换,只要能求解矩阵离散对数,这题就迎刃而解了。可以参考 The Discrete Logarithm Problem in Matrix Groups 以及 The Discrete Logarithm Problem in GL(n, q) 两篇文献。它们详细阐述了如何基于若尔当标准型分解 将矩阵离散对数问题转换为有限域上的离散对数问题。
本题矩阵未定义在有限域上,而是 上,并且矩阵不可逆,部分特征值未定义在 上,这就导致了这题不能直接用若尔当标准型来做。了解若尔当标准型中的数学内核,这题可以直接从矩阵特征多项式的根来做。给定矩阵 ,其特征多项式的本质就是:
从定义不难得到:特征多项式的根就是矩阵的特征值,而根据若尔当标准型在扩域上的分解形式,矩阵特征值会保持幂同态,即 的一个特征值 ,在 中对应的特征值就是 。因此我们同样可以把矩阵离散对数降级到它元素有限域上的离散对数问题。而 上的离散对数在本题的场景下是简单的(),详细请参考笔者另外两篇博客:
- 矩阵离散对数规约问题可以参考博客 基于特征值的矩阵 DLP。
- 整数环 上的离散对数问题可以参考博客 Discrete-Logarithm-Over-Z-p-r。
Exp
Sage EXP
1 | from hashlib import sha256 |
其中 x0, x1, y0, y1
分布是矩阵 的特征值,即 在 上的两个根。可以在 sage 上先求 在有限域 上的根,再用 hensel lift 提升到 上。这里我直接用 mathematica求解了:
mma 脚本
1 | (* Define the coefficients and modulus *) |
ezcrc
题目源码
1 | #!/usr/bin/env python3 |
题解
五次交互从 flag 的 crc256 的值中恢复出 flag。flag 中未知字节数为 32,从 crc256 中恰好能够恢复出完整的 flag。crc 是线性的,更具体来说, crc256 可以表示为,输入为 , 编码成多项式记为 :
- 仿射函数: , (参考 HackerGame 2022)
- 多项式函数: , 其中 为模多项式,次数为 256,且一般是不可约多项式; 是消息输入多项式, 是 CRC 值输出多项式。
这里我们考虑多项式的表达形式,加入输入多项式 、输出多项式 后,整个 CRC 函数表达式为:
简单构造两个输入多项式 , 则:
记 其中 是一个次数小于 256 的多项式。因此
即我们可以通过两次 CRC256 的 oracle 恢复出模多项式 .
恢复出 后,对于任意给定的次数小于 256 的输入多项式 对应的 crc 值 ,我们都可以简单通过差分方式消去 的影响,然后解出原始消息多项式 。从而这题最少交互次数应该是 3 。
Exp
1 | from pwn import remote, context |