弄懂有限域,AES加密核心GF(2⁸)数学原理详解

一、域(Field)

域是一种代数结构,你可以把它理解为一个对"四则运算"都封闭的集合。也就是说,集合中的任意两个元素做加法、减法、乘法、除法(除以非零元素)后,结果仍然在这个集合里。

我们熟悉的有理数集、实数集、复数集都是典型的域。但整数集不是域,因为两个整数相除(例如 1÷21 \div 21÷2)的结果可能不再是整数。

二、有限域(Galois Field / 伽罗瓦域)再探

有限域,顾名思义,是元素个数有限的域,为了纪念有限域的提出人,法国天才数学家埃瓦里斯特·伽罗瓦(Évariste Galois),有限域也被称为伽罗瓦域(不是王者荣耀的伽罗)。

有限域理论最早由埃瓦里斯特·伽罗瓦在19世纪30年代研究代数方程根式求解问题时首次提出,随后,高斯在多项式环算术等方面做出了基础性贡献,卡米尔·若尔当(Camille Jordan)在1870年的著作中进一步推广,伦纳德·迪克森(Leonard Dickson)在1901年系统阐述了线性群与伽罗瓦理论。施泰尼茨(Steinitz)于1910年才正式引入"域"的现代概念。1893年,穆尔(E.H. Moore)证明所有有限抽象域都与某个伽罗瓦域同构。

伽罗瓦域记作 GF(pn)\mathrm{GF}(p^n)GF(pn),GF是Galois Field的简写,至于 pnp^npn 是什么,我们稍后介绍。

有限域元素个数有限的特性,并非是随便指定几个有限的数作为元素那么简单,别忘了还有满足封闭性,在介绍模运算的章节,我们知道一个质数的余数个数有限,例如质数7的余数,永远是 {0,1,2,3,4,5,6}\{0,1,2,3,4,5,6\}{0,1,2,3,4,5,6},而且模运算加减乘除运算满足封闭性,这正好满足有限域的特性,那么质数7的有限域记作 GF(7)\mathrm{GF}(7)GF(7),7是元素的个数,恰好也是质数本身的值,推广到通用形式,那么 ppp 是质数,那么有限域记作 GF(p)\mathrm{GF}(p)GF(p)。

但这样还是不够通用,因为 GF(p)\mathrm{GF}(p)GF(p) 只能解决元素个数恰好为质数的情况,比如 2,3,5,7,2572, 3, 5, 7, 2572,3,5,7,257,没有覆盖所有情况,例如我们想要一个元素个数为256的域,用于表示计算机中的字节,因为一个字节有8位,256种状态,而遗憾的是,256不是一个质数,我们无法直接套用"整数除以质数取余"的老办法。

为了突破这个限制,数学家想出了一种绝妙的策略:既然一维的"数字"不够用,那我们就搭建一个"多维空间"。

依然围绕 GF(p)\mathrm{GF}(p)GF(p) 做文章,但这一次,不再只用一个标量(单个数字),而是同时使用 nnn 个来自地基 GF(p)\mathrm{GF}(p)GF(p) 的标量作为"坐标"。为了把这些坐标有序地组织起来,我们人为引入一个抽象的占位符(就叫它 xxx),把 nnn 个坐标写成如下的"多项式余数"形式:

a0+a1x+a2x2+⋯+an−1xn−1 a_0 + a_1 x + a_2 x^2 + \cdots + a_{n-1} x^{n-1} a0+a1x+a2x2+⋯+an−1xn−1

事情一下子变得抽象起来。先别急,我们用一个近似的结构来类比。

想想我们最熟悉的二进制:只有0和1两个数字,为了表示更大的数,我们扩张出多个"位"(个位、十位、百位......),把数据组织成 100010001000 这样的形式,因为我们早已习惯这种"按位排列"的结构,觉得扩张位数是天经地义的。

现在,把目光拉回有限域。我们手里依然只有 GF(p)\mathrm{GF}(p)GF(p) 这 ppp 个"基础数字",为了得到更多的元素,我们依葫芦画瓢,也扩张出 nnn 个"槽位"(即维度)。为了把这 nnn 个槽位清晰地标记出来,数学家借用了多项式的写法,引入一个纯形式的占位符 xxx,把数据组织成公式

