安全研究员的数学进阶指南:从线性代数到零知识证明

2 阅读24分钟

安全研究员的数学指南

你可以成为一位不精通数学的成功安全研究员。但如果你想看透矩阵,你就得“服下数学”这剂猛药。

有一个古老的哲学争论:数学是被发现的还是被发明的?小时候,我对这两者都不感兴趣。数学感觉抽象且脱离现实,只是一套需要死记硬背的任意规则。很长一段时间里,我都试图尽可能地少碰数学。

然而,当我开始学习机器学习基础时,我的看法开始转变。后来,深入研究零知识证明为我打开了更广阔的数学世界。如今,我既享受数学本身的乐趣,它也让我对日常工作有了更深的理解。

在本文中,我将介绍一些数学领域,它们虽然不总是严格意义上的“必需”,但对现代安全研究员来说却是高杠杆率的工具。不过要提醒你,我会在机器学习与物理领域做些“绕路”。

线性代数

在最简单的层面,代数是关于在固定规则下操纵符号的艺术。当我们解 2x + 3 = 11 时,“代数”就是减去 3 再除以 2 以分离出 x。在 19 世纪,像高斯这样的数学家系统化了求解这类方程的方法,从而引出了矩阵的概念及其操作算法。

线性代数 是运算保持 线性 的分支。如今,它是 3D 图形、推荐引擎和机器学习的基石。大型语言模型本质上就是一个巨大的矩阵乘法堆栈,其中混合了非线性操作。

“线性”到底是什么意思?

人们有时用“线性”作为“简单”的简称,但在数学中,它是一个结构约束。一个变换 L 是线性的,如果它满足两个规则:

  • 可加性:L(u + v) = L(u) + L(v)
  • 齐次性:L(c·v) = c·L(v)

通俗地说:如果你先转换两样东西再把结果相加,与你先把它们相加再转换,得到的结果是一样的。如果你在转换前缩放某个东西,与先转换再缩放,结果也一样。

从几何角度想:如果你有一个网格,线性变换可能会旋转、拉伸或剪切它,但网格线保持平行且等距。它永远不会弯曲或扭曲空间。

向量和矩阵:基础构建块

一个向量 简单来说就是一串数字,如 v = (v₁, v₂, …, vₙ)。你可以把它想象成空间中的一个点,或指向某个方向的一个箭头。我们通常将向量视为向量空间 ℝⁿ 中的列向量(所有 n 维实数列表的集合)。

一个矩阵 是一个数字网格,用于转换向量。如果 A 是一个矩阵,x 是一个向量,将它们相乘(A·x)会得到一个新向量。把矩阵想象成一个机器:你输入一个向量,它吐出一个转换后的向量。

让我们将一个 2×2 矩阵与一个向量相乘: A = | 2 3 | x = | 5 | | 4 -1 | | 2 |

A·x = | 2×5 + 3×2 | = | 10 + 6 | = | 16 | | 4×5 + (-1)×2 | | 20 - 2 | | 18 |

A 的每一行都与 x 进行“点积”:将对应项相乘并求和。这个操作正是每个神经网络层、每个 3D 旋转以及马尔可夫链中每个状态转换在底层的运行方式。

基本运算

  • 点积:⟨x, y⟩ = xᵀy = Σᵢ xᵢyᵢ。这会将对应项相乘并求和。它衡量两个向量的“对齐”程度;如果它们方向相似,点积就大且为正。一个向量的长度是 ‖x‖ = √⟨x, x⟩(到原点的欧几里得距离)。
  • 矩阵乘法:(AB)ᵢⱼ = Σₖ AᵢₖBₖⱼ。组合两个线性变换(先做 A,再做 B)等价于将它们对应的矩阵相乘。
  • 单位矩阵和逆矩阵:单位矩阵 Iₙ 在对角线上是 1,其他地方是 0——它是一个“什么都不做”的变换。一个矩阵 A 是可逆的,如果存在一个 A⁻¹ 使得 AA⁻¹ = I。求逆可以让你“撤销”一个变换。

示例:Token 嵌入

一个非常普遍的应用是在现代机器学习中使用的嵌入。训练大型语言模型会将每个 token(单词或子词单元)定位在高维空间中的一个点,将相关的 token 推近,不相关的推远。

