密码学中的多元二次方程(MQ, Multivariate Quadratic Problem)问题与对应的Unbalanced Oil and Vinegar (UOV) 及其变体的攻击思路思考

Table of Contents

之前曾经提及过,现代密码学的核心在于寻找到一个在理论上可行但是实现这种计算极难(即计算不可行)的困难问题。

多元二次方程问题(Multivariate Quadratic Problem)就是经典的这样的问题。

1. Multivariate Quadratic Problem

给定一个n维空间下(每一维q个变量)的有限域 \(\mathbb{F}_{q}^{n}\), 定义一个未知数 \(\mathbf{x}\in \mathbb{F}_{q}^{n}\), 那么所谓的多元二次函数本质上就是包含了x的二次项和一次项和零次项(一个常数项)的函数:

\[p_{k}({\bf x})={\bf x}^{T}{\bf A}_{k}{\bf x}+{\bf b}_{k}^{T}{\bf x}+c_{k}\]

其中 $A_{k}∈ \mathbb{F}_{q}^{n× n}$是一个二次项系数的方阵, \(b_{k}\) 是一个对应维度的列向量, \(c_{k}\) 是一个常数数值。假设 \(k\in [1,2,...,m]\), 即有m个这样的函数,这其实就构成了一个 \(\mathbb{F}_{q}^{n}\rightarrow \mathbb{F}_{q}^{m}\) 的映射函数 \(\mathbf{P}(x)\). 一般来说, 此处的n要比m大,即输入的变量的个数大于方程组的个数。这也代表这种方程在vanilla的情况下根据y求解x会得到许多的解。

假设已知 \(\mathbb{P}({\bf x})={\bf y}\) 其中 \(\mathbb{y}\in \mathbb{F}_q^m\) , 那么求解这个x就是一个困难问题。

2. 密码学里的签名与认证

这个问题被寄希望于替代传统密码学中已经被量子计算攻破的一些基于非对称加密的签名问题。

签名问题与传统的签名一样,是指想要去验证一条消息是否是由本人发生。

具体地,该人物可以发布一个公钥(所有人都能看到,用来进行验证的),然后自己私自持有一个私钥。 在每次发布、发行一个message时,该人物可以基于他的公钥对这个message做处理得到一个签名s, 并把签名 和消息放在一起发给别人。其他人看到了这条消息,就可以用自己的公钥验证s是否是由message得到的。由此就能知道这个message不是被伪造发出的。这就是签名。

3. 基于MQ的签名系统。

在上述流程下,可以以MQ问题为蓝本设计一个密码学里的签名系统!思路:

  • 把因变量,即y作为message
  • 把参数作为密钥
  • 把自变量x作为签名

如果能够实现以上的步骤,那么验证者只需要 P(x) 一下就能够得到消息message, 这样验证(正向计算)起来非常快,但是其他人想破解(反向计算)却很难(因为是NP问题)。

这时候就发现不对劲了。因为这个问题有点过于难了。 即:无法通过任何方式基于y反推出x是多少——即使是在知道该方程所有系数的前提下。换句话说,这个问题足够难所以可以被使用,但是又过于难了所以无法被使用。

所以一个真正实用的后量子时代的密码学签名系统需要寻找上述的MQ问题下的一个特殊的线性结构。

4. UOV: Unbalanced Oil and Vinegar: 不平衡的油与醋

UOV几乎在所有细节上都与MQ一致,除了UOV引入了一个更特殊的几何结构,使得面对 \(\mathbf{P}(x)=y\) 方程组已知y 在知道P的一部分结构的前提下快速解出x变得可能。

4.1. MQ问题的利用:如何把一个非MQ问题伪装成MQ问题(或:如何寻找一个特殊的MQ问题)

在考虑要进行逆向的多元二次函数 \(P(x)\) 之前,可以先考虑另外一个特殊的多元二次函数 \(F(x)\) 其中F 拥有和 P 一样的shape. 但是问题是,求解F的逆运算,即试图求解 \(x=F^{-1}(y)\) 并非一个NP hard 问题。

倘若找到了这么一个函数F, 那么只要我们通过一些方式把这个F混淆成一个P的难度,问题也就解决了。 换句话说:

  1. 使得私有的人士(即进行签名的人)求解的是F的逆运算。
  2. 使得公有的人(即进行验证的人)求解的是P的正运算。
  3. 使得试图破解的人(即攻击者,也就是我)求解的是P的逆运算。

如果能够达到三点,尤其是找到一个合适的trapdoor F 使得混淆之后F无法被还原或者找到,一切就ok了。

那么问题来了:怎么构造这个trapdoor, 又怎么进行混淆呢?

先考虑第二个问题,因为简单。

假设

\[\mathbf{P} = \mathbf{T} \circ \mathbf{F} \circ \mathbf{S}\]

