非平衡油和醋 第二部分

本文是关于非平衡油和醋(UOV)签名算法的第二部分,详细解释了UOV算法的验证和签名过程。验证过程基于“哈希并签名”范式,利用了陷门单向函数和二次型。签名过程涉及到构造特殊的二次方程组,并通过基变换将其转换为公钥。文章还探讨了UOV公钥的自验证特性以及公钥压缩的可能性,展示了如何利用UOV的特性来创建有趣的公钥,如嵌入可执行的Python脚本。

第一部分探讨了非平衡油和醋(Unbalanced Oil and Vinegar,UOV)背后的难题之后,现在终于可以讨论算法本身了。

验证

与许多签名算法一样,首先查看验证例程是个好主意。验证算法通常更简单,并且让你了解签名方案试图做什么,而签名算法则向你展示它是如何做到的。

对于UOV,我们使用一种称为“哈希和签名(hash and sign)”的范例,在许多方面都是最简单的签名方案范例,没有使用任何花哨的转换。我们需要的只是一个陷门单向函数 $f$,即每个人都可以在任何点 $x$ 有效地评估的函数,计算 $y = f(x)$,但是,给定 $y$,找到一个 $x$ 使得 $f(x) = y$ 是困难的,除非一个人知道一些额外的信息 $k$,在这种情况下很容易。换句话说,存在一个易于评估的函数 $g$,使得 $f(g(k, y)) = y$。

给定这样一个陷门单向函数,我们可以通过简单地将 $x$ 作为消息 $y$(的哈希值)的签名来构造一个签名方案,即消息 $r$ 的签名是值 $x$,使得 $f(x) = h(r)$。使用这种范例的签名方案最突出的例子是RSA-PKCS1,其中模幂运算是单向函数,而模数的因式分解是使其可逆的陷门信息。

正如我们在第一部分中讨论的,我们希望使用二次形式作为我们的难题。在这一点上,讨论写下二次形式的不同方式是有意义的。它们都是可以互换的,真正使用哪一种主要取决于在给定上下文中什么最有用。

写下二次形式最直接的方法是将其写成多项式,即通过写 $f = \sum{i = 1}^n \sum{j = i}^n a_{ij} X_i X_j$。请注意,第二个求和从 $i$ 开始,因为我们是在交换域上运算,所以我们总是可以重新排序,使 $i \le j$。这在以后会很有用。另请注意,我们只使用齐次多项式,即没有线性或常数分量的多项式。这既是一种简化,也是一种在实践中无关紧要的事情,因为你总是可以使多项式齐次化。

表示二次形式的第二种方法是使用矩阵-向量乘法。如果我们把变量 $X_i$ 放入向量 $x = (X_1, \dots, X_n)$ 中,那么 $x^T A x$ 将评估为与上述完全相同的多项式,其中 $A$ 是一个三角矩阵。我们可以移动 $A$ 中不在对角线上的系数,只要 $A + A^T$ 保持不变(如果特征不等于2,这将是本文中的一个常见警告)。

最后,看着 $x^T A x$,问问如果我们不使用相同的向量两次,而是保留两个不同的向量,会发生什么,这是有意义的。这给了我们 $x^T A y = (x, y)_A$,一个双线性形式,即一个在两个参数中都是线性的并且评估为单个域元素的函数。换句话说,给定一个双线性形式 $(\cdot, \cdot)_A$,我们通过在对角线上评估来获得相关的二次形式。请注意,对于双线性形式,顺序非常重要,因为 $x_i y_j \neq x_j y_i$,所以在这种情况下,我们不能再简单地假设上三角矩阵。事实上,通常,在研究二次形式时,数学家将自己限制为对称双线性形式作为相关的双线性形式,即具有 $(x, y)_A = (y, x)A$ 的形式,对应于对称矩阵 $A$。这给出了二次形式和双线性形式之间的一一对应关系,并且非常方便,但缺点是在特征2中无法工作。如前所述,这是一个更普遍的事情,与多项式的次数等于特征有关,代数几何学家称之为wild case。猜猜UOV使用哪个基域?没错,是 $\mathbb{F}{256}$。对于计算机来说非常好,因为单个字节对应于一个域元素,但对于更理论的分析来说非常不方便。我们大多可以忽略这一点,但请记住,几乎所有使用双线性形式的东西都可能有一个未注明的星号,其中包含关于特征2中情况的不合理细节。