经典的例子:取“King”的向量,减去“Man”,加上“Woman”,结果会惊人地接近“Queen”: King - Man + Woman ≈ Queen

这之所以有效,是因为模型学习到“King”和“Queen”之间的差异方向与“Man”和“Woman”大致相同——我们可以称之为“性别”方向。我们正在进行“意义计算”,这有多酷!你可以利用这些几何关系构建语义搜索、聚类或提示导向工具。

零知识证明系统中的电路表示

零知识证明系统通常将验证简化为检查一组线性方程。关键洞察在于,任何计算都可以编码为有限域上的一个线性约束系统。这个过程称为“算术化”。

秩一约束系统 (R1CS)

一个常见的表示是秩一约束系统 (R1CS)。我们证明我们知道一个秘密解向量 s(称为“见证”),使得对于许多向量三元组 (a, b, c) 满足: (s · a) × (s · b) = s · c

如果所有这些等式(使用点积)都成立,则程序逻辑被正确执行。证明者在不泄露 s 的情况下证明其知道 s。

示例:证明 x³ + x + 5 = 35

假设我们想证明我们知道 x 满足 x³ + x + 5 = 35(剧透:答案是 x = 3)。

步骤 1:扁平化为二次门 R1CS 每个约束只能处理一次乘法,所以我们引入中间变量来分解三次方:

v₁ = x × x        (计算 x²)
v₂ = v₁ × x       (计算 x³)
out = v₂ + x + 5  (最终求和)

步骤 2:构建见证向量 s = [1, x, v₁, v₂, out] = [1, 3, 9, 27, 35] 开头的“1”是一个常数项,让我们能够在约束中编码加法和常数。

步骤 3:编码为 R1CS 约束 每个乘法门变为 (s·a) × (s·b) = (s·c)

约束abc检查
v₁ = x × x[0,1,0,0,0][0,1,0,0,0][0,0,1,0,0]3 × 3 = 9 ✓
v₂ = v₁ × x[0,0,1,0,0][0,1,0,0,0][0,0,0,1,0]9 × 3 = 27 ✓
out = v₂ + x + 5[5,1,0,1,0][1,0,0,0,0][0,0,0,0,1]35 × 1 = 35 ✓

最后一个约束使用了一个技巧:我们将 (v₂ + x + 5) 乘以 1,以将加法编码为“乘法”。

当审查 Groth16 电路时,你要检查这些约束矩阵是否正确编码了预期的计算。缺失一个约束或系数错误都意味着证明者可以作弊。

对 DeFi 不变量的线性化

DeFi 不变量几乎总是幂次下的乘积或比率(Uniswap v2 的 x·y=k,Balancer 的加权几何平均数,Curve 的二者组合)。我们可以通过将它们转化为线性方程来解锁强大的分析技术,然后可以用高中代数、电子表格或矩阵运算来解决。关键技术是对数线性化

对数有一个神奇的性质:它们将乘法转化为加法。

  • ln(a × b) = ln(a) + ln(b)
  • ln(aⁿ) = n · ln(a)

这意味着任何由乘法和幂运算构建的方程都可以转化为加法和标量乘法,这正是“线性”的含义:

原始形式线性化形式
x · y = kln(x) + ln(y) = ln(k)
xᵃ · yᵇ = ka·ln(x) + b·ln(y) = ln(k)
(x/y)ᵃ · zᵇ = ka·ln(x) - a·ln(y) + b·ln(z) = ln(k)
示例:Balancer 风格的 AMM

自动做市商维护一个可以被线性化的不变量。取一个 Balancer 风格的池,储备为 x = (xₐ, xᵦ, xᵧ),权重为 w = (0.5, 0.3, 0.2)。其不变量是: xₐ^0.5 × xᵦ^0.3 × xᵧ^0.2 = k

这是一个到处都是乘积和幂的非线性方程。你无法轻易在电子表格中求解。但看看我们对两边取对数后会发生什么:

起始方程: xₐ^0.5 × xᵦ^0.3 × xᵧ^0.2 = k

两边取 ln(): ln(xₐ^0.5 × xᵦ^0.3 × xᵧ^0.2) = ln(k)

应用 ln(a × b) = ln(a) + ln(b): ln(xₐ^0.5) + ln(xᵦ^0.3) + ln(xᵧ^0.2) = ln(k)