需要特别留意:这里的 x,x2,...,xn−1x, x^2, \dots, x^{n-1}x,x2,...,xn−1 纯粹是个"排队标签",它不像二进制里的 222 那样有具体的数值大小。你可以把 xxx 理解为"第1轴",x2x^2x2 理解为"第2轴",它们只是用来告诉系统"这个系数 a2a_2a2 应该放在第三个位置"。至于这个空间里的乘法怎么算、溢出怎么处理,那是不可约多项式取模的职责,但至少,借助"扩张位数"这个直观,我们迈出了理解它的第一步。

三、元素个数为什么是 pnp^npn

这是表达式

a0+a1x+a2x2+⋯+an−1xn−1 a_0 + a_1 x + a_2 x^2 + \cdots + a_{n-1} x^{n-1} a0+a1x+a2x2+⋯+an−1xn−1

中,共有 nnn 个位置(即 1,x,x2,...,xn−11, x, x^2, \dots, x^{n-1}1,x,x2,...,xn−1),每个位置上的系数都有 ppp 种独立的取法(000 到 p−1p-1p−1),根据乘法原理,总组合数为:

p×p×⋯×p⏟n个=pn \underbrace{p \times p \times \cdots \times p}_{n\text{个}} = p^n n个 p×p×⋯×p=pn

因此,这种表示法下的元素个数恰好为 pnp^npn,这是有限域记号 GF(pn)\mathrm{GF}(p^n)GF(pn) 中 pnp^npn 的由来。

接下来,我们来理解为什么是用 x,x2,...,xn−1x, x^2, \dots, x^{n-1}x,x2,...,xn−1 作为占位符,而不是像二维坐标系用 x,yx, yx,y 作为两个轴,三维坐标系用 x,y,zx, y, zx,y,z 作为三个轴占位符,这是为了考虑到后续运算的方便,有限域要求乘法运算满足封闭性,即两个元素相乘,结果依然需要待在这个 nnn 维空间里。这个强制要求,直接判定了"用不同字母做轴"这条路走不通。

如果用 x,y,zx, y, zx,y,z 做轴,会陷入查表困境,假设我们搭建一个二维空间,任性地用 xxx 和 yyy 作为两个坐标轴,那么任意元素长得像 a0+a1x+a2ya_0 + a_1 x + a_2 ya0+a1x+a2y,我们取两个最普通的元素相乘:

(a1x)×(b1y)=a1b1⋅(x⋅y) (a_1 x) \times (b_1 y) = a_1 b_1 \cdot (x \cdot y) (a1x)×(b1y)=a1b1⋅(x⋅y)

问题在于:x⋅yx \cdot yx⋅y 等于什么?它既不能等于 xxx(因为方向不同),也不能等于 yyy(方向也不同)。它必须等于空间里的某个新方向。可是,这个空间里我们已经只有 xxx 和 yyy 两个轴了!

为了强行给出答案,我们不得不额外规定一张"乘法表",比如规定:

x⋅y=z,y⋅z=x,x⋅z=y... x \cdot y = z, \quad y \cdot z = x, \quad x \cdot z = y \dots x⋅y=z,y⋅z=x,x⋅z=y...

随着维度 nnn 增大,这张乘法表的规模呈平方级增长,极其繁琐且容易产生内部矛盾(比如结合律可能失效)。这显然不是数学家的理想选择。

如果用幂次做轴,再来做同样的乘法:

(a1x)×(b2x2)=a1b2⋅(x⋅x2)=a1b2⋅x3 (a_1 x) \times (b_2 x^2) = a_1 b_2 \cdot (x \cdot x^2) = a_1 b_2 \cdot x^3 (a1x)×(b2x2)=a1b2⋅(x⋅x2)=a1b2⋅x3

"乘法"自动转化为了"指数的加法",我们不需要定义任何额外的乘法表,只需要遵守最朴素的指数运算法则(同底数幂相乘,指数相加)。这种天然的代数结构,完美契合了多项式乘法的本质,让运算在逻辑上变得极其简单、干净。