在所有这些符号都清除之后,我们终于可以写下公钥和验证算法:

UOV公钥由 $m$ 个二次形式组成,给定为维度为 $n \times n$ 的对称矩阵 $A_i$。消息 $r$ 的签名是一对 $(x, s)$,其中 $x$ 是一个 $n$ 维向量,$s$ 是一些盐,使得 $x^T A_i x = h(s || r)_i$。

以这种方式编写,很明显,解决此问题的通用方法等同于解决多元二次方程问题。实际上,签名字面上由公钥和消息定义的多变量二次方程问题的解给出。但请记住,仅仅因为问题被表述为多元二次方程,并不意味着你必须使用通用求解器来攻击它。

请注意,与RSA不同,每条消息都有多个可能的前像,因此即使没有盐,也允许多个签名。通过添加盐,我们获得了一些额外的安全保证,因为签名者之前是否签署了完全相同的消息已不再重要,因为使用不同的盐会导致完全不同的挑战。

签名

现在终于可以讨论用于UOV的陷门了。毕竟,如果我们的公钥是完全随机的,那么伪造签名确实是不可能的,但对于签名者来说,实际计算签名同样是不可能的。因此,我们需要首先构造一个可以轻松解决的特殊二次方程组,然后找到一种方法将其转换为可能与随机选择的系统无法区分的系统。我们使用上面讨论的矩阵符号。特别是,如果矩阵 $A_i$ 的形式为 $\begin{pmatrix}V_i&M_i\M_i^T&0\end{pmatrix}$,其中 $V_i$ 是一个对称的 $(n-m) \times (n-m)$ 矩阵,$M_i$ 是一个 $(n-m) \times m$ 矩阵。以这种块方式编写,区分前 $n - m$ 个变量(称为醋变量)与最后 $m$ 个变量(称为油变量)是有意义的。如果我们看看这种形式的矩阵对多项式的作用,我们看到右下角的零块意味着虽然醋变量与所有其他变量相乘,但油变量仅与醋变量相乘,而从不相互相乘。我们还方便地拥有与需要求解的方程一样多的油变量。现在求解方程非常容易:首先,随机选择醋变量的值。部分评估多项式,我们现在将有常数项(其中醋变量与醋变量相乘)和线性项(其中醋变量与油变量相乘),但至关重要的是,我们不再有任何二次项,因为我们不允许油变量与其他油变量相乘。换句话说,我们有 $m$ 个具有 $m$ 个变量的线性方程需要求解。我们可以通过应用高斯消元法来做到这一点。此系统并非总是具有唯一的解,但这不太可能,如果不是,我们可以为醋变量简单地选择一组不同的值。

这给了我们一个易于求解的二次方程组,这将是我们的私钥,也是我们在签名时实际求解的内容。

那么我们如何从这个私有二次方程组切换到公共系统呢?当然,通过基变换。这是我们 $n$ 个变量上的线性函数,将它们混合在一起,解释了该方案的名称。我们可以使用一个 $n \times n$ 矩阵 $B$ 来编写它,这使我们可以完全写下私钥和签名算法:

UOV私钥是一个 $n \times n$ 矩阵 $B$,使得公钥 $A_i$ 可以表示为 $B^T A_i B = \begin{pmatrix}V_i&M_i\M_i^T&0\end{pmatrix}$。要签名,我们首先计算带盐消息的哈希值,为醋变量选择随机值,得到 $(v, X)$ 作为初步签名,为最后m个系数留下变量。然后我们计算 $(v^T, X^T)\begin{pmatrix}V_i&M_i\M_i^T&0\end{pmatrix}\begin{pmatrix}v\X\end{pmatrix} = v^TV_iv + v^TM_iX + X^TM_i^Tv = v^TV_iv + 2v^TM_iX$,这给了我们 $m$ 个线性方程,我们求解 $X$,得到一个私有签名 $(v, x)$。由于 $A_i$ 可以表示为 $B^T A_i B = \begin{pmatrix}V_i&M_i\M_i^T&0\end{pmatrix}$,并且我们刚刚计算了 $(v, x)$ 使得 $(v^T, x^T)\begin{pmatrix}V_i&M_i\M_i^T&0\end{pmatrix}\begin{pmatrix}v\x\end{pmatrix} = h(s || r)_i$,我们现在知道 $h(s || r)_i = (v^T, x^T)\begin{pmatrix}V_i&M_i\M_i^T&0\end{pmatrix}\begin{pmatrix}v\x\end{pmatrix} = (v^T, x^T)B^T A_i B\begin{pmatrix}v\x\end{pmatrix}$,所以 $B\begin{pmatrix}v\x\end{pmatrix}$ 是我们的签名。

奖励:自验证公钥

在我看来,理解算法的最佳方法是通过它来获得乐趣,寻找它允许或阻止的有趣属性和愚蠢之处。我已经讨论了如何从 $n(n+1)/2$ 个消息签名对中重构 UOV 公钥,但 UOV 是一个拥有有趣属性的无底洞,所以在这里我们可以讨论如何构造有趣的公钥,例如,一个公钥,它是一个可执行的 python 脚本,使用自己的代码作为公钥来验证输入签名。作为附带的好处,这也将解释我们如何大幅压缩 UOV 公钥。

为此,我们需要采取代数学家喜欢采取的方法,并完全摆脱基,即我们现在讨论一些 n 维向量空间 $X$。那么我们如何描述二次形式的特殊性质,或者其相关的双线性形式,而不明确引用其矩阵结构(以及因此的特定基)?好吧,我们将矩阵设为对称的(因为我们忽略了整个“它实际上是特征 2,所以一切都很奇怪”的事情),并且我们知道对称矩阵导致对称双线性形式,所以我们知道我们正在寻找 m 个对称双线性形式。在我们特殊的基础中,该形式的主要属性是右下角的 0。双线性形式的矩阵的系数描述了应用于相应基向量的双线性形式的结果,即 $a_{ij} = (e_i, e_j)_A$,因此在此位置有一个 0 意味着存在 m 个线性独立的向量,当在两个位置都放入双线性形式时,将计算为 0。因此,为了摆脱基,我们需要一个 $X$ 的 m 维子向量空间 $O$,其属性是 $(x, y)_i = 0 \;\;\forall x, y \in O$,对于 i 从 1 到 m。正是这个子向量空间构成了私钥。由于它对应于选择基时最后 m 个变量,因此将此空间称为油空间是有意义的,其中包含仅由非零油变量组成的向量。

为了在不选择基的情况下继续描述 UOV,我们需要通过找到一些空间 $V$ 使得 $V \oplus O = X$ 来将我们的油空间扩展到整个向量空间。值得庆幸的是,有很多这样的向量空间,并且,稍后会发现,醋的选择空间根本不重要。