应用 ln(aⁿ) = n·ln(a): 0.5·ln(xₐ) + 0.3·ln(xᵦ) + 0.2·ln(xᵧ) = ln(k)

现在代入变量。设 vₐ = ln(xₐ), vᵦ = ln(xᵦ), vᵧ = ln(xᵧ)0.5·vₐ + 0.3·vᵦ + 0.2·vᵧ = ln(k)

这是一个关于 v 变量的线性方程!以向量形式表示: w · v = c 其中 w = [0.5, 0.3, 0.2], v = [vₐ, vᵦ, vᵧ], c = ln(k)

分析一笔交易

假设池起始状态为 x = (1000, 800, 600)。一个交易者想添加 100 单位的 A 并只提取 B。我们需要找到 Δᵦ,使得不变量保持。

对数空间中的变化必须满足 w · Δv = 0(不变量常数不变): 0.5 × ln(1100/1000) + 0.3 × ln((800-Δᵦ)/800) + 0.2 × 0 = 0

逐步求解: 0.5 × 0.0953 + 0.3 × ln((800-Δᵦ)/800) = 0 0.0477 + 0.3 × ln((800-Δᵦ)/800) = 0 ln((800-Δᵦ)/800) = -0.159 (800-Δᵦ)/800 = e^(-0.159) = 0.853 Δᵦ ≈ 117.6

一阶近似(用于快速实验):对于小变化,ln(1 + δ) ≈ δ。这给出了一个更简单的矩阵形式: w · (Δx / x) = 0 [0.5, 0.3, 0.2] · [100/1000, -Δᵦ/800, 0]ᵀ = 0 0.5 × 0.1 + 0.3 × (-Δᵦ/800) = 0 Δᵦ ≈ 133.33

线性近似略微高估了,但提供了一个快速的合理性检查。审计人员用此来界定滑点或在闪电贷序列中检测不变量违反。

示例:永续合约交易所风控引擎

永续合约交易所维护着复杂的风控引擎,可以使用线性代数优雅地建模。尽管具体实现各异,其数学结构是通用的。

核心组件

  • 仓位向量 p:每个市场一个分量(例如,p = [+2 BTC, -5 ETH, +1000 USDC])。
  • 价格矩阵 P:一个当前价格的对角矩阵(对角线上是每个资产的价格,其他地方为零)。
  • 名义敞口P·p 给出每个仓位的美元价值。
  • 保证金系数矩阵 C:编码每个市场的最低维持保证金要求。

偿付能力测试 变成一个简单的矩阵不等式: C · (P · p) ≥ m 其中 m 是最低权益向量。换句话说:将仓位乘以价格得到美元价值,应用保证金系数,检查是否高于最低要求。

压力测试 通过一个敏感性矩阵 S 施加一个冲击向量 s(例如,“BTC 下跌 20%,ETH 下跌 30%”): C · (P · (p + S·s)) ≥ m 如果失败,则触发清算。

每一步都是一个带有安全防护的矩阵-向量乘法。通过这样建模系统,你可以:

  • 在电子表格中编写约束并测试边缘情况。
  • 找到单独满足保证金要求但组合起来会失败的仓位。
  • 识别可能引发级联清算的价格波动。
  • 检查舍入误差是否累积到危险程度。

理解这个结构让你能够审计清算逻辑,并找到仓位可能从裂缝中溜走的边缘情况。

非线性:模拟真实世界的复杂性

我们刚刚学习了线性代数及其应用。但现实世界是混乱的,许多事物无法用线性关系建模。

例如,如果神经网络仅由线性层组成,它们会坍缩成一个巨大的矩阵乘法。从数学上讲,顺序应用矩阵 A 然后 B(A × B × x)与应用一个新矩阵 C(其中 C = AB)是一样的。无论你堆叠多少层,如果它们都是线性的,整个网络就只是一个线性操作。它无法学习任何复杂的东西。

XOR 问题

考虑 XOR 函数(异或)。仅当输入不同时,它才输出 1:

输入输出
(0,0)0
(1,1)0
(0,1)1
(1,0)1

想象在纸上画出这些点。你在左下角和右上角有两个“0”点,在左上角和右下角有两个“1”点。现在拿一把尺子,尝试画一条直线将 0 和 1 分开。你做不到。这就是线性不可分。一个线性分类器在这里 100% 会失败。