还要最后一个问题,万一指数"溢出"了怎么办?比如在 n=3n=3n=3 的三维空间里,x2×x2=x4x^2 \times x^2 = x^4x2×x2=x4,指数4超出了最高维度2,破坏了封闭性,这个时候,要请出不可约多项式。

所谓不可约多项式,指的是多项式世界中"无法再拆分的基础单元",即它不能被拆解为两个次数更低、系数合法的多项式的乘积。以有理数域为例,多项式 x2+1x^2 + 1x2+1 无法拆成两个一次多项式相乘,是典型的不可约多项式;而 x2−1x^2 - 1x2−1 可以拆分成 (x−1)(x-1)(x−1) 和 (x+1)(x+1)(x+1) 的乘积,属于可约多项式,这个性质和质数一样,可以说,不可约多项式是多项式世界里的质数,有时不可约多项式也被称为素多项式。

再回到指数溢出的问题,我们只要对不可约多项式取模,即可把溢出的高维度次数"拽回"有限空间,正像对质数7取模运算,任何大于7的数经过模运算都小于7一样,而模运算实际是求余运算,因此,a0+a1x+a2x2+⋯+an−1xn−1a_0 + a_1 x + a_2 x^2 + \cdots + a_{n-1} x^{n-1}a0+a1x+a2x2+⋯+an−1xn−1 其实本质也是对不可约多项式取余后的结构,有限域实际是余数的集合。

我们以二元有限域 GF(2)\mathrm{GF}(2)GF(2) 下的三维有限域 GF(23)\mathrm{GF}(2^3)GF(23) 为例,选定约束用的不可约多项式为:f(x)=x3+x+1f(x) = x^3 + x + 1f(x)=x3+x+1。这个三次不可约多项式,规定了我们的运算空间最高有效次数为2,所有三次及以上的高次项,都属于"溢出维度",需要通过取模运算修正。

常规多项式乘法中,会出现维度溢出:x2×x2=x4x^2 \times x^2 = x^4x2×x2=x4。四次项 x4x^4x4 超出了三维空间的维度上限,无法直接参与有限域运算,此时不可约多项式的取模规则就会生效,完成维度修正。

我们将溢出项 x4x^4x4 对不可约多项式 f(x)=x3+x+1f(x) = x^3 + x + 1f(x)=x3+x+1 做多项式带余除法,即模运算,不要被多项式取模运算的抽象性吓到,实际还是这个规则:被除数 = 除数 × 商 + 余数。

x4=x⏟商(x3+x+1⏟除数)−(x2+x) x^4 = \underbrace{x}{\text{商}}(\underbrace{x^3 + x + 1}{\text{除数}}) - (x^2 + x) x4=商 x(除数 x3+x+1)−(x2+x)

最终得到的余数为 x2+xx^2 + xx2+x,最高次数为2,完全低于约束多项式的三次上限,成功落回 GF(23)\mathrm{GF}(2^3)GF(23) 的三维有限空间内。此时原本溢出的高次项 x4x^4x4,等价于有限域内的合法元素 1⋅x2+1⋅x+01 \cdot x^2 + 1 \cdot x + 01⋅x2+1⋅x+0,契合有限域所有元素的通用形式 a0+a1x+a2x2a_0 + a_1 x + a_2 x^2a0+a1x+a2x2。

不可约多项式本质上是多项式有限域的固定约束规则,正是这一核心特性,保障了多项式有限域乘法的绝对封闭性:无论多少次多项式相乘,运算结果永远不会跳出预设的 nnn 维空间。

四、回到 AES 的 GF(28)\mathrm{GF}(2^8)GF(28)

理解了有限域基础概念后,我们再回过头来理解有限域 GF(28)\mathrm{GF}(2^8)GF(28),这个有限域是八维的,包含 256 个元素的伽罗瓦域,需要8个比特(a0,a1,...,a7a_0, a_1, \dots, a_7a0,a1,...,a7)作为坐标,才能拼成一个完整的字节:

a0+a1x+a2x2+a3x3+a4x4+a5x5+a6x6+a7x7 a_0 + a_1 x + a_2 x^2 + a_3 x^3 + a_4 x^4 + a_5 x^5 + a_6 x^6 + a_7 x^7 a0+a1x+a2x2+a3x3+a4x4+a5x5+a6x6+a7x7

例如字节 0x1B 对应多项式 x4+x3+x+1x^4 + x^3 + x + 1x4+x3+x+1。

在AES加密算法中,列混淆和S盒步骤涉及了 GF(28)\mathrm{GF}(2^8)GF(28) 有限域,当然,我们也疑惑,为什么使用这个有限域?

主要是因为数据表示自然契合,GF(28)\mathrm{GF}(2^8)GF(28) 包含 256 个元素,恰好对应一个字节(8个比特)的全部状态,甚至因为这么契合,我们反而觉得,这是否属于没苦硬吃,S盒不能随便指定转换表吗,为什么必须依赖有限域?

实际上,如果S盒是人为任意指定的,立刻遭到密码学界质疑:第一,设计者是否暗藏了只有他自己知道的数学后门?第二,这个表在抵抗线性攻击、差分攻击时的强度,是否真的达到了理论最优?

第一个问题不是无中生有,事实上,DES的S盒虽然也表现出很强的非线性,但它的生成规则从未被公开,学界长期怀疑其中可能存在NSA预留后门。这种不透明性在现代密码学中是绝对不可接受的。设计AES不能重蹈覆辙,因为 GF(28)\mathrm{GF}(2^8)GF(28) 有限域的特性确保了S盒怎么来的是公开透明的,至于第二问题,随意指定一张表,抗线性攻击、抗差分攻击的能力,只能靠跑大量随机测试来"评估",而无法从数学上严格证明其是否达到最优。一旦出现新的攻击手法,这张表是否依然安全,无从知晓,只能重新测试。

那么,GF(28)\mathrm{GF}(2^8)GF(28) 有限域的什么特性可以一次性回答了两个问题。

答案是乘法逆元 x−1x^{-1}x−1 在 GF(28)\mathrm{GF}(2^8)GF(28) 中,已经在多个关键指标上被数学严格证明达到了理论极值或逼近极值。它不是"碰巧很强",而是"已知最强的非线性函数之一"。

在数论部分,我们曾经介绍过乘法逆元的概念。这里简单回忆一下,逆元就是"乘回去等于单位元(乘法意义上的 111,加法意义上的 000)"的那个元素,例如实数域的 1+(−1)=01 + (-1) = 01+(−1)=0,−1-1−1 是 111 的逆元,5×15=15 \times \frac{1}{5} = 15×51=1,所以 15\frac{1}{5}51 是 555 的乘法逆元,只是我们平时称之为倒数。

逆元在任何域中的定义都是相同的,这里任何域当然也包括了有限域,有限域里的乘法逆元形式如下:

x×x−1=1mod  m(x) x \times x^{-1} = 1 \mod m(x) x×x−1=1modm(x)

其中,xxx 是多项式,x−1x^{-1}x−1 是对应的乘法逆元,m(x)m(x)m(x) 是我们前面提到的不可约多项式。

我们的关注点在于,xxx 和乘法逆元 x−1x^{-1}x−1 之间是非常彻底的非线性关系,当然我们必须知道非线性关系是什么。

线性函数必须满足 f(x+y)=f(x)+f(y)f(x+y) = f(x) + f(y)f(x+y)=f(x)+f(y) 和 f(kx)=kf(x)f(kx) = kf(x)f(kx)=kf(x),例如线性函数 y=2xy = 2xy=2x 满足条件,输入翻倍,输出一定翻倍。但求倒数函数 f(x)=1xf(x) = \frac{1}{x}f(x)=x1 不满足了,输入从 222 变到 444(只增加了 222),输出却从 0.50.50.5 变成了 0.250.250.25;输入从 444 变到 888(增加了 444),输出只减少了 0.1250.1250.125。变化的比例完全不一致,甚至方向都相反。

我们把"求倒数"这个操作搬到有限域里,但不再是普通除法,而是多项式模逆:

x×x−1=1mod  m(x) x \times x^{-1} = 1 \mod m(x) x×x−1=1modm(x)