选择了醋空间后,我们现在可以重新制定完整的签名算法,而无需进行基变换: 我们知道所有向量 $x \in X$ 都有一个唯一的表示形式 $v + o = x$,其中 $v \in V, o \in O$。因此我们知道 $(v+o, v+o)_i = (v, v)_i + (v, o)_i + (o, v)_i + (o, o)_i = (v, v)_i + 2(v, o)_i$,给定我们的双线性形式的属性。随机选择 $v \in V$,我们再次得到每个双线性形式的线性方程来计算 $o$,特别是,如果 $v$ 的选择不是非常不幸,那么现在只有一个 $o$ 会为所有 $(\cdot, \cdot)_i$ 给出正确的值。由于分解是唯一的,如果我们选择了不同的醋空间,则会有一个不同的醋向量会导致相同的签名(再次假设我们不会倒霉并最终得到一个未定义的方程组并重新滚动)。但是我们无论如何都随机选择了醋向量,因此除了确定不幸的醋向量的低维空间之外,醋空间的选择对我们的签名算法没有任何影响,只要它与油空间无关紧要到形成直接乘积,甚至我们选择的基也没有什么区别,因为我们只使用这个向量空间从中选择一个随机元素,该操作独立于基的选择。

现在让我们看看油空间,以及不同基的选择在这里有什么后果。我们假设醋空间和油空间如上所述是固定的,并且我们已经选择了一个随机的醋向量,使得方程组 $(v, v)_i + 2(v, \cdot)_i$ 具有完整的秩。但是,对于特定的右手边,只有一个油向量可以求解,并且该油向量再次不依赖于我们用于油空间的基,而仅依赖于它位于该油空间中这一事实。因此,我们也可以方便地选择油空间的基。请注意,与醋空间不同,这对于油空间本身是不正确的,我们不得不秘密地确定它,现在无法更改它,只是它的基。

最后,我们可以问一下,给定的随机 $n-m$ 维子空间和 $m$ 维子空间有多少可能相交不重要。事实证明,这再次非常有可能(具有非平凡交集的几率大约是域元素数量的倒数)。这意味着如果我们要求它与特定的醋空间无关紧要地相交,则我们不会过多地限制我们对油空间的选择。

因此,要将所有内容放在一起:醋空间及其基的选择与签名算法没有真正的相关性,因此我们不妨选择前 $n-m$ 个单位向量来跨越该空间。这并没有真正限制油空间的选择,并且在该空间内,基的选择再次无关紧要。显然,我们不能将基的这一部分选择为单位基,但是我们可以选择基,使得最后 m 个系数与最后 m 个单位向量一致,即选择 $O$ 的基为 $(o_i, e_i)$,其中 $ei$ 是 m 个维度的单位向量。总而言之,这意味着我们的基更改矩阵现在看起来像这样:$B = \begin{pmatrix}I{n-m}&B_{12}\0&Im\end{pmatrix}$。如上所述将此基更改应用于我们的公钥,我们得到 $\begin{pmatrix}I{n-m}&0\B_{12}^T&Im\end{pmatrix}\begin{pmatrix}A{11}&A{12}\A{12}^T&A{22}\end{pmatrix}\begin{pmatrix}I{n-m}&B_{12}\0&Im\end{pmatrix} = \begin{pmatrix}A{11}&A{11}B{12} + A{12}\B{12}^TA{11} + A{12}^T&B{12}^TA{11}B{12} + B{12}^TA{12} + A{12}^TB{12} + A{22}\end{pmatrix}$。因此,为了使该形式具有所需的形状,我们只需要 $A{22} = -B{12}^TA{11}B{12} - B{12}^TA{12} - A{12}^TB{12}$。

综上所述,这意味着实际依赖于私钥的公钥的唯一部分是 m 个二次形式的右下角 $m \times m$ 块。这意味着可以随机选择公矩阵的其余部分。UOV 竞赛条目巧妙地利用这一点使公钥小得多,从扩展公钥的 $m\cdot n(n+1)/2$ 字节到压缩公钥的 $m\cdot m(m+1)/2 + 16$ 字节,使用额外的 16 个字节作为种子输入到 XOF 中,生成 $A{11}$ 和 $A{12}$。反过来,我可以利用此属性来保持公钥较大,但可以在其中隐藏有趣的message,例如前面提到的 python 脚本。

  • 原文链接: keymaterial.net/2024/12/...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
keymaterial
keymaterial
江湖只有他的大名,没有他的介绍。