安全研究人员的数学指南
作为一名安全研究人员,即使不了解太多数学知识,你也能取得成功。但如果你想看透这个矩阵,就需要深入学习数学。
关于数学是被发现还是被发明的,有一个古老的哲学争论。小时候,我两者都不想做。数学感觉抽象且脱离现实,只是一套需要记忆的任意规则。很长一段时间里,我都在尽可能少用数学。
然而,当我开始学习机器学习的基础知识时,我的看法开始转变。后来,深入研究零知识证明为我打开了一个更广阔的数学世界。如今,我既因为数学本身的乐趣而喜欢它,它也让我对日常工作有了更深的理解。
在本文中,我将介绍一些数学领域,它们虽然不总是“必需”的,但对现代安全研究人员来说却是高杠杆的工具。不过请注意,我会绕一些路,探讨机器学习和物理学。
线性代数
在最简单的形式下,代数是在固定规则下操作符号的艺术。当我们解方程 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,则 A 是可逆的。求逆矩阵让你可以“撤销”一个变换。
示例:词元嵌入
一个非常普遍的应用是现代机器学习中使用的嵌入。训练一个大型语言模型会将每个词元(单词或子词)定位在高维空间中的一个点,将相关的词元拉近,将不相关的推开。
经典的例子:取向量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 的了解,而不透露它。
示例:证明 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):
| 约束 | a | b | c | 检查 |
|---|---|---|---|---|
| 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 = k | → | ln(x) + ln(y) = ln(k) |
| xᵃ · yᵇ = k | → | a·ln(x) + b·ln(y) = ln(k) |
| (x/y)ᵃ · zᵇ = k | → | a·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: 当前价格的对角矩阵(对角线上是每个资产的价格,其他地方为0)
- 名义风险敞口: 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.5 | x₂-x₁-0.5 | h₁ | h₂ | y=h₁+h₂ | 目标 |
|---|---|---|---|---|---|---|
| (0,0) | -0.5 | -0.5 | 0 | 0 | 0 | 0 ✓ |
| (0,1) | -1.5 | 0.5 | 0 | 0.5 | 0.5 | 1 ✓ |
| (1,0) | 0.5 | -1.5 | 0.5 | 0 | 0.5 | 1 ✓ |
| (1,1) | -0.5 | -0.5 | 0 | 0 | 0 | 0 ✓ |
设置阈值为 0.25,所有输出都正确分类。
几何图像 隐藏层“折叠”了输入空间。点 (0,0) 和 (1,1) 坍缩到原点,而 (0,1) 和 (1,0) 被推到不同的轴上。现在,一个简单的线性边界就能分隔这些类别。
抽象代数:结构与对称性的数学
抽象代数研究群、环、域等结构。它将算术推广到数字之外,扩展到可以在特定规则下组合的对称操作、矩阵或函数。
这个领域诞生于求解多项式方程的尝试。在 1830 年代,埃瓦里斯特·伽罗瓦——一位在 20 岁时死于决斗的杰出数学家——意识到多项式根的对称性构成了一种代数结构。他证明了为什么一般的五次方程没有根式解,并在此过程中发明了群论。
群:对称性的代数
一个群是一个集合 G 以及一个满足四个规则的运算 ·:
- 封闭性: 对于所有 a, b ∈ G,a·b ∈ G(组合两个元素得到集合中的另一个元素)
- 结合律: (a·b)·c = a·(b·c)(括号的位置不影响结果)
- 单位元: 存在 e 使得 e·a = a·e = a(存在一个“什么都不做”的元素)
- 逆元: 对于每个 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)
用通俗的话说:在映射之前或之后组合元素,结果是一样的。这种“结构保持”是密码学的秘密武器。
用于隐藏信息的同态
同态允许你在不暴露隐藏值的情况下对其进行计算。
佩德森承诺:通过在离散对数困难的群中计算 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:
- 选择随机数 k
- 计算 R = k·G(椭圆曲线上的标量乘法)
- r = R 的 x 坐标
- 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: d = (s₁·k - z₁)/r
索尼的私钥可以通过简单的代数计算出来 :)
数论:数学的女王
人类追逐数论谜题已有数千年。毕达哥拉斯学派崇拜整数,并偶然发现了无理数。皮埃尔·德·费马在他著名的页边空白处写下了关于幂和的注释。卡尔·弗里德里希·高斯称数论为“数学的女王”,并以其《算术研究》将其变成一门学科。
几个世纪以来,它一直是纯数学的典范:美丽但无实际应用的谜题。然后到了 1970 年代,公钥密码学让素数开始发挥作用。
单向门:因数分解
安全领域中最典型的数论问题是因数分解。给定两个大素数 p 和 q,计算 n = p × q 是容易的。但反过来,仅给定 n 找到 p 和 q,对于大数来说在计算上是不可行的。 RSA 的安全性依赖于这种单向难度。
示例:玩具 RSA
让我们用小素数构建 RSA 来看看其中的数学:
- 选择素数: p = 61, q = 53 → n = p × q = 3233
- 计算欧拉函数: φ(n) = (p-1)(q-1) = 60 × 52 = 3120(φ(n) 统计与 n 互质的小于 n 的正整数个数)
- 选择公钥指数: e = 17(必须与 φ(n) 互质)
- 计算私钥指数: d = e⁻¹ mod φ(n) → 17d ≡ 1 (mod 3120) → d = 2753 公钥: (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)),对于某个 k 有 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。
为什么有效?考虑集合 {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^6 ≡ 1 (mod 7)
阶乘从两边消去,得到费马定理。
回想一下 RSA 解密是如何工作的?我们需要 m^(ed) ≡ m (mod n)。欧拉定理(费马定理对合数的推广)正是使这成为可能的原因。素数的结构是公钥密码学的数学基石。
Schwartz-Zippel 引理:为什么 ZK 证明可以很小
Schwartz-Zippel 引理是我一直以来最喜欢的定理之一。它使得在几毫秒内验证任意长的证明成为可能!
问题: 假设我有两个多项式,想检查它们是否相同。朴素的方法是比较所有系数——对于高次多项式来说代价高昂。但有一个捷径。
Schwartz-Zippel 引理: 令 P(x) 是域 𝔽 上的一个非零 d 次多项式。如果你从 𝔽 中随机选取一个点 r,那么 P(r) = 0 的概率最多为 d/|𝔽|。
换句话说:非零多项式相对于域的大小,其根非常少。
考虑 P(x) = x³ - 6x² + 11x - 6 = (x-1)(x-2)(x-3)。这个 3 次多项式正好有 3 个根:{1, 2, 3}。 如果我们在 𝔽₁₀₁(模 101 整数)中工作,随机评估落在根上的概率最多为 3/101 ≈ 3%。一次随机检查就给了我们 97% 的置信度,认为该多项式非零。这将多项式恒等测试从 O(d) 次系数比较转变为 O(1) 次点评估:
- 想证明:对所有 x,P(x) = Q(x)
- 等价于:对所有 x,P(x) - Q(x) = 0
- 测试:选择随机 r,检查 P(r) - Q(r) = 0
- 如果 P ≠ Q,差多项式次数 ≤ d,因此在 |𝔽| 种可能性中最多有 d 个根。
- 随机 r 命中根的概率 ≤ d/|𝔽|。
对于密码学中的域大小(|𝔽| ≈ 2²⁵⁶),即使是百万次多项式,碰撞概率也 ≈ 1⁰⁶/2²⁵⁶ ≈ 0。
现代的 ZK 系统(Groth16, PLONK, STARKs)将计算编码为多项式约束。证明者想说服验证者“我正确地执行了这个计算”,而不透露输入。
协议通常这样工作:
- 将计算编码为多项式:正确的执行轨迹满足对于某个域中的所有 x,P(x) = 0
- 证明者对多项式进行承诺:使用隐藏系数的密码学承诺
- 验证者选择随机挑战 r:在承诺之后(这样证明者不能作弊)
- 证明者揭示 P(r):只有一个域元素
- 验证者检查 P(r) = 0:如果为真,则以压倒性概率接受
根据 Schwartz-Zippel,一个承诺了错误多项式的作弊证明者通过检查的概率 ≥ 1 — d/|𝔽| ≈ 1。 因此,验证一个需要数百万步的计算,简化为检查单个点! 这就是 ZK 证明“简洁”的原因——证明大小和验证时间与原始计算相比非常小。
数理逻辑:证明的局限性
在 1930 年代,艾伦·图灵和阿隆佐·丘奇从不同角度探讨了计算的基础。图灵想象了一台带有纸带的机器,而丘奇发明了一个称为λ演算的纯函数系统。值得注意的是,它们是等价的——你可以用循环和状态做的任何事情,也可以用递归函数完成。
这导致了柯里-霍华德对应:“证明即程序”。一个数学证明对应一个计算机程序;一个数学公式对应一个数据类型。
哥德尔不完备定理
数理INCOMPLETE CSD0tFqvECLokhw9aBeRqvREddHT+Av4FcCPxYr38QBLcmIkwxUn4jBeruzi1lOcdU9DfXEwy+EOy99pXx5VKoGML4Md5HbpWDdKGVCLQeJ1dwGyeCWG1TmeUSO6uznE