求逆过程 f(x)=x−1f(x) = x^{-1}f(x)=x−1 不满足 f(x+y)=f(x)+f(y)f(x+y) = f(x) + f(y)f(x+y)=f(x)+f(y),在底层逻辑上完全复制了实数域求倒数的"非线性扭曲"特性,甚至因为离散性和模运算的加入,它的扭曲程度被推到了理论上的极限。

当然,非线性也分强弱,f(x+y)≠f(x)+f(y)f(x+y) \neq f(x) + f(y)f(x+y)=f(x)+f(y) 只能判定是不是非线性,但要衡量非线性到什么程度,还需要引入定量的指标。在有限域中,常用的两个指标是非线性度和代数次数。

先看非线性度

我们可以从实数域的一个直观情形出发来理解它的含义。假设坐标系中有一条曲线,比如 f(x)=1xf(x) = \frac{1}{x}f(x)=x1,我们尝试用一条直线去拟合它。通过改变截距 bbb(平移直线)和改变斜率 kkk(旋转直线),可以调整直线的位置和方向。无论怎么挪动,直线与曲线之间始终存在偏差,即直线上的点和曲线上的点不可能在所有位置都完全重合。

在所有可能的直线中,总有一条能使整体误差最小,比如使所有点到直线的垂直距离的平方和最小,这就是最小二乘法的基本思想。

如果被拟合的曲线本身就是一条直线,那么这个最小误差就是0,直线可以完全贴合自身。但如果曲线是弯曲的,比如 1x\frac{1}{x}x1,即便选了最好的那条直线,整体误差也无法消除,而且曲线弯曲得越厉害,这个最小误差就越大。

这个最接近的直线与曲线之间无法消除的最小误差,正是实数域中衡量"非线性有多强"的核心思路,最小误差越大,说明曲线越弯曲,越不像直线。将这个思路迁移到有限域中,就形成了非线性度的概念:它衡量的正是"所有线性函数对目标函数的最佳逼近,依然无法消除的最小偏差"。

在进入有限域的具体数值之前,我们先明确一个更底层的概念。

现代计算机处理的是二进制数据,即0和1。在数学上,我们把"输入是若干个0/1比特,输出是 1个0/1比特"的函数,称为布尔函数。

它的标准写法是:

f:{0,1}n→{0,1} f: \{0,1\}^n \to \{0,1\} f:{0,1}n→{0,1}

意思是:输入 nnn 个比特(比如 u0,u1,...,un−1u_0, u_1, \dots, u_{n-1}u0,u1,...,un−1),经过运算后,只输出1个比特(要么是0,要么是1)。

例如,一个简单的布尔函数可以是 f(u0,u1)=u0⊕u1f(u_0, u_1) = u_0 \oplus u_1f(u0,u1)=u0⊕u1,即异或函数,它只输出一个比特。

另外一个概念是仿射函数,这个概念要不是研究密码学,我们几辈子都不会碰到,在实数域里,我们用"直线"作为参照物,在有限域的布尔函数世界里,对应的参照物就是仿射函数。

一个布尔函数 f(x1,x2,...,xn)f(x_1, x_2, \dots, x_n)f(x1,x2,...,xn),如果它可以写成如下形式,那么它就是一个仿射函数:

f(x1,x2,...,xn)=a0⊕(a1⋅x1)⊕(a2⋅x2)⊕⋯⊕(an⋅xn) f(x_1, x_2, \dots, x_n) = a_0 \oplus (a_1 \cdot x_1) \oplus (a_2 \cdot x_2) \oplus \cdots \oplus (a_n \cdot x_n) f(x1,x2,...,xn)=a0⊕(a1⋅x1)⊕(a2⋅x2)⊕⋯⊕(an⋅xn)

其中,系数 a0,a1,...,ana_0, a_1, \dots, a_na0,a1,...,an 都只能是 000 或 111。