为了解决这个问题,神经网络在线性层之间应用非线性激活函数(如 ReLU 和 Sigmoid)。最常见的是 ReLU(修正线性单元): f(x) = max(0, x) 它将所有负数变为零,正数保持不变。这看似简单,却改变了一切!

几何直觉:线性变换可以旋转或拉伸纸张,但保持其平坦。非线性函数实际上折叠了纸张。如果你沿着 0 所在的对角线折痕,你可以将这些角从 1 所在的位置折叠开。现在,在这个折叠后的 3D 空间中,你可以切一个平面来分隔它们。

示例:神经网络如何解决 XOR

关键洞察是,隐藏层转换输入空间,使得类别变得线性可分。让我们构建一个实际有效的网络。

策略:XOR 在两种情况下输出 1:(0,1) 和 (1,0)。我们将创建两个隐藏神经元,每个检测一种情况:

  • h₁ 检测“x₁ 开启,x₂ 关闭” → 对 (1,0) 触发
  • h₂ 检测“x₂ 开启,x₁ 关闭” → 对 (0,1) 触发 那么输出就是:如果任一隐藏神经元触发,输出 1。

网络

  • 输入层:x = [x₁, x₂]
  • 隐藏层(2个带 ReLU 激活的神经元):
    • h₁ = ReLU(x₁ - x₂ - 0.5) # 当 x₁ > x₂ + 0.5 时触发
    • h₂ = ReLU(x₂ - x₁ - 0.5) # 当 x₂ > x₁ + 0.5 时触发
  • 输出层:y = h₁ + h₂ # 对检测器求和

验证

输入x₁-x₂-0.5x₂-x₁-0.5h₁h₂y=h₁+h₂目标
(0,0)-0.5-0.50000 ✓
(0,1)-1.50.500.50.51 ✓
(1,0)0.5-1.50.500.51 ✓
(1,1)-0.5-0.50000 ✓

在 0.25 的阈值下,所有输出都正确分类。

几何图示

  • 原始输入空间无法用一条线分离点。
  • 转换后的空间 (h₁, h₂) 中,(0,0) 和 (1,1) 坍缩到原点,而 (0,1) 和 (1,0) 被推到不同轴上。现在,一个简单的线性边界 y=0.25 就能分离它们。

隐藏层“折叠”了输入空间。现在一个简单的线性边界就能区分类别。

抽象代数:结构与对称性的数学

抽象代数研究像群、环这样的结构。它将算术从数字推广到可以在特定规则下组合的对称操作、矩阵或函数。

这个领域诞生于求解多项式方程的尝试。在 1830 年代,埃瓦里斯特·伽罗瓦——一位在 20 岁时死于决斗的杰出数学家——意识到多项式根的对称性形成了一种代数结构。他证明了为什么五次及以上的一般多项式没有根式解,并在此过程中发明了群论。

群:对称性的代数

一个是一个集合 G,带有一个满足四条规则的运算 ·:

  1. 封闭性:对于所有 a, b 在 G 中,a·b 也在 G 中(组合两个元素得到集合中的另一个元素)。
  2. 结合律:(a·b)·c = a·(b·c)(括号不影响结果)。
  3. 单位元:存在 e 使得 e·a = a·e = a(存在一个“什么都不做”的元素)。
  4. 逆元:对于每个 a,存在 a⁻¹ 使得 a·a⁻¹ = e(一切皆可撤销)。

经典例子:整数加法群 (ℤ, +)。单位元是 0,n 的逆元是 -n。

但为什么是“对称性”?

群与对称性的联系从整数例子中并不明显。要看到它,考虑一个更几何的例子:等边三角形的对称性

你可以用一些方式变换一个等边三角形,使其看起来完全相同:旋转 120°,旋转 240°,或沿三个轴中的任意一个翻转。包括“什么都不做”,你正好有 6 种对称操作。这些操作形成一个群:

  • 封闭性:执行一个对称操作后再执行另一个,得到另一个对称操作(旋转 120°两次等同于旋转 240°)。
  • 结合律:组合三个操作的顺序不重要。
  • 单位元:“什么都不做”使三角形保持不变。
  • 逆元:每个旋转都可以被撤销(顺时针 120°撤销逆时针 120°)。

这是二面体群 D₃——等边三角形的对称群。

