9 - 椭圆曲线加密

椭圆曲线加密

我的博客

原书:《Understanding Cryptography: A Text book for Students and Practitioners》

椭圆曲线密码学 ECC: Elliptic Curve Cryptography 是公钥算法最新的成员。ECC 能够以更短的操作数 (160 - 256) 提供与 RSA、离散对数算法 (1024 - 3072) 相同的安全性。ECC 基于广义的离散对数问题,因此 DL 协议比如 Diffie-Hellman 密钥交换也可以使用椭圆曲线实现。在一些情况下 ECC 相较于 RSA 以及离散对数策略具有性能优势与带宽优势 (更短的签名与密钥)。不过,在 7.5.1 小节中介绍的短公钥比 ECC 操作更快速。

椭圆曲线的数学基础超出了本书的介绍范围,本章只关注于介绍 ECC 的基础内容,不会过多涉及椭圆曲线的数学原理。

9.1 如何计算椭圆曲线

先简单介绍一下椭圆曲线的数学基础,这与它们在密码学中的应用无关。ECC 基于广义离散对数问题。因此,我们首先要查找一个循环群,并在此基础上构建加密系统。当然,只有循环群是不充分的,DL 问题也必须是难以计算的,既它必须具有单向属性。

我们首先考虑实数域的多项式。

例 9.1 在实数域 \(R\) 中的多项式方程 \(x^2 + y^2 = r^2\),如果将 \((x,y)\) 绘制到直角坐标系上,我们可以得到正圆

例 9.2 我们为上面的多项式配上系数 \(a\cdot x^2 + b\cdot y^2 = c\),将其绘制到直角坐标系上,我们可以得到椭圆

9.1.1 椭圆曲线定义

从上面的例子可知,我们可以通过多项式形成各种曲线。在曲线上的参数对,认为是曲线集合中的元素,比如 \((x = r,y = 0)\) 是正圆集合中的元素,而 \((x = r/2,y = r/2)\) 就不是正圆集合的元素。椭圆曲线是一类特殊的多项式。在密码学中,我们不使用实数域中的曲线,而是有限域中的曲线。最常见的选择是质数域 \(GF(p)\),在质数域中,所有的算术都是模 \(p\) 运算。

定义 9.1.1 椭圆曲线

\(Z_p,p>3\) 中的椭圆曲线,是所有 \((x,y) \in Z_p\) 集合,满足:

\[y^2 \equiv x^3 + a\cdot x + b \ mod \ p \]

其中 \(a,b \in Z_p\),且有 \(4\cdot a^3 + 27 \cdot b^2 \neq 0 \ mod \ p\),伴随无穷的虚点组成上面的椭圆曲线

上面对椭圆曲线的定义,需要曲线是非奇异的。几何意义上,意味着,图形没有自交或顶点,在 \(-16(4a^3 + 27b^2)\) 非零时实现。

例 9.3 实数域中的椭圆曲线 \(y^2 = x^3 - 3x +3\) 可以通过下面的在线绘图工具绘制,键入 y^2 = x^3 - 3x + 3 即可

在线图形绘制

从上面的椭圆曲线图中,我们注意到,曲线关于 \(x\) 轴对称,图形与 \(x\) 轴有一个交点。

我们回到最初的目标,一个是寻找曲线具有大的循环群,并用这个群来构建离散对数问题;一个是如何使用这个群中的点进行群操作。

9.1.2 在椭圆曲线上的群操作

让我们表示群操作为加法,加法表示给到两个点,与它们的坐标,\(P = (x_1,y_1)\)\(Q = (x_2,y_2)\),我们计算第三个点 \(R\) 有:

\[P + Q = R \\ (x_1,y_1) + (x_2,y_2) = (x_3,y_3) \]

下面我们会看到,这个加法操作看起来有一些随意。幸运的是,存在几何表示来描述加法操作。对于这个几何表示,我们必须区分两个情况:两个不同的点的加法,同一个点加自身。

不同的点加法 P + Q 构造如下,绘制穿过 \(P\)\(Q\) 的直线,得到与椭圆曲线的第三个个交点,将这个交点关于 \(x\) 轴做对称,得到镜像点 \(R\)

相同的点加法 P + P 构造如下,绘制 \(P\) 点的切线,得到与椭圆曲线的第二个交点,将这个交点关于 \(x\) 轴做对称,得到镜像点 \(R\)

操作:加法

下面给出在质数域 \(GF(p)\) 下计算加法的方法:

椭圆曲线点加法

\[x_3 = s^2 - x_1 - x_2 \ mod \ p \\ y_3 = s(x_1 - x_3) - y_1 \ mod \ p \]

其中:

\[s = \begin{cases} (y_2-y_1)/(x_2 - x_1) \ mod \ p; P \neq Q (不同点加法) \\ (3x_1^2 + a)/(2y_1) \ mod \ p; P = Q (相同点加法) \end{cases} \]

零元素

我们定义一个无穷远处存在一个抽象的点,做为零元素

逆元素

\(P = (x_p,y_p)\) 的逆元素是 \(-P = (x_p,-y_p)\),在质数域 \(GF(p)\) 中,\(-y_p \equiv p -y_p \ mod p\),因此 \(-P = (x_p,p-y_p)\)