"仿射"这个词第一眼看上去太有距离感,但它的英文Affine原意其实是"有亲缘关系的",可以这么理解,如果线性函数(即上面公式中 a0=0a_0 = 0a0=0 的情况)可以看作一个"核心家族成员",而仿射函数就是在它基础上多了一个常数项 a0a_0a0(相当于多了一个"亲戚")。这个常数项的取值(0或1)只决定最后的输出是否取反,并不改变函数基本形状的本质。

上面的公式中,a1⋅x1,a2⋅x2,...,an⋅xna_1 \cdot x_1, a_2 \cdot x_2, \dots, a_n \cdot x_na1⋅x1,a2⋅x2,...,an⋅xn:这部分是"线性部分"。通过改变系数 aia_iai(即选择哪些输入比特参与运算),就相当于改变直线的斜率(旋转直线)。

末尾的常数项 a0a_0a0:单独加上一个 000 或 111,就相当于改变直线的截距(平移直线)。

概念准备好了,我们继续来理解有限域乘法逆元的非线性度。我们用AES的S盒来理解,S盒是8位比特输入,8位比特输出,然后通过拆解成8个布尔函数。

  • 第一个布尔函数 f0f_0f0:只取输出字节的第0位。它的输入是8比特,输出是1比特(第0位的值);
  • 第二个布尔函数 f1f_1f1:只取输出字节的第1位,以此类推;
  • 第八个布尔函数 f7f_7f7:只取输出字节的第7位。

这样,一个复杂的S盒就被切成了 8个标准的布尔函数。

然后我们对这8个布尔函数分别计算非线性度,即它们各自到所有线性函数的最小汉明距离,我们以第一个布尔函数 f0f_0f0 为例,整体步骤如下:

第1步:获取 f0f_0f0 的"真值表"

f0f_0f0 是S盒输出的最低位,输入是8比特的数值 xxx(从 0x000xFF,共256个),输出是一个比特(0或1)。

通过查AES的S盒表,得到 S(x)S(x)S(x) 这个8比特的输出字节,然后取出它的最低位。把 xxx 从 0到255全部遍历一遍,就能得到256个0或1,这就构成了 f0f_0f0 的真值表。

第2步:准备"仿射函数池"

非线性度的定义是:一个布尔函数到所有仿射函数的最小汉明距离。

在8比特的情况下,一个仿射函数 l(x)l(x)l(x) 可以写成:

l(x)=a0⊕(a1⋅x1)⊕(a2⋅x2)⊕⋯⊕(a8⋅x8) l(x) = a_0 \oplus (a_1 \cdot x_1) \oplus (a_2 \cdot x_2) \oplus \cdots \oplus (a_8 \cdot x_8) l(x)=a0⊕(a1⋅x1)⊕(a2⋅x2)⊕⋯⊕(a8⋅x8)

其中 a0a_0a0 到 a8a_8a8 是0或1,所以一共有 29=5122^9 = 51229=512 个不同的仿射函数。我们的目标,就是在这512个"直尺"里,找到离 f0f_0f0 最近的那一个。

第3步:计算与所有仿射函数的距离

对于这512个仿射函数中的每一个 lll,我们都要计算它和 f0f_0f0 的汉明距离。具体是把布尔函数 f0f_0f0 的256个输出列出来,然后仿射函数 lll 的256个输出对应也列出来,比较两者输出,把所有的"不同"累加起来,就是它们在这个输入空间上的整体差异的汉明距离。

布尔函数 f0f_0f0 仿射函数 lll
输入 输出 输入 输出
00 1 00 0
01 0 01 1
... ... ... ...
FF 0 FF 1

第4步:找到那个最小的距离

在计算完 f0f_0f0 与全部512个仿射函数的距离后,我们找出其中最小的那个数值。这个最小值,就是 f0f_0f0 的非线性度,得出 112 ,这意味着在全部256个输入中,即使是最接近 f0f_0f0 的那个仿射函数,也有112个输入上的输出与 f0f_0f0 不同。换句话说,哪怕攻击者拿到了"拟合效果最好"的那条直线,它在超过四成(约43.75%)的输入位置上依然会判断错误,这个误差已经大到无法用于线性密码分析。

介绍完非线性度,接下来我们看代数次数