整数加法群也是一个对称群,只是更抽象。把它想象成一个无限数轴的对称性:加 3 将每个点向右移动 3,这个“移位”操作保持了数轴的结构(点之间的距离保持不变)。加 0 是“什么都不做”,加 -3 撤销了加 3。

关键洞察:每当你有一组保持某种结构的变换,这些变换自然会形成一个群。数学家发现,群公理(封闭性、结合律、单位元、逆元)正是捕获“你可以做和撤销,同时保持结构”所需的条件。

物理学的联系:诺特定理

20 世纪初,艾米·诺特证明了历史上最深刻的定理之一:物理系统的每一个连续对称性都对应一个守恒定律

  • 时间对称性(物理学不会逐日变化)→ 能量守恒
  • 平移对称性(物理学在此处与在空间中别处相同)→ 动量守恒
  • 旋转对称性(你面向哪个方向不重要)→ 角动量守恒

事实证明,自然界的基本力也是从对称性中产生的!物理学家用 SU(3) × SU(2) × U(1) 来描述粒子物理学的标准模型。该公式中的每个群对应一种力:

  • U(1) → 电磁力(由光子携带)
  • SU(2) → 弱核力(由 W⁺、W⁻ 和 Z 玻色子携带)
  • SU(3) → 强核力(由 8 种胶子携带)

力载体的数量由群的数学决定。U(1) 有 1 个生成元,所以电磁力有 1 种力载体(光子)。SU(2) 有 3 个生成元,给出 3 种弱玻色子。SU(3) 有 8 个生成元,因此有 8 种胶子。

基本上,物理学家问:“如果我们要求物理定律在某些局部变换下保持不变,会怎样?” 这个要求,称为规范不变性,在数学上强制了力载体的存在。数学决定了物理学。

甚至连引力也符合这个模式。广义相对论源于要求物理学在任意坐标变换下保持不变(微分同胚不变性)。我们体验为引力的时空曲率,正是保持这种对称性的“规范场”。

这可以说是现代物理学中最深刻的洞察:现实的结构不是任意的。力、粒子及其相互作用是抽象对称性要求的必然结果。宇宙在其核心,似乎是一个定理。

将漏洞视为对称性破缺

将软件漏洞视为对称性破缺是一个强大的思维模型。一个安全的系统依赖于不变量——无论发生什么有效交易,都必须保持为真的属性。一个漏洞,就是一种打破这种对称性的变换。

当你审计一个智能合约时,你实际上是在检查这个微观宇宙的“物理定律”是否在所有可能的操作下都能成立。可以通过输入模糊测试和形式化验证等过程来检查不变量。

环和域:密码学的栖身之所

一个是一个带有两个运算(+ 和 ×)的集合,其中加法构成一个群,乘法是结合的,并且乘法对加法满足分配律。可以把它想象成“有加法和乘法,但你可能不能总是做除法”。

一个是一个也可以做除法的环(每个非零元素都有乘法逆元)。这是大多数密码学赖以生存的代数结构。

模 n 整数(写作 ℤ/nℤ 或 ℤₙ)形成一个环。它们只有当 n 是素数时才形成域——这就是密码学偏爱素数的原因。

示例:ℤ₇ 中的算术

在 ℤ₇(模 7 整数)中,我们进行算术运算,然后取除以 7 的余数:

  • 加法:5 + 4 = 9 ≡ 2 (mod 7)
  • 乘法:5 × 4 = 20 ≡ 6 (mod 7)
  • 逆元:5⁻¹ = ? (找到 x 使得 5x ≡ 1 mod 7) → 5 × 3 = 15 ≡ 1 (mod 7),所以 5⁻¹ = 3
  • 除法:4/5 = 4 × 5⁻¹ = 4 × 3 = 12 ≡ 5 (mod 7)

扩展欧几里得算法 系统地找到逆元。

同态:保结构的映射

一个群同态是一个函数 f: G → H,它尊重运算: f(a · b) = f(a) · f(b)

通俗地说:无论你是先组合再映射,还是先映射再组合,结果都一样。这种“保结构”是密码学的秘密武器。

用于隐藏信息的同态

同态让你可以在不揭示隐藏值的情况下对其进行计算。

