安全研究员的数学指南:从线性代数到密码学与形式验证

3 阅读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,则它是可逆的。求逆可以让你“撤销”一个变换。

示例:词嵌入

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

经典的例子:取“King”的向量,减去“Man”,加上“Woman”,结果非常接近“Queen”:

King - Man + Woman ≈ Queen

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

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

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

Rank-1 约束系统 (R1CS)

一个常见的表示是 Rank-1 约束系统。我们证明我们知道一个秘密解向量 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 如果失败,则触发清算。

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

  • 在电子表格中编写约束并测试边缘情况
  • 找到单独满足保证金要求但组合起来会失败的头寸
  • 识别可能导致大规模清算级联的价格变动
  • 检查舍入误差是否会危险地累积

理解这种结构可以让你审计清算逻辑并找到头寸漏网的边缘情况。

线性代数的进一步阅读

如果你在阅读本文后理所当然地爱上了线性代数,可以看看以下链接:

  • 线性代数的本质 (3Blue1Brown) — 让矩阵和向量直观易懂的精美可视化
  • MIT OpenCourseWare 18.06 — Gilbert Strang 的经典讲座系列
  • RareSkills ZK Book — 专门针对 ZK 的线性代数先决条件
  • RareSkills Uniswap v2 book
  • RareSkills Uniswap v3 book

非线性:对现实世界复杂性建模

我们刚刚了解了线性代数及其用途。但现实世界是混乱的,有许多事物不能用线性关系建模。

例如,如果神经网络仅由线性层组成,它们将坍缩成一个巨大的矩阵乘法。从数学上讲,顺序应用矩阵 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 分开。现在,在这个折叠后的三维空间中,你可以在它们之间切出一个平面。

示例:神经网络如何解决 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,所有输出都能正确分类。

几何图示

  • 原始输入空间

    x₂
    ▲
    1 │ ●(0,1)     ○(1,1)
      │   class 1    class 0
    0 │ ○(0,0)     ●(1,0)
      └──────────────► x₁
        0          1
    

    没有直线能分隔 ● 和 ○

  • 变换后的空间 (h₁, h₂)

    h₂
    ▲
    1 │
      │
    0.5├───●(0,1)
      │
    0 ○───────────●(1,0)──► h₁
        (0,0)     0.5
              (1,1)
    

    现在线性可分!一条 y=0.25 的线就能工作

隐藏层“折叠”了输入空间。点 (0,0) 和 (1,1) 坍缩到原点,而 (0,1) 和 (1,0) 被推到不同的轴上。现在一个简单的线性边界就能分隔这些类别。

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

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

这个领域源于解多项式方程的尝试。在 19 世纪 30 年代,埃瓦里斯特·伽罗瓦——一位在 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)

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

def extended_gcd(a, b):
    if b == 0:
        return a, 1, 0
    gcd, x1, y1 = extended_gcd(b, a % b)
    return gcd, y1, x1 - (a // b) * y1

def mod_inverse(a, n):
    gcd, x, _ = extended_gcd(a, n)
    if gcd != 1:
        raise ValueError("No inverse exists")
    return x % n

同态:保结构的映射

一个群同态是群 G 和 H 之间一个保持运算的函数 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 协议的基础。

Groth16PLONK 证明将程序约束嵌入到群元素中,使得验证方程简化为检查同态是否保持了结构。

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

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: d = (s₁·k - z₁)/r 索尼的私钥可以通过简单的代数计算出来 :)

抽象代数的进一步阅读

  • MIT OpenCourseWare 18.703 — 侧重应用的群、环、域导论
  • Quadratic Arithmetic Programs: from Zero to Hero — Vitalik Buterin 对 ZK-SNARKs 的讲解
  • Abstract Algebra: Theory and Applications — 涵盖两个学期的免费教科书

数论:数学的女王

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

几个世纪以来,它一直是纯数学的典范:美丽但无实际应用的谜题。然后 20 世纪 70 年代到来,公钥密码学让质数投入了实际应用。

单向门:因式分解

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

示例:玩具 RSA

让我们用小质数构建 RSA 来理解其数学原理:

步骤 1:选择质数 p = 61, q = 53 n = p × q = 3233

步骤 2:计算欧拉函数 φ(n) = (p-1)(q-1) = 60 × 52 = 3120 (欧拉函数计算小于 n 且与 n 互质的数的个数)

步骤 3:选择公钥指数 e = 17(必须与 φ(n) 互质,即它们没有公因子)

步骤 4:计算私钥指数 d = 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) 对于某个 k: 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^6 ≡ 1 (mod 7) 阶乘从两边消去,得到费马定理。

还记得 RSA 解密是如何工作的吗?我们需要 m^(ed) ≡ m (mod n)。欧拉定理(费马定理对合数的推广)正是使之成为可能的原理。质数的结构是公钥密码学的数学基石。

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

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

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

施瓦茨-齐普尔引理: 设 P(x) 是域 𝔽 上的一个 d 次非零多项式。如果你从 𝔽 中INCOMPLETE CSD0tFqvECLokhw9aBeRqvREddHT+Av4FcCPxYr38QBLcmIkwxUn4jBeruzi1lOcdU9DfXEwy+EOy99pXx5VKoGML4Md5HbpWDdKGVCLQeJ1dwGyeCWG1TmeUSO6uznE