在初等数学里,我们对"次数"并不陌生。它用来描述一个多项式里,变量的指数最高能到多少:

  • 一次函数 y=2x+1y = 2x + 1y=2x+1:变量最高只乘了1次,图像是一条直线;
  • 二次函数 y=x2−2x+1y = x^2 - 2x + 1y=x2−2x+1:变量出现了平方项(x2x^2x2),图像开始弯曲成抛物线;
  • 三次函数 y=x3−3xy = x^3 - 3xy=x3−3x:变量出现了立方项(x3x^3x3),曲线弯曲得更复杂了。

从这个角度看,"次数"本质上衡量的是"复杂度"。次数越高,代数表达式越复杂,变量之间相互影响的方式就越丰富。

在实数域里,我们通过"图像弯了几道弯"来感受这种复杂度。但是,当我们进入有限域的布尔世界,"次数"的这个名字保留了下来,但它的含义从曲线的弯曲转变成了逻辑表达式中变量相乘的缠绕层数。

在布尔函数(输入输出都是0/1)中,多项式不再有 x2x^2x2,取而代之的是 "不同变量相乘",比如 x1⋅x2x_1 \cdot x_2x1⋅x2。这个乘法对应着计算机底层的 "与门",表示这两个输入必须同时发生作用才能影响输出。

  • 次数 = 1 :表达式只含有单个变量,比如 x1⊕x2⊕1x_1 \oplus x_2 \oplus 1x1⊕x2⊕1;
  • 次数 = 2 :表达式里出现了两个变量相乘,比如 x1⋅x2x_1 \cdot x_2x1⋅x2。这意味着输出结果依赖于两个输入比特的"联动";
  • 次数 = 7 :表达式里出现了7个不同变量相乘,比如 x1⋅x2⋅x3⋅x4⋅x5⋅x6⋅x7x_1 \cdot x_2 \cdot x_3 \cdot x_4 \cdot x_5 \cdot x_6 \cdot x_7x1⋅x2⋅x3⋅x4⋅x5⋅x6⋅x7。这意味着输出结果同时依赖于7个输入比特的极其复杂的"联动"。

回到代数攻击的角度:攻击者想把加密过程写成方程组来求解。如果方程里最高只有 x1⋅x2x_1 \cdot x_2x1⋅x2(次数2),那么通过一些数学技巧,可以把这些二次项"消掉"或"线性化",最后变成一个一次方程组,高斯消元几秒钟就能算出密钥。

但当代数次数达到7时,这个表达式的缠绕结构太深,攻击者想要消掉这层7次"缠绕",就必须用高阶差分一层一层地剥开。每剥一层,数据量就翻一倍,剥到第7层时,耗费的资源已经和直接暴力穷举 282^828 种可能差不多了。这等于宣告代数攻击这条路走不通。

而 GF(28)\mathrm{GF}(2^8)GF(28) 的求乘法逆的代数次数是7,这个数来源于这个域的特性。

在有限域 GF(28)\mathrm{GF}(2^8)GF(28) 中,非零元素全体构成一个乘法群,群的阶为 28−1=2552^8 - 1 = 25528−1=255。根据群论中的拉格朗日定理(即费马小定理在有限域上的推广),对于任意非零元素 α\alphaα,都有:

α255=1 \alpha^{255} = 1 α255=1

这意味着,任意非零元素的255次方都等于乘法单位元1。

我们可以写成:

α⋅α254=1 \alpha \cdot \alpha^{254} = 1 α⋅α254=1

根据乘法逆元的定义(α⋅α−1=1\alpha \cdot \alpha^{-1} = 1α⋅α−1=1),比较可得:

α−1=α254 \alpha^{-1} = \alpha^{254} α−1=α254

所以,在 GF(28)\mathrm{GF}(2^8)GF(28) 中,求一个非零元素的乘法逆元这个操作,等价于计算该元素的 254 次方,我们把十进制数254转换成二进制:11111110,这个二进制数中,除了最低位(第0位)是0之外,第1位到第7位全部是1。也就是说,254的二进制表示中恰好包含7个1。

