基于椭圆曲线的ECC非对称密码系统
一、概述
ECC(椭圆曲线密码学,Elliptic Curve Cryptography)是一种基于有限域上椭圆曲线的公开密钥加密算法。
与 RSA 加密算法相比,ECC的主要优势是使用较小的密钥长度并提供相当等级的安全性,另一个优势是可以定义群之间的双线性映射,基于 Weil 对或是 Tate 对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。
椭圆曲线在密码学中的使用是在1985年由 Neal Koblitz 和 Victor Miller 分别独立提出的。椭圆曲线密码学的算法是在2004年至2005年开始广泛应用。
目前主要有两种有限域在 ECC 中被广泛应用,分别基于素数域和伽罗瓦域。
二、基于素数域
方程式:$y^2=x^3+ax+b \mod p$
参数格式:$(p,a,b,G,n,h)$,其中$G$
- 以素数为模的整数域: $\mathbb {F} _{p}$在通用处理器上计算很快
- 以 2 的幂为模的整数域: $\mathbb {F} _{2^{m}}$当使用专用硬件时,计算速度很快
三、基于伽罗瓦域
- 基于伽罗瓦域的形式:$y^2+xy=x^3+ax^2+1$
曲线的参数格式:$(m,f(x),a,b,G,n,h)$,对应不同的$GF(2^m)$域
蒙哥马利曲线(Montgomery curve)是另一种形式的椭圆曲线,方程如下:
$by^2 = x^3 + ax^2 + x$

RFC 7748 收录了两种蒙哥马利曲线,分别是 Curve25519 和 Curve448。
Curve25519 是蒙哥马利曲线形式的一个实例, 声称是最快的 Diffie-Hellman 密钥交换函数,由 Daniel J. Bernstein 在2005年设计,提供128比特位安全性,并未被任何已知专利所涵盖。
Curve448 是 Mike Hamburg 在 2015 年设计的新曲线, 旨在提供 224 比特的安全性。
RFC 7748 同时给出了基于两条椭圆曲线的仅依赖 x 坐标的 ECDH 密钥交换协议 X25519 和 X448.
$(q,FR,a,b\{,SEED\},G,n,h)$,其中:
- $q$:有限域的阶(元素的个数)。对于素数域,$q=p$;对于伽罗瓦域,$q=2^m$
- $FR$:域表示。对于素数域,$FR$为空;对于伽罗瓦域,$q=2^m$
- $a,b$:椭圆曲线方程的参数。
- $SEED$:可选,用于生成和验证a、b以及可能的G(取决于生成方法)的规范过程。
- $G$:生成点。是一个由 a 和 b 确定的点$(G_x,G_y)$。
- $n$:生成点$G$的阶。
- $h$:由$G$生成的循环子群的协因子。
其中,q为域的阶,FR为域表示,S为种子,a,b为椭圆曲线参数,P为基点,n为点P的阶,h为余因子;
自 。[17] 从 2014 年开始,OpenSSH[18] 默认为基于 Curve25519 的 ECDH,而 GnuPG 增加了对 Ed25519 密钥的支持,用于签名和加密。[19]2020年,曲线的使用最终在密钥交换和签名方面都实现了标准化。[20][21]
2017 年,NIST 宣布将 Curve25519 和 Curve448 添加到特别出版物 800-186 中,该出版物指定了供美国联邦政府使用的已批准的椭圆曲线。[22] 两者都在RFC 7748中进行了描述。[23] 2019 年“FIPS 186-5”草案指出,打算允许使用 Ed25519[24] 进行数字签名。2023 年特别出版物 800-186 的更新允许使用 Curve25519。[25]
- 椭圆方程:$y^2 = x^3 + 486662x^2 + x$,即:a=486662,b=1
- 有限域:$GF(2^{255}-19)$,也是名字中
25519的由来 - 基点 $x = 9$,阶数 $n = 2^{252} + 27742317777372353535851937790883648493$
Curve25519 的构造使其避免了许多潜在的实现缺陷。根据设计,它不受定时攻击的影响,并且它接受任何32字节的字符串作为有效的公钥,并且不需要验证。
本文重点关注 Curve25519 及相应的密钥交换协议 X25519. Curve25519 是定义在有限域
Fp, p = 2255 − 19 的蒙哥马利形式椭圆曲线 y
2 = x
3 + 486662x
2 + x, 其中曲线上点的个数
#E(Fp) = 8 · n1, 也即余因子为 8, 并且有
n1 = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed,
一次性迪菲-赫尔曼密钥交换协议
一次性迪菲-赫尔曼密钥交换协议(One-Pass Diffie-Hellman Key Agreement),定义在 NISP SP 800-56A 的 6.2.2.2 章节,名称为One-Pass Diffie-Hellman, C(1e,1s,ECC CDH) Scheme,含义是:
- 密钥交换通过一次性的DH(Diffie-Hellman)协议,C 是指协因子(Cofactor)
- 使用了1个临时密钥,1个静态密钥
- 加密算法是椭圆曲线加密算法 ECC(Elliptic Curve Cryptography)
DH 协议最初采用 FFC 算法(Finite Field Cryptography,有限域加密),也称为幂等算法,安全强度较低
Curve 25519 使用蒙哥马利曲线:$y^2 = x^3 + 486662x^2 + x$
该曲线定义在由素数定义的素数场的二次扩展上,使用基点x = 9
这个基点的阶数是蒙哥马利曲线(Montgomery curve)是另一种形式的椭圆曲线,方程如下:

素数域$p = 2^{255}-19$,也是名字中25519的由来。
- $p = 2^{255} − 19$
- 域空间大小:q =
- FR =
- 参数:a = 486662
- 参数:b = 1
- 初始值(可选):SEED = N/A
- 生成元:G =
- 辅因子:h = 8
对于Protected Unless Open的文件保护类型,分析其实现方案是:
1. 初始化存储介质的环节
- 安全隔区随机生成一对非对称密钥(静态)
- 静态私钥就是 Class B Key,包裹后的密文持久化存储在系统密钥包
2.(某个)文件创建的环节
- 安全隔区随机生成一个文件独有密钥 per-file key
- 安全隔区随机生成一对非对称密钥(临时),封装密钥 =(静态私钥,临时公钥),生成 per-file key!
- 安全隔区将(临时公钥,per-file key!)发给操作系统
- 操作系统创建 cnode 元数据,持久化存储 per-file key!,并增加了一个字段存储临时公钥
- 安全隔区将 per-file key 发给 AES 引擎,实现文件内容的加密存储
临时私钥从为被使用?好像没有哪个文档提及其用途
3.(重新)打开文件的环节
- 操作系统作从文件元数据中获得(临时公钥,per-file key!),并发送给安全隔区
- 安全隔区以 Class B key 作为静态私钥,解封密钥 =(静态私钥,临时公钥),将 per-file key!解封为 per-file key
- 安全隔区将 per-file key 发给 AES 引擎,实现文件内容的加密读写
- 一旦该文件被关闭,安全隔区就在内存中丢弃 per-file key,该文件将无法读写
4. 用户重置passcode
理论上应有如下操作:
- 根据新的 passcode 重新执行 KDF 函数,生成新的 Class B key
- 找到所有数据保护类型为 Class B 的文件元数据,执行如下循环操作:
- 解封密钥 =(旧的静态私钥,临时公钥),将 per-file key!恢复为 per-file key
- 封装密钥 =(新的静态私钥,临时公钥),将 per-file key 封装为新的 per-file key!
- 操作系统接受新的 per-file key!,并持久化存储在元数据 cnode 的 cprotect 字段
- 循环结束后,将新的 Class B key 持久化存储在系统钥匙包
静态私钥保存在 Class B key,但没有文档提及其用途和持久化存储位置,似乎被丢弃了
临时私钥的情况也是类似,而且似乎丢弃了也不影响算法的实现。。。