现在,我们具有所有在椭圆曲线下群需要的特性。

例 9.4 考虑 \(Z_{17}\) 中的曲线

\[E: y^2 \equiv x^3 + 2x + 2 \ mod \ 17 \]

我们计算 \(P = (5,1)\) 的自身加法:

\[\begin{align} 2P = P + P = (5,1) + (5,1) = (x_3,y_3) \\ s = (3x_1^2 + a)/2y_1 = (2\cdot 1)^{-1}(3\cdot 5^2 + 2) = 2^{-1}\cdot 9 \equiv 9 \cdot 9 \equiv 13 \ mod 17 \\ x_3 = s^2 - x_1 - x_2 = 13^2 - 5 - 5 = 159 \equiv 6 \ mod \ 17 \\ y_3 = s(x_1 - x_3) - y_1 = 13(5 - 6) - 1 = -14 \equiv 3 \ mod \ 17 \\ 2P = (5,1) + (5,1) = (6,3) \end{align} \]

下面验证 \(2P = (6,3)\) 是否是曲线上的点:

\[y^2 \equiv x^3 + 2\cdot x + 2 \ mod \ 17 \\ 3^2 \equiv 6^3 + 2\cdot 6 + 2 \ mod \ 17 \\ 9 = 230 \equiv 9 \ mod \ 17 \]

9.2 使用椭圆曲线构建一个离散对数问题

定理 9.2.1 在椭圆曲线上外加零元素若具备一个循环子群,所有椭圆曲线上的点形成一个循环群

例 9.5 我们想要找到曲线上的点:

\[E: y^2 \equiv x^3 + 2\cdot + 2 \ mod \ 17 \]

在这个曲线上的所有点形成一个循环群,阶为 19,在这样的曲线下群阶是一个质数,由定理 8.2.4 易知所有元素都是原始元素。

\(P = (5,1)\),因为群操作是加法,让我们计算 \(P,2P,...\),下面是我们得到的结果:

\[2P = (6,3),3P = (10,6),4P = (3,1),5P = (9,16),6P = (16,13),7P = (0,6),8P = (13,7),9P = (7,6) \\ 10P = (7,11),11P = (13,10),12P = (0,11),13P = (16,4),14P = (9,1),15P = (3,16),16P = (10,11) \\ 17P = (6,14),18P = (5,16),19P = (零元素) \]

因为 \(P + 18P = (零元素)\),这表示 \(P = (5,1)\) 的逆是 \(18P = (5,16)\),反之亦然,\(x\) 坐标相同,\(y\) 坐标和为 17。