而在 GF(2)\mathrm{GF}(2)GF(2) 上(即所有系数只能是0或1),将一个幂函数 f(x)=xkf(x) = x^kf(x)=xk 展开成关于输入比特的布尔多项式时,其最高代数次数,恰好等于整数 kkk 的二进制表示中"1"的个数,这是次数7的由来。

简单来说:代数次数衡量的是"这个函数在代数表达式中,最多把几个输入比特'缠'在一起"。缠得越多,代数结构越复杂。

代数次数为什么重要?

密码学中有一种攻击方式叫代数攻击。它的基本思路是:把整个加密过程写成一个多元高次方程组,然后尝试求解。

如果S盒的代数次数很低(比如2或3),攻击者可以通过高阶差分等手段,把高次项一层层"磨平",最后得到一个次数较低、相对容易求解的方程组。

但如果代数次数很高(比如7),攻击者要消掉最高次项,就必须做7阶差分。每做一阶差分,需要的数据量都会翻倍。等到能把7次项彻底消掉时,所需的数据量已经逼近整个输入空间的大小(256种可能),这意味着攻击者付出的代价已经和暴力穷举相差无几,数学上的"捷径"走不通了。

所以,代数次数越高,抵抗代数攻击的能力就越强。

五、总结:为什么 AES 选择 GF(28)\mathrm{GF}(2^8)GF(28) 乘法逆元作为 S 盒

到这里,我们总结一下,为什么AES选择 GF(28)\mathrm{GF}(2^8)GF(28) 乘法逆元作为S盒的置换表。

S盒是AES中唯一的非线性部件,它的强度直接决定了整个算法的安全性。选择 GF(28)\mathrm{GF}(2^8)GF(28) 上的乘法逆元,是因为它同时满足了密码学对S盒的三大苛刻要求。

要求一:可逆性

加密必须可逆。乘法逆元在非零元素上是一一对应的双射,保证了S盒可逆,解密得以进行。

要求二:必须有极强的非线性

乘法逆元被数学证明具有极高的非线性度和极低的差分均匀度。

非线性度112:抵抗线性密码分析。任何"直线型"函数去近似它,256个输入中至少112个会猜错,统计攻击失效。

要求三:必须有高代数次数(抵抗代数攻击)

乘法逆元的代数次数为7(8比特空间的理论上限为8)。

攻击者若想通过解高次方程组(代数攻击)破解,必须进行7阶差分来消去这项,计算量会爆炸到与暴力穷举无异,使代数攻击在数学上不可行。

除了上述三个数学属性之外,还有一个同等重要但容易被忽视的理由:透明与可验证性 。GF(28)\mathrm{GF}(2^8)GF(28) 上的乘法逆元是公开的数学结构,没有设计者自由裁量的空间。任何人都可以独立计算并验证S盒的每一个值,这从根本上杜绝了隐秘后门的可能性。

参考阅读

  • AES标准文档(FIPS 197)
  • Nyberg, K. (1991). Perfect nonlinear S-boxes
  • 有限域与伽罗瓦理论相关教材

本文是对有限域及AES中 ( GF(2^8) ) 应用的系统性梳理,如有错误或疏漏,欢迎指正。

相关推荐
想你依然心痛3 天前
量子计算对嵌入式密码学的挑战与后量子算法准备
算法·密码学·量子计算
AI科技星5 天前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
被克制了6 天前
安全协议设计与分析(2)
网络安全·密码学·安全协议
风行南方6 天前
密码学之分组密码
网络·密码学
北域码匠8 天前
RIPEMD-128哈希算法深度解析
c#·密码学·哈希算法·加密算法·消息摘要·ripemd-128·原生实现
如君愿1 个月前
考研复习 Day 52 | 密码学--第九章 密钥管理(下)
密码学·课后习题
下午写HelloWorld1 个月前
可信执行环境(Trusted Execution Environment, TEE)技术解析与应用2026
密码学·数据安全·可信计算技术·tee·隐私保护·可信执行环境
终端域名1 个月前
密码学哈希函数:区块链 “不可篡改” 的核心数字指纹技术
区块链·密码学·哈希算法
国际学术会议-杨老师1 个月前
2026年量子算法、密码学与数据分析国际会议(QACDA 2026)
数据分析·密码学·量子计算