Pedersen 承诺:通过计算 C = gᵐhʳ 来隐藏一个值 m,其中离散对数问题是困难的:

  • g, h 是公共生成元
  • m 是你的秘密消息
  • r 是一个随机盲化因子

这个承诺是同态的Commit(m₁, r₁) × Commit(m₂, r₂) = g^(m₁+m₂) × h^(r₁+r₂) = Commit(m₁+m₂, r₁+r₂)

你可以在不揭示内部内容的情况下添加承诺!这是机密交易和许多 ZK 协议的基础。Groth16 和 PLONK 证明将程序约束嵌入到群元素中,使得验证方程简化为检查同态是否保持了结构。

在此停顿一下,注意刚刚发生了什么。“保结构”只是对称性的另一个名字。同样的思想出现在几何、物理和密码学中,因为现实在每一个层面上都是由对称性构建的!

PlayStation 3 黑客事件

索尼以惨痛的方式学习了抽象代数。他们在其 ECDSA 实现中重复使用了随机数 k

ECDSA 的工作原理: 对于私钥 d 和消息哈希 z:

  1. 选择随机数 k
  2. 计算 R = k·G(椭圆曲线上的标量乘法)
  3. r = R 的 x 坐标
  4. s = k⁻¹(z + r·d) mod n

签名是 (r, s)。

漏洞: 如果你对两个不同的消息 z₁z₂ 使用了相同的 k

s₁ = k⁻¹(z₁ + r·d)
s₂ = k⁻¹(z₂ + r·d)

相减: s₁ - s₂ = k⁻¹(z₁ - z₂) 因此: k = (z₁ - z₂)/(s₁ - s₂) 一旦你得到 k,就可以计算 dd = (s₁·k - z₁)/r

索尼的私钥可以用简单的代数计算出来 :)

数论:数学皇后

人类追逐数论难题已有数千年。毕达哥拉斯学派崇拜整数,偶然发现了无理数。皮埃尔·德·费马在书页边缘潦草地写下了他关于幂和的著名注记。卡尔·弗里德里希·高斯称数论为“数学皇后”,并以其《算术研究》将其转变为一门学科。

几个世纪以来,它是纯粹数学的典范:美丽但无实际应用的难题。然后,20 世纪 70 年代到来,公钥密码学让素数派上了用场。

单向门:因式分解

安全领域中最典型的数论问题是因式分解。给定两个大素数 p 和 q,计算 n = p × q 很简单。但反过来——仅给定 n 找出 p 和 q——对于大数来说在计算上是不可行的。RSA 的安全性就依赖于这种单向难度。

示例:玩具 RSA

让我们用小素数构建 RSA 来看看数学原理:

  1. 选择素数p = 61, q = 53n = p × q = 3233
  2. 计算欧拉函数 φ(n)φ(n) = (p-1)(q-1) = 60 × 52 = 3120(φ(n) 计算小于 n 且与 n 互质的数的个数)。
  3. 选择公钥指数 ee = 17(必须与 φ(n) 互质)。
  4. 计算私钥指数 dd = e⁻¹ mod φ(n)17d ≡ 1 (mod 3120)d = 2753(验证:17 × 2753 = 46801 = 15 × 3120 + 1)。
  • 公钥:(n=3233, e=17)
  • 私钥:(n=3233, d=2753)

加密(消息 m=123): c = mᵉ mod n = 123¹⁷ mod 3233 = 855

解密m = cᵈ mod n = 855²⁷⁵³ mod 3233 = 123

为何有效:欧拉定理指出,对于与 n 互质的 m,有 m^φ(n) ≡ 1 (mod n)。由于 ed ≡ 1 (mod φ(n)),我们可以写 ed = 1 + k·φ(n)。因此: cᵈ = (mᵉ)ᵈ = m^(ed) = m^(1 + k·φ(n)) = m × (m^φ(n))^k ≡ m × 1^k = m (mod n)

离散对数问题

另一个主要问题:给定 gˣ mod p,求 x。对于大素数,没有已知的高效算法。

示例:求 x 使得 5ˣ ≡ 20 (mod 23)

  • 5¹ = 5
  • 5² = 25 ≡ 2
  • 5³ = 10
  • 5⁴ = 50 ≡ 4
  • 5⁵ = 20 ✓ 所以 x = 5。

对于 2048 位的素数,暴力破解所需的时间比宇宙的年龄还长。这为 Diffie-Hellman 密钥交换提供了动力。