其中 S T 是两个仿射变换。 降低求逆问题的难度的思路便是将此处的F改为一个特殊的trapdoor,即很容易逆向运算的特殊二次型。然后再将此处的S和T两个函数构建为普普通通的可逆的线性变换以进行混淆来遮盖住这里的trapdoor, 使得得到的P和寻常的P没有 significant difference, 那么这样一切就非常完美了。这就是所有试图通过MQ来构建密码学协议的算法的做法。

注:这里的 \(\circ\) 就是指的经典矩阵乘法,反映在函数层面就是一个函数的复合操作,即 \(P(x)=T(F(S(x)))\).

好了,现在已经知道 S 和 T 是对输入空间x和输出空间y的仿射变换,即二者都是分别包含一个可逆矩阵乘法矩阵(来旋转)和一个常数向量(来平移)的东西。 现在的核心点回到了:如何去设计这个中间的trapdoor, 即 F 函数。

Before diving into the design of \(F\), we can now summarize the whole procedure again:

公钥就是三个矩阵乘在一起的结果,即这个P函数。

  • 私钥就是这个S, F, T 三个子函数。
  • 签名的过程就是:对于一条message y, 逆运算T, 然后F, 然后S, 得到signature x 并发布出去。
  • 验证的过程就是: 正向运算 P(x) 看是否等于 y.
  • 攻击这个密码学系统的思路就是:如何根据P,根据一定量的x y pair, 能够推断出 S F T
  • 设计这个密码学系统的关键就是:如何构建这个F函数,使得

4.2. 油与醋:一种trapdoor的设计思路

首先记 \(y'=F_k(x)=x^TF_k\cdot x\).

我们现在所探究的问题是:如何设计矩阵 \(F_k\in \mathbb{F}_q^{n\times n}\) 使得 当给出 \(m\) 个上述公式之后在已知所有 \(F_K\) 的前提下上述公式可逆求。

为此,UOV设计了一种包含oil和vinegar的思路:

首先,由于输入空间(x的空间)远远大于输出空间,即n>m, 所以UOV在物理意义上将这n维分成两部分,即一个m维表示油(代表很重要,与输出一一对应),还有一个n-m维度,作为醋(代表没那么重要用来打掩护):由此输入向量x本质上是oil vector \(\mathbf{o}\) 与vinegar向量 \(\mathbf{v}\) 的拼接: \[{\bf x}=[{\bf v};{\bf o}]\].

如此,那么其实二次型矩阵(作为一个对称矩阵,对称是因为交叉项在实数空间表现为矩阵(也就是系数)的对称性)也可以拆解为四个子矩阵: \[\mathbf{F}_k = \begin{bmatrix} \mathbf{V}_k & \mathbf{M}_k \\ \mathbf{M}_k^T & \mathbf{O_k} \end{bmatrix}\]

其中:

  • $\mathbf{V}_k ∈ \mathbb{F}_q^{v × v}$:Vinegar 与 Vinegar 相互作用的系数矩阵(\(\boldsymbol{v}^T \mathbf{V}_k \boldsymbol{v}\))。
  • $\mathbf{M}_k ∈ \mathbb{F}_q^{v × m}$:Vinegar 与 Oil 交叉作用的系数矩阵(\(\boldsymbol{v}^T \mathbf{M}_k \boldsymbol{o}\))。
  • $\mathbf{O}_k ∈ \mathbb{F}_q^{m × m}$: Oil 与 Oil 相互作用的系数矩阵(\(\boldsymbol{o}^T \mathbf{O}_k \boldsymbol{o}\))。

然后UOV设计这里的油与油的作用的系数矩阵,也就是 \({\bf O}_k\) 是一个0矩阵,也就是不存在这个二次项。

这就代表: 对于一个n维向量,里面有m个维度是完全线性的,非二次型的。

这也就代表:对这一部分的向量逆运算就跟一个线性运算的逆运算是一样的,没有丝毫难度。

这就是UOV设计trapdoor的核心思路:维持输出空间大小的 “线性运算” 并隐藏在二次型之中。

4.3. UOV中的其他处理

4.3.1. 关于“混淆”

由于UOV二次型矩阵也是随机生成的,仅仅是添加了一个约束,oil分量对应的部分的子方阵强行置0, 所以UOV仅仅保留了输入的混淆S, 然后没有添加输出的混淆T.

这里可以延伸询问一下:

  1. 可否保留T, 去除S矩阵? 我认为是可以的。但是这时的F矩阵不应该存在一个很明显的0分区,而是对F矩阵的维度index做permutation.
  2. 去除掉T, 是否存在混淆上的损失,相比较于之前?

我认为应该是没有。这个可以通过展开SFT的表达式来查看。此处不再推导。

4.3.2. 关于U:unbalanced?

起初UOV并不是UOV,而是OV. 但是因为OV被攻破了,所以改名叫UOV了。

那么,OV是怎么被攻破的呢?


Author: Zi Liang (zi1415926.liang@connect.polyu.hk) Create Date: Sun Sep 13 15:27:29 2026 Last modified: 2026-09-13 Sun 18:49 Creator: Emacs 31.1 (Org mode 9.8.7)