惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
C
Check Point Blog
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Forbes - Security
Forbes - Security
IT之家
IT之家
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
雷峰网
雷峰网
N
News | PayPal Newsroom
The Last Watchdog
The Last Watchdog
V
Visual Studio Blog
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Webroot Blog
Webroot Blog
TaoSecurity Blog
TaoSecurity Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Schneier on Security
Schneier on Security
P
Privacy International News Feed
G
Google Developers Blog
博客园 - 聂微东
博客园 - 叶小钗
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Simon Willison's Weblog
Simon Willison's Weblog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
H
Hacker News: Front Page
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
T
The Exploit Database - CXSecurity.com
S
Security @ Cisco Blogs
博客园_首页
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
T
Threatpost

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】容灾架构:多活与灾备设计 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 【Linux 网络子系统深度拆解】内核网络调优方法论:从基准测试到生产验证 排序基准测试:用数据说话
【密码学百科】抽象代数:群、环、域的密码学视角
2026-04-05 · via 土法炼钢兴趣小组的算法知识备份
代数结构层次:从集合到域的包含关系

一、为什么密码学家需要抽象代数

初学密码学时,读者往往会分别接触 Diffie-Hellman 密钥交换、RSA 加密、椭圆曲线密码体制(ECC)以及基于配对(pairing)的方案。这些协议表面上各自独立:Diffie-Hellman 工作在大素数的乘法群上,RSA 依赖大整数分解的困难性,ECC 利用椭圆曲线上的点加法,而配对则将两个不同的群映射到第三个群中。然而,如果仅仅把它们当作孤立的算法来记忆,不但学习效率低下,更难以理解为什么安全参数需要那样选取、为什么某些攻击能够跨协议迁移。

抽象代数(abstract algebra)提供的正是一套将这些看似不同的对象统一起来的语言。在这一框架中,Diffie-Hellman 的安全性归结为”在某个循环群中求解离散对数问题(discrete logarithm problem, DLP)“,无论底层的群是整数模素数的乘法群、椭圆曲线群,还是更奇异的代数簇上的群——分析方法可以共享,安全归约可以统一书写。RSA 的正确性证明需要欧拉定理,而欧拉定理本身是拉格朗日定理(Lagrange’s theorem)在有限群上的直接推论。有限域(finite field)的结构定理决定了 AES 中 S 盒的代数设计以及纠错码在信道编码中的表现。基于格(lattice)的后量子密码方案则大量使用多项式环(polynomial ring)上的运算。

因此,掌握群(group)、环(ring)、域(field)这三层代数结构,对于任何希望深入理解密码学——而非仅仅调用库函数——的工程师与研究者而言,都是不可绕开的基础。本文将以密码学应用为线索,系统地引入这些核心概念,力求在严谨性与直觉之间取得平衡。

笔者认为,代数结构不仅仅是密码学的「工具箱」,它更像是密码学的「隐藏架构」——一旦你看到了这层架构,就再也无法忽视它。每一个密码协议的背后,都有一个代数结构在默默支撑:Diffie-Hellman 的交换律来自阿贝尔群,RSA 的正确性来自欧拉定理(群论的推论),AES 的代数免疫性来自有限域的结构。学习抽象代数不是为了「看起来更数学」,而是为了看穿密码方案的本质。

二、群的定义与基本性质

先看一张图,把这一节的关键关系串起来。

graph TD
    A[群] --> B[环]
    B --> C[域]
    C --> D[向量空间]
    D --> E[密码学结构]

在给出严格定义之前,先建立一个直觉。群就是一个「可逆运算系统」——你有一堆对象,一种操作方式,操作的结果还在这堆对象中,你可以任意组合操作的顺序而不影响结果,有一个「什么都不做」的操作,而且每个操作都能被撤销。整数加法就是一个群:加减不出整数范围,先加 3 再加 5 等于加 8 跟顺序无关,加 0 什么都不变,加 3 可以用减 3 来撤销。

一个群(group)是一个集合 G 连同一个二元运算 · 组成的代数系统 (G, ·),满足以下四条公理:

第一,封闭性(closure):对任意 a, b ∈ G,运算结果 a · b 仍然属于 G。这一条保证了我们永远不会”算出”集合之外的东西。在密码学中,这意味着对消息进行加密或签名运算后,结果仍在同一个数学空间中,不需要额外的边界处理。

第二,结合律(associativity):对任意 a, b, c ∈ G,有 (a · b) · c = a · (b · c)。结合律使得我们可以不加括号地书写多次运算的结果,这对于”重复平方法(square-and-multiply)“等高效幂运算算法的正确性至关重要。

第三,单位元(identity element):存在元素 e ∈ G,使得对任意 a ∈ G 有 e · a = a · e = a。在整数加法群中,单位元是 0;在模 n 乘法群中,单位元是 1。

第四,逆元(inverse):对任意 a ∈ G,存在元素 a⁻¹ ∈ G 使得 a · a⁻¹ = a⁻¹ · a = e。逆元的存在保证了运算的”可撤销性”。在密码学中,解密运算往往对应于加密运算的逆。

如果群还满足交换律(commutativity),即对任意 a, b ∈ G 有 a · b = b · a,则称之为阿贝尔群(abelian group)或交换群。密码学中遇到的大部分群都是阿贝尔群——整数模 n 的加法群 (Z/nZ, +)、素数阶乘法群 (Z/pZ)* 、椭圆曲线群等均满足交换律。

群的阶(order)是集合 G 中元素的个数,记作 |G|。元素 a 的阶(order of an element)是使 aᵏ = e 成立的最小正整数 k。群的阶与元素的阶之间的关系是密码学参数选择的核心依据之一,后文讨论拉格朗日定理时会详细展开。

下面通过 Python 代码来展示整数模 n 加法群和乘法群的基本运算:

"""Z/nZ 上的群运算演示"""

def add_mod(a: int, b: int, n: int) -> int:
    """加法群 (Z/nZ, +) 中的运算"""
    return (a + b) % n

def mul_mod(a: int, b: int, n: int) -> int:
    """乘法群 (Z/nZ)* 中的运算"""
    return (a * b) % n

def power_mod(base: int, exp: int, n: int) -> int:
    """重复平方法计算模幂,等价于 pow(base, exp, n)"""
    result = 1
    base = base % n
    while exp > 0:
        if exp & 1:
            result = mul_mod(result, base, n)
        exp >>= 1
        base = mul_mod(base, base, n)
    return result

def inverse_mod(a: int, n: int) -> int:
    """扩展欧几里得算法求乘法逆元"""
    if a == 0:
        raise ValueError("0 没有乘法逆元")
    g, x, _ = extended_gcd(a % n, n)
    if g != 1:
        raise ValueError(f"{a} 在模 {n} 下没有逆元(gcd={g})")
    return x % n

def extended_gcd(a: int, b: int) -> tuple[int, int, int]:
    """返回 (gcd, x, y) 使得 a*x + b*y = gcd"""
    if a == 0:
        return b, 0, 1
    g, x1, y1 = extended_gcd(b % a, a)
    return g, y1 - (b // a) * x1, x1

# 验证:模 7 乘法群
p = 7
print(f"(Z/{p}Z)* 的元素:", [a for a in range(1, p)])
for a in range(1, p):
    inv = inverse_mod(a, p)
    print(f"  {a} * {inv}{mul_mod(a, inv, p)} (mod {p})")

这段代码实现了模运算下的加法、乘法、模幂以及求逆运算。扩展欧几里得算法(extended Euclidean algorithm)是密码学中最基础的工具之一,RSA 密钥生成、椭圆曲线点运算、格基约化等场景中都会频繁用到。

三、子群、陪集与拉格朗日定理

给定群 (G, ·),如果 H ⊆ G 且 H 在同一运算下也构成群,则称 H 为 G 的子群(subgroup),记作 H ≤ G。判定子群最常用的等价条件是:H 非空,且对任意 a, b ∈ H,有 a · b⁻¹ ∈ H。

子群的概念在密码学中无处不在。例如,在素数 p 的乘法群 (Z/pZ)* 中,所有二次剩余(quadratic residue)构成一个指数为 2 的子群;Schnorr 签名方案选择的就是 (Z/pZ)* 中一个素数阶 q 的子群来工作,从而在保证安全性的同时减小签名长度。

对于子群 H ≤ G 和任意元素 a ∈ G,集合 aH = {a · h : h ∈ H} 称为 H 的一个左陪集(left coset)。陪集有一个关键性质:任意两个左陪集要么完全相同,要么完全不相交。因此,群 G 可以被划分为若干互不相交的陪集,每个陪集的大小恰好等于 |H|。

由此立即得到拉格朗日定理(Lagrange’s theorem):如果 G 是有限群,H 是 G 的子群,那么 |H| 整除 |G|。商 [G : H] = |G| / |H| 称为 H 在 G 中的指数(index)。

拉格朗日定理有一系列密码学中至关重要的推论。首先,任何元素 a ∈ G 的阶必定整除 |G|。这意味着对任意 a ∈ G,有 a^|G| = e。将此结论应用于 (Z/pZ),其中 |G| = p - 1,便得到费马小定理(Fermat’s little theorem):对任意不被 p 整除的整数 a,有 a^(p-1) ≡ 1 (mod p)。进一步推广到 (Z/nZ),其中 |G| = φ(n)(欧拉函数),便得到欧拉定理(Euler’s theorem):a^φ(n) ≡ 1 (mod n)。RSA 的正确性——即 m^(ed) ≡ m (mod n)——正是欧拉定理的直接应用。

其次,拉格朗日定理告诉我们,如果一个群的阶是素数 p,那么它没有非平凡子群(除了 {e} 和自身)。这在椭圆曲线密码学中意义重大:选择一条阶为素数的椭圆曲线,可以保证曲线群中不存在低阶子群,从而避免小子群攻击(small subgroup attack)。

对于密码学的参数选择,拉格朗日定理意味着:如果我们希望离散对数问题的求解需要至少 2^128 次运算,那么工作群的阶中必须包含一个至少 256 位的素因子。否则,攻击者可以利用 Pohlig-Hellman 算法将问题分解到各个小素因子对应的子群上逐一求解,从而大幅降低计算复杂度。

四、循环群与生成元

如果群 G 中存在一个元素 g,使得 G 中的每一个元素都可以写成 g 的某个幂次 gᵏ,则称 G 为循环群(cyclic group),g 为 G 的生成元(generator),记作 G = ⟨g⟩。

循环群是密码学中最核心的代数对象。所有素数阶有限群都是循环群——这是抽象代数中的一个基本定理,也是椭圆曲线密码学能够工作的根本原因。选定一条素数阶椭圆曲线后,任意非单位元的点都是生成元,这使得参数选择变得简单。

对于 n 阶循环群 G = ⟨g⟩,其生成元的个数恰好等于欧拉函数 φ(n)。当 n 是素数时,φ(n) = n - 1,即除了单位元外的所有元素都是生成元。当 n 是合数时,只有阶恰好等于 n 的元素才是生成元。在 (Z/pZ)* 中寻找生成元(通常称为原根, primitive root)是 Diffie-Hellman 参数设置中的一个实际步骤。

离散对数问题(discrete logarithm problem, DLP)可以精确地表述为:给定循环群 G = ⟨g⟩ 及元素 h ∈ G,求整数 x 使得 gˣ = h。这个问题的困难性是 Diffie-Hellman 密钥交换、ElGamal 加密、Schnorr 签名等一大类协议安全性的基石。

循环群的一个重要性质是:n 阶循环群 G 的子群与 n 的因子一一对应——对于 n 的每一个正因子 d,G 恰好有一个 d 阶子群,且该子群也是循环群,由 g^(n/d) 生成。这一结构完全由群的阶决定,与群的具体”实现”无关。正是这种高度的结构透明性,使得密码分析者能够利用群的阶的因式分解来设计攻击(如 Pohlig-Hellman 算法),也使得密码设计者知道应当选择什么样的参数来抵御这些攻击。

有限阿贝尔群的分类定理

理解循环群之后,一个自然的问题是:如果一个有限阿贝尔群不是循环群,它的结构又是什么样的?有限阿贝尔群的基本定理(fundamental theorem of finite abelian groups)给出了完整的回答——每一个有限阿贝尔群都同构于若干循环群的直和(direct sum)。

更精确地说,这一分类有两种等价的规范形式。

第一种是初等因子分解(primary decomposition):任何有限阿贝尔群 G 都可以唯一地分解为

G ≅ Z/p₁^{a₁}Z ⊕ Z/p₂^{a₂}Z ⊕ … ⊕ Z/pₖ^{aₖ}Z

其中 p₁, p₂, …, pₖ 是素数(可以重复),a₁, a₂, …, aₖ 是正整数。也就是说,每个”零件”都是素数幂阶的循环群。

第二种是不变因子分解(invariant factor decomposition):

G ≅ Z/d₁Z ⊕ Z/d₂Z ⊕ … ⊕ Z/dₘZ

其中 d₁ | d₂ | … | dₘ(每个因子整除下一个因子)。不变因子分解的最后一个因子 dₘ 恰好等于群中元素的最大阶。

以 Z/12Z 为例。12 = 4 × 3 = 2² × 3,由于 gcd(4, 3) = 1,有

Z/12Z ≅ Z/4Z ⊕ Z/3Z

这就是初等因子分解——拆成了一个 2² 阶循环群和一个 3 阶循环群的直和。由于 4 和 3 互素,这个直和本身仍然是 12 阶循环群。但并非所有分解都保持循环性:Z/2Z ⊕ Z/2Z 是 4 阶群却不是循环群(没有 4 阶元素),它与 Z/4Z 不同构。

这一分类定理对密码学有直接而深远的影响。Pohlig-Hellman 攻击的本质正是利用了这个分解:如果群 G 的阶 |G| = p₁^{a₁} · p₂^{a₂} · … · pₖ^{aₖ},那么 G 中的离散对数问题可以分解为在每个 pᵢ^{aᵢ} 阶子群上的离散对数问题,然后通过中国剩余定理合并结果。每个子问题的难度仅取决于对应的素数幂 pᵢ^{aᵢ},而非整个群的阶。因此,一个 2048 位的群如果阶的最大素因子只有 80 位,其离散对数问题的实际难度远低于 2048 位安全级别。

这正是椭圆曲线密码学中坚持选择素数阶曲线的代数原因。当群的阶 |G| = p 是素数时,它没有非平凡的直和分解——唯一的分解就是 G ≅ Z/pZ 本身。Pohlig-Hellman 攻击在这种情况下无法带来任何计算优势,攻击者必须在整个素数阶群上直面离散对数问题。NIST 标准曲线 P-256 的阶就是一个 256 位的素数,保证了分类定理无法被攻击者利用。

更一般地,代数几何的结论表明,定义在有限域 F_q 上的椭圆曲线群 E(F_q) 的结构至多是两个循环群的直和:E(F_q) ≅ Z/n₁Z ⊕ Z/n₂Z,其中 n₁ | n₂。密码学实践中选择的曲线几乎总是令 n₁ = 1,使群退化为单个循环群 Z/n₂Z;而当 n₁ > 1 时,群中存在非平凡的直和分解,DLP 的难度取决于分解后各分量的最大素因子,而非群的总阶。椭圆曲线上的群结构与点运算的完整讨论见第 17、35 篇。

下面用 Python 代码验证 Z₁₂ 的直和分解,并展示分解如何影响群中元素的阶:

"""有限阿贝尔群直和分解验证"""
from math import lcm

def element_order(a: int, n: int) -> int:
    """计算元素 a 在 Z/nZ 加法群中的阶"""
    if a % n == 0:
        return 1
    k, current = 1, a % n
    while current != 0:
        current = (current + a) % n
        k += 1
    return k

# Z/12Z 的阶分布
orders_12 = [element_order(a, 12) for a in range(12)]
print("Z/12Z 元素阶:", orders_12)
print("最大阶:", max(orders_12), "(= 12,群是循环群)")

# Z/4Z ⊕ Z/3Z 的阶分布:(a,b) 的阶 = lcm(ord_4(a), ord_3(b))
orders_sum = [lcm(element_order(a, 4), element_order(b, 3))
              for a in range(4) for b in range(3)]
print("Z/4Z ⊕ Z/3Z 元素阶:", orders_sum)
print("阶分布相同:", sorted(orders_12) == sorted(orders_sum))

# 对比:Z/2Z ⊕ Z/2Z 最大阶为 2,与 Z/4Z 不同构
orders_2x2 = [lcm(element_order(a, 2), element_order(b, 2))
              for a in range(2) for b in range(2)]
print("Z/2Z ⊕ Z/2Z 最大阶:", max(orders_2x2), "≠ 4,故 Z/2Z⊕Z/2Z ≇ Z/4Z")

五、群同态与商群

在理解同态之前,先想象两个不同的计算系统——比如整数加法和时钟上的加法。它们「形状不同」,但有某种内在的相似性:在整数上做完加法再投影到时钟上,和先投影再在时钟上做加法,结果是一样的。这种「先算后映射=先映射后算」的性质,就是同态的本质。

群同态(group homomorphism)是保持群运算结构的映射。具体地说,从群 (G, ·) 到群 (H, ) 的映射 φ: G → H 称为同态,如果对任意 a, b ∈ G,有 φ(a · b) = φ(a) φ(b)。

同态的核心概念包括:核(kernel),即 ker(φ) = {a ∈ G : φ(a) = eH},它总是 G 的正规子群(normal subgroup);像(image),即 im(φ) = {φ(a) : a ∈ G},它是 H 的子群。

正规子群 N ◁ G 满足对任意 g ∈ G 有 gNg⁻¹ = N。对于阿贝尔群,每个子群都是正规子群。正规子群的重要性在于:它允许我们构造商群(quotient group) G/N,其元素是 N 的陪集,运算定义为 (aN)(bN) = (ab)N。商群的构造在密码学中对应着”将大问题投影到小空间”的思想。

用一个具体例子来展示商群的构造。考虑整数加法群 Z 及其子群 3Z = {…, -6, -3, 0, 3, 6, …}(所有 3 的倍数)。3Z 是 Z 的正规子群(因为 Z 是阿贝尔群)。商群 Z/3Z 由三个陪集组成:

  • 0 + 3Z = {…, -6, -3, 0, 3, 6, …}(所有被 3 整除的整数)
  • 1 + 3Z = {…, -5, -2, 1, 4, 7, …}(所有除以 3 余 1 的整数)
  • 2 + 3Z = {…, -4, -1, 2, 5, 8, …}(所有除以 3 余 2 的整数)

这三个陪集在加法下构成一个群。例如,(1 + 3Z) + (2 + 3Z) = (1 + 2) + 3Z = 3 + 3Z = 0 + 3Z,因为 3 ∈ 3Z。这正是「时钟算术 mod 3」——加到 3 就回绕到 0。Z/3Z 就是我们熟悉的模 3 运算,而商群的构造揭示了模运算「回绕」的代数本质。

一个经常被忽视的观点是,商群的概念为「模运算为什么会回绕(wrap around)」提供了最深层的解释。当我们写 7 mod 3 = 1 时,我们其实是在说:7 和 1 属于同一个陪集 1 + 3Z。模运算不是简单的「取余数」——它是将无穷的整数世界投影到一个有限的商群上。理解了这一点,你就理解了为什么密码学中的几乎所有运算都在「模某个数」的空间里进行:因为我们需要有限的、可计算的代数结构,而商群恰恰是从无限结构中「雕刻」出有限结构的数学工具。

第一同构定理(first isomorphism theorem)将上述概念联系起来:对于群同态 φ: G → H,有 G/ker(φ) ≅ im(φ)。这里 ≅ 表示同构(isomorphism),即存在一个双射同态。第一同构定理是抽象代数中最重要的结构性工具之一。

下面用一个具体的例子来贯穿同态、核和第一同构定理。定义映射 φ: (Z, +) → (Z/6Z, +),其中 φ(n) = n mod 6。验证 φ 是同态:φ(3 + 4) = φ(7) = 7 mod 6 = 1,而 φ(3) + φ(4) = 3 + 4 = 7 ≡ 1 (mod 6),两者相等。φ 的核是所有映射到 0 的整数,即 ker(φ) = 6Z = {…, -12, -6, 0, 6, 12, …}——恰好是 6 的所有倍数。φ 的像是整个 Z/6Z(因为对任意 r ∈ {0, 1, …, 5},φ(r) = r)。第一同构定理告诉我们 Z/ker(φ) = Z/6Z ≅ im(φ) = Z/6Z,即商群 Z/6Z 与像同构——在这个例子中它们恰好就是同一个群。

在密码学中,同态的概念直接对应于同态加密(homomorphic encryption)的核心思想。如果加密函数 E 满足 E(m₁) ⊕ E(m₂) = E(m₁ + m₂),其中 ⊕ 是密文空间上的运算,+ 是明文空间上的运算,那么 E 就是从明文群到密文群的一个同态。Paillier 加密系统和 ElGamal 加密系统分别满足加法同态和乘法同态性质。全同态加密(fully homomorphic encryption, FHE)则进一步要求同时保持加法和乘法两种运算的同态性,这已经超越了群同态的范畴,需要环同态的框架。

从更深层的视角来看,加密本身就是一个从明文空间到密文空间的同态映射。如果 E(m₁ + m₂) = E(m₁) ⊕ E(m₂),那么加密函数 E 保持了加法结构——这不仅仅是同态加密的定义,它揭示了一个根本事实:密码学中的「结构保持」与「结构隐藏」之间存在深刻的张力。完全隐藏结构的加密(如 AES)不支持同态运算;保持结构的加密(如 Paillier)允许密文上的计算但可能泄露部分代数关系。从工程实践来看,理解这个张力,就是理解现代密码学设计空间的一把钥匙。

商群的概念在椭圆曲线同源(isogeny)密码学中也有重要应用。给定椭圆曲线 E 及其子群 K,同源映射 φ: E → E/K 恰好将 E 映射到以 K 为核的商群对应的另一条椭圆曲线上。SIKE/SIDH 等后量子候选方案的安全性就建立在计算同源映射的困难性之上。

六、环与理想

环(ring)在群的基础上引入了第二种运算。一个环 (R, +, ·) 由一个集合 R 和两种二元运算——加法 + 与乘法 · ——组成,满足:(R, +) 构成阿贝尔群;乘法满足结合律;乘法对加法满足左右分配律(distributive law)。

如果乘法满足交换律,则称为交换环(commutative ring)。如果存在乘法单位元 1,则称为含幺环(ring with unity)。如果一个交换含幺环中没有零因子(zero divisor)——即 a · b = 0 必然意味着 a = 0 或 b = 0——则称为整环(integral domain)。

最基本的环是整数环 (Z, +, ·)。对密码学更重要的是模 n 整数环 Z/nZ:加法和乘法都取模 n。当 n 是素数 p 时,Z/pZ 中每个非零元素都有乘法逆元,因此 Z/pZ 实际上构成一个域。当 n 是合数时(例如 RSA 中 n = pq),Z/nZ 中存在零因子:p · q ≡ 0 (mod n),而 p 和 q 都不为零。零因子的存在正是 RSA 安全性的代数本质——如果攻击者能找到 n 的零因子,就相当于分解了 n。

环中的理想(ideal)类似于群中的正规子群。一个子集 I ⊆ R 称为 R 的理想,如果 I 是 (R, +) 的子群,且对任意 r ∈ R, a ∈ I 有 r · a ∈ I 且 a · r ∈ I。由单个元素 a 生成的理想 (a) = {r · a : r ∈ R} 称为主理想(principal ideal)。Z 中的每个理想都是主理想——由某个整数 n 生成的理想 (n) = nZ 正是 n 的所有倍数组成的集合。

商环(quotient ring) R/I 的构造完全类比于商群:其元素是 I 的陪集 a + I,加法和乘法分别定义为 (a + I) + (b + I) = (a + b) + I 和 (a + I)(b + I) = (ab) + I。模运算 Z/nZ 实际上就是整数环 Z 关于理想 nZ 的商环。

多项式环(polynomial ring)在密码学中的地位极为重要。给定一个环 R,R 上的多项式环 R[x] 由所有以 R 中元素为系数的多项式组成,加法和乘法按照通常的多项式运算定义。后量子密码学中最有前途的方向之一——基于格的密码学(lattice-based cryptography)——大量使用商环 Z[x]/(xⁿ + 1) 上的运算。NIST 已经标准化的 ML-KEM(原 CRYSTALS-Kyber)和 ML-DSA(原 CRYSTALS-Dilithium)方案的核心运算都在这种多项式商环上进行(详见第 37 篇)。选择 xⁿ + 1(其中 n 是 2 的幂)作为模多项式的原因在于:它是分圆多项式(cyclotomic polynomial),使得商环具有良好的代数性质,同时允许使用数论变换(NTT)进行高效的多项式乘法。

理想格:从理想到格密码学

上文提到格密码学大量使用多项式商环 Z_q[x]/(xⁿ + 1)。读者可能会好奇:环中的理想和几何上的「格」之间到底有什么关系?理想格(ideal lattice)正是连接这两个世界的桥梁。

先回顾格的直觉。一个格(lattice)可以看作高维空间中按规律排列的点阵——就像二维平面上的方格纸网格,但维度可以很高、基向量可以倾斜。数学上,格是 R^n 中由一组线性无关的基向量 b₁, b₂, …, bₙ 的所有整系数线性组合构成的离散点集。格上的困难问题——例如最短向量问题(SVP)和最近向量问题(CVP)——是格密码学安全性的基石。

现在来看关键联系。考虑多项式环 R = Z[x]/(f(x)),其中 f(x) 是一个 n 次多项式。这个环中的每个元素都是一个次数小于 n 的多项式 a₀ + a₁x + a₂x² + … + aₙ₋₁xⁿ⁻¹,可以用其系数向量 (a₀, a₁, …, aₙ₋₁) ∈ Z^n 来表示。这样,环 R 中的一个子集如果满足加法封闭性,就自然对应于 Z^n 中的一个格。而环 R 中的理想不仅加法封闭,还对环中任意元素的乘法封闭——这种额外的代数结构使得对应的格具有特殊的几何性质。

当 f(x) = xⁿ + 1(n 为 2 的幂)时,理想格具有一种旋转对称性:如果系数向量 (a₀, a₁, …, aₙ₋₁) 在格中,那么对应于「乘以 x」的向量 (-aₙ₋₁, a₀, a₁, …, aₙ₋₂) 也在格中(因为 x · a(x) mod (xⁿ + 1) 会导致最高次系数取反后循环移位)。这种结构上的规律性带来了巨大的实用价值:一次多项式乘法可以通过数论变换(NTT)在 O(n log n) 时间内完成,而一般格上的矩阵-向量乘法则需要 O(n²) 时间。

用一个最小的例子来具体感受。取 n = 4, q = 17,工作在商环 R_q = Z₁₇[x]/(x⁴ + 1) 上。多项式 a(x) = 1 + 2x + 3x² 对应系数向量 (1, 2, 3, 0)。将 a(x) 乘以 x 得到 x + 2x² + 3x³,再模 x⁴ + 1 不产生约减(因为最高次仍为 3),系数向量为 (0, 1, 2, 3)——这就是一次「反循环移位」。继续乘以 x 得到 x² + 2x³ + 3x⁴ ≡ -3 + x² + 2x³ (mod x⁴ + 1),系数向量为 (-3, 0, 1, 2) ≡ (14, 0, 1, 2) (mod 17)。这些向量共同张成的格具有反循环结构(negacyclic structure)——每行是上一行的反循环移位——这正是理想格区别于一般格的几何特征。

"""理想格:Z_q[x]/(x^n+1) 上的多项式运算与旋转结构"""

def poly_mul_mod(a: list[int], b: list[int], n: int, q: int) -> list[int]:
    """在 Z_q[x]/(x^n+1) 中计算多项式乘法(教学用朴素实现)"""
    c = [0] * (2 * n - 1)
    for i in range(len(a)):
        for j in range(len(b)):
            c[i + j] = (c[i + j] + a[i] * b[j]) % q
    # 模 x^n + 1 约减:x^n ≡ -1,所以 x^(n+k) 的系数折叠到 x^k 并取反
    result = [0] * n
    for i in range(len(c)):
        if i < n:
            result[i] = (result[i] + c[i]) % q
        else:
            result[i - n] = (result[i - n] - c[i]) % q
    return result

n, q = 4, 17
a = [1, 2, 3, 0]           # a(x) = 1 + 2x + 3x²
x = [0, 1, 0, 0]           # x 本身

# 反复乘以 x,观察反循环移位
row = list(a)
print("理想格的旋转结构(反循环矩阵):")
for _ in range(n):
    print(f"  {row}")
    row = poly_mul_mod(row, x, n, q)

这个反循环矩阵的行向量构成一个 4 维格的基。在实际的 ML-KEM 中,n = 256, q = 3329,环元素的乘法通过 NTT 加速到 O(n log n),而密钥和密文都是这个环上的向量。格上的代数结构与 LWE 问题的完整讨论见第 37 篇。

不过,理想格的高度对称性也引发了安全性方面的顾虑——额外的代数结构是否会给攻击者可乘之机?这正是密码学界从理想格(ideal lattice)演进到模格(module lattice)的动机。模格可以看作理想格的推广:不再使用单个多项式环元素,而是使用多个多项式环元素组成的向量(即环上的自由模)。NIST 已标准化的 ML-KEM 和 ML-DSA 正是基于模格上的 Module-LWE 和 Module-SIS 问题。模格在保留 NTT 加速优势的同时,通过增加模的秩(rank)来提供更灵活的安全性-效率权衡,被认为是目前理论基础与工程实用性之间最佳的平衡点。

从本节「环与理想」的视角来看,格密码学的核心思想可以这样总结:将环论中的理想结构映射到几何上的格结构,利用格上困难问题的计算不可行性来构建密码方案,同时利用理想(以及模)的代数结构来实现高效运算。这是抽象代数在后量子密码学中最直接的应用。

七、域与有限域概览

域(field)是一个交换含幺环,其中每个非零元素都有乘法逆元。等价地说,域是一个集合 F,配备加法和乘法两种运算,使得 (F, +) 构成阿贝尔群(加法群),(F  {0}, ·) 构成阿贝尔群(乘法群),且乘法对加法满足分配律。

有理数集 Q、实数集 R、复数集 C 都是域,但它们是无限域。密码学中更关心的是有限域(finite field),也称伽罗瓦域(Galois field),通常记作 GF(q) 或 F_q。有限域的存在性与唯一性定理是代数学中最优美的结果之一:对于每一个素数幂 q = pⁿ,恰好存在一个(在同构意义下)q 阶有限域;反过来,有限域的阶必然是某个素数的幂次。

当 n = 1 时,GF(p) 就是我们熟悉的 Z/pZ,即模素数 p 的整数运算。这是最简单的有限域,也是 RSA 和经典 Diffie-Hellman 所依赖的基本代数结构。

当 n > 1 时,GF(pⁿ) 的构造需要用到多项式环和商环的理论。具体做法是:在 GF(p)[x] 中选择一个 n 次不可约多项式(irreducible polynomial) f(x),然后构造商环 GF(p)[x]/(f(x))。这个商环恰好是一个 pⁿ 阶有限域。不可约多项式在有限域构造中的作用类似于素数在整数中的作用——正如 Z/nZ 当且仅当 n 是素数时才构成域,GF(p)[x]/(f(x)) 当且仅当 f(x) 不可约时才构成域。

最经典的密码学应用是 GF(2⁸) = GF(256),它是 AES(高级加密标准)中 S 盒设计的代数基础。AES 选择的不可约多项式为 f(x) = x⁸ + x⁴ + x³ + x + 1。在这个域中,每个字节(8 位)对应一个多项式,字节之间的加法对应多项式系数的模 2 加法(即按位异或),乘法对应多项式乘法后模 f(x)。S 盒的核心操作是在 GF(2⁸) 中求乘法逆元,这赋予了 AES 良好的抗差分分析和抗线性分析能力。

椭圆曲线密码学也大量使用有限域。定义在 GF(p) 上的椭圆曲线(如 secp256k1、P-256)和定义在 GF(2ⁿ) 上的椭圆曲线(如 NIST B-283)分别适用于不同的硬件实现场景。基于配对的密码学(pairing-based cryptography)则需要在有限域的扩域(extension field)上进行运算——例如 BN256 曲线上的 Ate 配对将椭圆曲线上的两个点映射到 GF(p¹²) 的乘法群中。

有限域的乘法群 GF(q)* 总是一个 q - 1 阶的循环群。这一事实将域论与群论联系了起来:有限域上的离散对数问题,本质上就是其乘法群(一个循环群)中的离散对数问题。有限域上运算的工程实现——包括 Montgomery 乘法、Barrett 约减、查表优化等——的完整讨论见第 33 篇。

八、中国剩余定理

中国剩余定理(Chinese Remainder Theorem, CRT)是数论与代数中最古老也最实用的定理之一。其名称源于《孙子算经》中的”物不知数”问题。

定理陈述如下:设 m₁, m₂, …, mₖ 是两两互素(pairwise coprime)的正整数,令 M = m₁ · m₂ · … · mₖ。则对于任意整数 a₁, a₂, …, aₖ,同余方程组

x ≡ a₁ (mod m₁)
x ≡ a₂ (mod m₂)
...
x ≡ aₖ (mod mₖ)

在模 M 下恰好有唯一解。

更代数化地表述:当 gcd(m, n) = 1 时,环同构 Z/mnZ ≅ Z/mZ × Z/nZ 成立。这个同构不仅保持加法结构,也保持乘法结构,是一个环同构。

证明的核心思路是构造性的。令 Mᵢ = M / mᵢ,由于 mᵢ 与 Mᵢ 互素,存在 Mᵢ 的模 mᵢ 逆元 yᵢ,即 Mᵢ · yᵢ ≡ 1 (mod mᵢ)。则解为 x = Σᵢ aᵢ · Mᵢ · yᵢ (mod M)。

CRT 在密码学中最著名的应用是 RSA-CRT 加速。标准 RSA 解密需要计算 c^d mod n,其中 n = p · q,d 和 n 都是很大的数,直接计算模幂的代价很高。利用 CRT,可以将这一计算分解为两个较小的模幂运算:

m_p = c^(d mod (p-1)) mod p
m_q = c^(d mod (q-1)) mod q

然后用 CRT 合并 m_p 和 m_q 得到 m mod n。由于模幂运算的复杂度大约与模数位长的三次方成正比,将一个 2048 位的模幂分解为两个 1024 位的模幂,速度大约提升四倍。几乎所有实际的 RSA 实现(包括 OpenSSL、BoringSSL 等)都采用了 CRT 优化。

CRT 与秘密共享(secret sharing)之间也有深刻的联系。Asmuth-Bloom 秘密共享方案直接基于 CRT 构造:选择两两互素的模数 m₁ < m₂ < … < mₙ,使得任意 t 个模数的乘积大于所有模数中最小的 n - t + 1 个的乘积。秘密 s 被编码为满足特定同余条件的数,分发给各参与方。任意 t 个参与方可以利用 CRT 恢复秘密,而少于 t 个参与方则信息论意义上无法获得任何关于秘密的信息。

以下 Python 代码演示了 CRT 的实现及其在 RSA 解密加速中的应用:

"""中国剩余定理(CRT)实现与 RSA-CRT 演示"""

from functools import reduce
from math import gcd

def extended_gcd(a: int, b: int) -> tuple[int, int, int]:
    """返回 (gcd, x, y) 使得 a*x + b*y = gcd"""
    if a == 0:
        return b, 0, 1
    g, x1, y1 = extended_gcd(b % a, a)
    return g, y1 - (b // a) * x1, x1

def crt(remainders: list[int], moduli: list[int]) -> int:
    """
    中国剩余定理:给定余数列表和模数列表,返回唯一解。
    要求模数两两互素。
    """
    assert len(remainders) == len(moduli)
    # 检查模数两两互素
    for i in range(len(moduli)):
        for j in range(i + 1, len(moduli)):
            assert gcd(moduli[i], moduli[j]) == 1, \
                f"模数 {moduli[i]}{moduli[j]} 不互素"

    M = reduce(lambda a, b: a * b, moduli)
    x = 0
    for a_i, m_i in zip(remainders, moduli):
        M_i = M // m_i
        _, y_i, _ = extended_gcd(M_i, m_i)
        x += a_i * M_i * y_i
    return x % M

# 经典示例:孙子算经的"物不知数"问题
# x ≡ 2 (mod 3), x ≡ 3 (mod 5), x ≡ 2 (mod 7)
result = crt([2, 3, 2], [3, 5, 7])
print(f"物不知数:x = {result}")
print(f"  验证:{result} mod 3 = {result % 3}, "
      f"{result} mod 5 = {result % 5}, "
      f"{result} mod 7 = {result % 7}")

# RSA-CRT 加速演示
print("\n--- RSA-CRT 解密加速 ---")
p, q = 61, 53             # 小素数用于演示
n = p * q                  # n = 3233
phi_n = (p - 1) * (q - 1)  # φ(n) = 3120
e = 17
_, d, _ = extended_gcd(e, phi_n)
d = d % phi_n              # 私钥指数

message = 2023
ciphertext = pow(message, e, n)
print(f"明文: {message}, 密文: {ciphertext}")

# 标准 RSA 解密
m_standard = pow(ciphertext, d, n)
print(f"标准解密: {m_standard}")

# RSA-CRT 解密
d_p = d % (p - 1)
d_q = d % (q - 1)
m_p = pow(ciphertext, d_p, p)
m_q = pow(ciphertext, d_q, q)
m_crt = crt([m_p, m_q], [p, q])
print(f"CRT 解密: {m_crt}")
print(f"两种方法一致: {m_standard == m_crt}")

# Garner 算法——更高效的 CRT 合并(仅两个模数时)
_, q_inv, _ = extended_gcd(q, p)
q_inv = q_inv % p
h = (q_inv * (m_p - m_q)) % p
m_garner = m_q + h * q
print(f"Garner 算法: {m_garner}")
print(f"三种方法一致: {m_standard == m_crt == m_garner}")

代码中还展示了 Garner 算法,它是 CRT 在两个模数情形下的一种更高效的实现方式,避免了计算大乘积 M,在实际 RSA 实现中更为常用。

九、从代数到密码构造

至此,我们已经建立了群、环、域三层代数结构的基本框架。现在让我们回顾这些结构如何映射到具体的密码学构造,形成一个完整的图景。

Diffie-Hellman 密钥交换与 ElGamal 加密工作在一个循环群 G = ⟨g⟩ 上。协议的安全性依赖于计算性 Diffie-Hellman 假设(CDH)或判定性 Diffie-Hellman 假设(DDH),这些假设的本质是:在循环群中,已知 g, gᵃ, gᵇ,计算或判定 gᵃᵇ 是困难的。群可以是 (Z/pZ)* 的素数阶子群,也可以是椭圆曲线群——代数框架完全一致,只是底层群的选择不同。

RSA 的正确性建立在环 Z/nZ 的结构之上(其中 n = pq),而其安全性则依赖于大整数分解问题的困难性。CRT 提供的环同构 Z/nZ ≅ Z/pZ × Z/qZ 不仅给出了 RSA 解密的加速方法,也揭示了 RSA 问题的代数结构——如果攻击者能计算这个同构(即分解 n),就能直接解密。

椭圆曲线密码学(ECC)的底层群是定义在有限域 GF(p) 或 GF(2ⁿ) 上的椭圆曲线 E 的有理点群 E(GF(q))。根据本文第四节的分类定理,这个群要么是循环群 Z/nZ,要么是 Z/n₁Z ⊕ Z/n₂Z 的直和形式(其中 n₁ | n₂)——密码学中选择的曲线几乎总是前者。这个群上的离散对数问题——给定点 P 和 Q = kP,求整数 k——目前没有已知的亚指数时间算法(对于一般椭圆曲线),这使得 ECC 在相同安全级别下所需的密钥长度远小于基于 (Z/pZ)* 的方案。256 位的椭圆曲线密钥提供的安全性大约等价于 3072 位的 RSA 密钥。椭圆曲线群上的点运算公式与协议细节见第 17、35 篇。

基于配对的密码学(pairing-based cryptography)利用双线性映射 e: G₁ × G₂ → G_T,其中 G₁, G₂ 是椭圆曲线群,G_T 是有限域扩域的乘法群的子群。配对满足双线性性:e(aP, bQ) = e(P, Q)^(ab)。这一性质使得三方一轮密钥协商(Joux 协议)、基于身份的加密(IBE)、属性基加密(ABE)等高级密码学原语成为可能。从代数的角度看,配对是从两个群到第三个群的群同态的自然推广。

基于格的密码学(lattice-based cryptography)是后量子密码学的主力方向。其核心代数结构是多项式环 Z_q[x]/(xⁿ + 1),即整系数多项式模 q 和模 xⁿ + 1 形成的商环。在这个环上,学习带误差问题(Ring-LWE)和模学习带误差问题(Module-LWE)提供了安全性的计算困难性假设。环的结构赋予了这些方案高效的实现——利用数论变换(NTT),多项式乘法可以在 O(n log n) 时间内完成——同时保持了足够的安全性。本文第六节的理想格讨论是第 37 篇格密码学专题的预备知识。

回顾全文,我们看到一条从具体到抽象、再从抽象回到具体的路径。整数模运算引导我们建立群的概念;群的结构定理(拉格朗日定理、循环群分类)为密码学参数选择提供了理论依据;群同态为同态加密提供了代数框架;环与理想将乘法引入讨论,为 RSA 和格密码学提供了工具;域的理论——特别是有限域的存在性与唯一性——为 AES、ECC 和配对密码学奠定了基础;中国剩余定理则以一种优雅的方式将环的分解转化为计算效率的提升。

对于希望进一步深入的读者,后续文章将详细讨论有限域上的具体算术实现(包括 Montgomery 乘法、Barrett 约减、Karatsuba 乘法等),以及椭圆曲线群上的高效点运算。这些都是将抽象代数的美丽理论转化为安全、高效的密码系统的关键工程环节。

代数结构与后续篇章的衔接

本文建立的群、环、域框架是后续多篇文章的共同基础。为了帮助读者规划学习路径,这里将代数结构与后续篇章的对应关系明确列出。

域 → 有限域算术(第 33 篇)。本文介绍了有限域 GF(p) 与 GF(pⁿ) 的代数定义,但没有深入讨论域上运算的工程实现。有限域算术一文将以实现为核心,详细讲解 Montgomery 乘法、Barrett 约减、Karatsuba 乘法等技术,以及 GF(2⁸) 在 AES 中的具体运用。如果你关心”代码里的模乘到底怎么写才快”,那篇文章是直接的下一步。

群与配对 → 数论深入(第 34 篇)。本文在讨论配对密码学时提到了双线性映射 e: G₁ × G₂ → G_T,但未展开背后的数论基础。数论深入一文将系统讨论二次互反律、椭圆曲线上的 Weil 配对与 Tate 配对的构造,以及配对友好曲线(pairing-friendly curve)的选取原则。从代数的视角看,配对是将群论与域论联系起来的关键工具。

群 → 椭圆曲线群结构(第 17 篇)与椭圆曲线密码学(第 35 篇)。椭圆曲线群 E(F_q) 的结构——至多是两个循环群的直和 Z/n₁Z ⊕ Z/n₂Z——在本文第四节已从分类定理的角度讨论。椭圆曲线群结构一文将从 Hasse 定理与 Schoof 算法出发讨论群阶的计算,而椭圆曲线密码学一文将从 Weierstrass 方程出发,给出点加法与倍点运算的完整公式,讨论曲线选择标准(如 rigidity、twist security),并介绍 ECDH、ECDSA、EdDSA 等协议的细节。

群 → 离散对数与密钥交换(第 36 篇)。本文在循环群一节引入了离散对数问题的定义,并在有限阿贝尔群分类定理的讨论中解释了 Pohlig-Hellman 攻击的代数原理。离散对数与密钥交换一文将深入探讨 Baby-step Giant-step、Pollard rho、数域筛法(NFS)等具体算法,并从攻击者的角度分析不同群上 DLP 难度的差异。

环与理想 → 格密码学(第 37 篇)。本文在「环与理想」一节和「理想格」一节中建立了从多项式商环到格的对应关系。格密码学一文将系统介绍 LWE、Ring-LWE、Module-LWE 问题的定义与安全性归约,ML-KEM 与 ML-DSA 的完整协议流程,以及 NTT 在多项式乘法中的实现细节。

总之,本文的代数结构就像密码学大厦的钢筋框架:群支撑着离散对数体系与椭圆曲线,环与理想支撑着格密码学,域支撑着有限域算术与 AES 设计,而配对则是连接群与域的桥梁。后续篇章将在这个框架上逐一砌砖,读者可以根据自己的兴趣选择阅读顺序。


密码学百科系列 · 第 32 篇

← 上一篇:OpenSSL/BoringSSL 架构 | 系列目录 | 下一篇:有限域算术

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。