椭圆曲线算术

有限域上的椭圆曲线给出了具有困难离散对数问题但操作高效的群。

有限域 𝔽ₚ 上的椭圆曲线:y² = x³ + ax + b (mod p)

点加法: 对于 P = (x₁, y₁)Q = (x₂, y₂)

  • 如果 P ≠ Q:斜率 m = (y₂ - y₁)/(x₂ - x₁) mod p
  • 如果 P = Q(点加倍):斜率 m = (3x₁² + a)/(2y₁) mod p 结果 R = P + Q
xᵣ = m² - x₁ - x₂ mod p
yᵣ = m(x₁ - xᵣ) - y₁ mod p

所有算术运算都在域 𝔽ₚ 内进行,包括除法(实际上是乘以模逆元)。

费马小定理

在我们离开经典数论之前,让我展示其最优雅的结果之一。

费马小定理:如果 p 是素数,且 a 不能被 p 整除,则: a^(p-1) ≡ 1 (mod p)

就是这样。将任何数提升到 (p-1) 次幂,除以 p,余数总是 1。

让我们用 p=7 验证:

  • 2^6 = 64 = 9×7 + 1 → 余数 1 ✓
  • 3^6 = 729 = 104×7 + 1 → 余数 1 ✓
  • 5^6 = 15625 = 2232×7 + 1 → 余数 1 ✓

为什么有效? 考虑集合 {1, 2, 3, 4, 5, 6} mod 7。将每个元素乘以 3:{3×1, 3×2, 3×3, 3×4, 3×5, 3×6} mod 7 = {3, 6, 2, 5, 1, 4}。我们得到了相同的集合,只是顺序重排了!当乘以与 p 互质的数时,这总是会发生。所以:

(3×1)(3×2)(3×3)(3×4)(3×5)(3×6) ≡ 1×2×3×4×5×6 (mod 7)
3^6 × (1×2×3×4×5×6) ≡ (1×2×3×4×5×6) (mod 7)
3^61 (mod 7)

阶乘从两边约掉,得到费马定理。

还记得 RSA 解密是如何工作的吗?我们需要 m^(ed) ≡ m (mod n)。欧拉定理(费马小定理对合数的推广)正是实现这一点的关键。素数的结构是公钥密码学的数学基石。

施瓦茨-齐普尔引理:为什么 ZK 证明可以很小

施瓦茨-齐普尔引理 是我最喜欢的定理之一。它使得在毫秒内验证任意长的证明成为可能!

问题:假设我有两个多项式,想检查它们是否相同。朴素的方法是逐个比较系数——对于高次多项式来说成本太高。但有一个捷径。

施瓦茨-齐普尔引理:设 P(x) 是域 𝔽 上的一个非零 d 次多项式。如果你从 𝔽 中随机选取一个点 r,那么 P(r) = 0 的概率最多为 d/|𝔽|

换句话说,非零多项式相对于域的大小只有很少的根。 考虑 P(x) = x³ - 6x² + 11x - 6 = (x-1)(x-2)(x-3)。这个三次多项式恰好有 3 个根:{1, 2, 3}。 如果我们在域 𝔽₁₀₁(模 101 的整数)中工作,随机求值落在根上的概率最多为 3/101 ≈ 3%。一次随机检查给了我们 97% 的把握相信这个多项式是非零的。这将多项式恒等测试从 O(d) 次系数比较转变为 O(1) 次点求值。

  • 想要证明:P(x) = Q(x) 对所有 x 成立。
  • 等价于:P(x) - Q(x) = 0 对所有 x 成立。
  • 测试:随机选择 r,检查 P(r) - Q(r) = 0
  • 如果 P ≠ Q,则差值多项式的次数 ≤ d,所以它在 |𝔽| 种可能性中最多有 d 个根。随机 r 命中一个根的概率 ≤ d/|𝔽|

对于加密领域的域大小(|𝔽| ≈ 2²⁵⁶),即使是百万次多项式,INCOMPLETE CSD0tFqvECLokhw9aBeRqvREddHT+Av4FcCPxYr38QBLcmIkwxUn4jBeruzi1lOcdU9DfXEwy+EOy99pXx5VKoGML4Md5HbpWDdKGVCLQeJ1dwGyeCWG1TmeUSO6uznE