为了设置 DL 加密系统,需要知道群的阶,通过哈瑟定理(Hasse's theroem) 我们可以知道椭圆曲线上点数量的约数。

定理 9.2.2 哈瑟定理

椭圆曲线 \(E\) 模数 \(p\),曲线上的点表示为 \(\#E\) 且有:

\[p + 1 - 2\sqrt{p} \leq \#E \leq p + 1 + 2\sqrt{p} \]

这在实际的应用是,如果我们需要一个具有 \(2^{160}\) 元素的椭圆曲线,我们必须使用的质数位长为 160 位。

现在,让我们设置离散对数问题。

定义 9.2.1 椭圆曲线的离散对数问题 (ECDLP)

椭圆曲线 \(E\),考虑一个原始元素 \(P\) 以及另一个元素 \(T\),离散对数问题是查找整数 \(d\)\(1 \leq d \leq \#E\),从而有:

\[P + P + ... + P = dP = T \]

在密码系统中,\(d\) 是一个整数私钥,而 \(T\) 做为公钥是椭圆曲线上的一个坐标 \(T = (x_T,y_T)\)

例 9.6 在椭圆曲线 \(y^2 \equiv x^3 + 2x + 2 \ mod \ 17\),我们要计算 \(13P = P + P + ... + P\)\(P = (5,1)\),在这个例子中,我们可以查表得到 \(13P = (16,4)\)

为了高效计算,我们可以使用重复平方乘算法,下面是算法:

点乘法

输入:椭圆曲线 \(E\) 以及椭圆曲线上的点 \(P\),一个标量 \(d = \sum_{i=0}^t d_i2^i,d_i\in0,1;d_t = 1\)

输出:\(T = dP\)

初始化: \(T = P\)

算法:

for i = t - 1 downto 0
	T = T + T mod n
	if d_i = 1
		T = T + P mod n
return(T)

对于长度为 \(t+1\) 位的随机标量,算法平均需要 \(1.5t\) 点加法。算法扫描标量 \(d\) 的最高位到最低位,每一步都会执行一次平方,只有为 1 时再加上 \(P\),看下面的例子:

例 9.7 考虑计算 \(26P\),具有下面的二进制表示:

\[26P = (11010_2)P = (d_4d_3d_2d_1d_0)P \]

算法从 \(d_4\) 开始扫描:

\[\begin{align} step 0:(d_4 = 1) P = 1_2 P \\ step 1:P + P = 2P = 10_2P,(d_3 = 1),2P + P = 3P = 10_2P + 1_2P = 11_2P \\ step 2:(d_2 = 0) 3P + 3P = 6P = 2(11_2P) = 110_2P \\ step 3:(6P + 6P) = 12P = 2(110_2P) = 1100_2P,(d_1 = 1),12P + P = 13P = 1100_2P + 1_2 P = 1101_2P \\ step 4:(d_0 = 0) (13P + 13P) = 26P = 2(1101_2P) = 11010_2P \end{align} \]

9.3 使用椭圆曲线的 Diffie-Hellman 密钥交换

椭圆曲线的 Diffie-Hellman 密钥交换 ECDH。

ECDH 域参数

  1. 选取一个质数 \(p\) 以及椭圆曲线

    \[E : y^2 \equiv x^3 + a\cdot x + b \ mod \ p \]

  2. 选择一个原始元素 \(P = (x_P,y_P)\)

实际上查找一个合适的椭圆曲线是十分困难的工作。只有曲线具有某些属性才具有安全性。

椭圆曲线的密钥交换 ECDH

B 选择 \(k_{prB} = b \in \{2,3,...,\#E-1\}\),计算 \(k_{pubB} = bP = B = (x_B,y_B)\),将 \(B\) 给到 A

A 选择 \(k_{prA} = a \in \{2,3,...,\#E-1\}\),计算 \(k_{pubA} = aP = A = (x_A,y_A)\),将 A 给到 B

A 计算 \(aB = T_{AB}\),得到联合密钥 \(T_{AB} = (x_{AB},y_{AB})\)

B 计算 \(bA = T_{AB}\),得到联合密钥 \(T_{AB} = (x_{AB},y_{AB})\)

证明:

A 计算 \(aB = a(bP)\),B 计算 \(bA = b(aP)\)

因为点加法满足结合律,上面的两个计算都得到 \(T_{AB} = abP\),联合密钥 \(T_{AB}\) 可以用来生成会话密钥,做为 AES 算法的输入。注意到,横坐标与纵坐标并不是独立的,给定 \(x_{AB}\),可以计算 \(y_{AB}\),因此只是用两个坐标中的其中一个做为会话密钥。

例 9.8 考虑 ECDH 的域参数如下,椭圆曲线 \(y^2 \equiv x^3 + 2x + 2 \ mod \ 17\),形成一个循环群,阶为 \(\#E = 19\),基点为 \(P = (5,1)\),协议如下:

B 选择 \(k_{prB} = 10\),计算 \(k_{pubB} = 10P = (7,11)\),并将 \(B\) 发给 A

A 选择 \(k{prA} = 3\),计算 \(k_{pubA} = 3P = (10,6)\),并将 A 发给 B

A 计算 \(T_{AB} = aB = 3(7,11) = (13,10)\)

B 计算 \(T_{AB} = bA = 10(10,6) = (13,10)\)

实际应用中,通常对横坐标 \(x\) 做哈希运算,生成对称密钥。比如 160 位的 ECC 策略,使用 SHA-1 算法对其进行哈希得到的 160 位的输出,只使用其中的 128 位用作 AES 密钥。

9.4 安全性

我们选择椭圆曲线的原因是,椭圆曲线中的 ECDLP 问题具有良好的单向特性。如果攻击者想要攻击椭圆曲线的密钥交换 ECDH,他掌握的信息是 \(E,p,P,A,B\),他想要计算联合密钥 \(T_{AB} = a\cdot b \cdot P\),这就是椭圆曲线的 Diffie-Hellman 问题 ECDHP。这需要计算:

\[a = log_pA \\ \]

\[b = log_pB \]

如果选择何理的椭圆曲线,已知唯一有效的攻击手段就是大小步算法与 Pollard rho 算法。因为攻击需要的步骤约为群阶的平方根,至少要使用 \(2^{160}\) 阶的群。通过哈瑟定理,这需要椭圆曲线中的质数 \(p\) 为 160 位长。需要注意的是,这样的安全性,只有在选择何理的椭圆曲线时才成立。

9.5 软件与硬件实现

在使用 ECC 之前,需要确定一个良好的椭圆曲线。实际上,核心的需求是由曲线组成的循环群需要具有质数阶。因为确定这样的曲线需要复杂的计算,在实际实现时,会使用标准的曲线。

在实现 ECC 时,我们可以将 ECC 策略分为四层,从最底层的 \(GF(p)\) 中的加减乘除运算,到下一层的两个群元素的加法,再到下一层的标量乘法,与最顶层的真实算法实现如 ECDH 或 ECDSA。

通过软件,优化后的 ECC 算法在 3-GHz 64 位 CPU 上,进行点乘运算需要消耗 2ms。最快的硬件实现可以将点乘运算控制在 40us。

ECC 是最吸引人的小型应用公钥算法,可以用在如 RFID 卡中。高度集成的 ECC 引擎可以使用 10000 个门电路,运行速度约几十毫秒。虽然 ECC 引擎实现相较于对称算法如 3DES 复杂,但相较于 RSA 算法要轻量许多了。

posted @ 2023-03-31 23:43  ArvinDu  阅读(62)  评论(0编辑  收藏  举报