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\) 集合,满足:
其中 \(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 构造如下,绘制穿过 \(P\) 与 \(Q\) 的直线,得到与椭圆曲线的第三个个交点,将这个交点关于 \(x\) 轴做对称,得到镜像点 \(R\)
相同的点加法 P + P 构造如下,绘制 \(P\) 点的切线,得到与椭圆曲线的第二个交点,将这个交点关于 \(x\) 轴做对称,得到镜像点 \(R\)
操作:加法
下面给出在质数域 \(GF(p)\) 下计算加法的方法:
椭圆曲线点加法
其中:
零元素
我们定义一个无穷远处存在一个抽象的点,做为零元素
逆元素
\(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}\) 中的曲线
我们计算 \(P = (5,1)\) 的自身加法:
下面验证 \(2P = (6,3)\) 是否是曲线上的点:
9.2 使用椭圆曲线构建一个离散对数问题
定理 9.2.1 在椭圆曲线上外加零元素若具备一个循环子群,所有椭圆曲线上的点形成一个循环群
例 9.5 我们想要找到曲线上的点:
在这个曲线上的所有点形成一个循环群,阶为 19,在这样的曲线下群阶是一个质数,由定理 8.2.4 易知所有元素都是原始元素。
取 \(P = (5,1)\),因为群操作是加法,让我们计算 \(P,2P,...\),下面是我们得到的结果:
因为 \(P + 18P = (零元素)\),这表示 \(P = (5,1)\) 的逆是 \(18P = (5,16)\),反之亦然,\(x\) 坐标相同,\(y\) 坐标和为 17。
为了设置 DL 加密系统,需要知道群的阶,通过哈瑟定理(Hasse's theroem) 我们可以知道椭圆曲线上点数量的约数。
定理 9.2.2 哈瑟定理
椭圆曲线 \(E\) 模数 \(p\),曲线上的点表示为 \(\#E\) 且有:
这在实际的应用是,如果我们需要一个具有 \(2^{160}\) 元素的椭圆曲线,我们必须使用的质数位长为 160 位。
现在,让我们设置离散对数问题。
定义 9.2.1 椭圆曲线的离散对数问题 (ECDLP)
椭圆曲线 \(E\),考虑一个原始元素 \(P\) 以及另一个元素 \(T\),离散对数问题是查找整数 \(d\),\(1 \leq d \leq \#E\),从而有:
在密码系统中,\(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\),具有下面的二进制表示:
算法从 \(d_4\) 开始扫描:
9.3 使用椭圆曲线的 Diffie-Hellman 密钥交换
椭圆曲线的 Diffie-Hellman 密钥交换 ECDH。
ECDH 域参数
-
选取一个质数 \(p\) 以及椭圆曲线
\[E : y^2 \equiv x^3 + a\cdot x + b \ mod \ p \] -
选择一个原始元素 \(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。这需要计算:
或
如果选择何理的椭圆曲线,已知唯一有效的攻击手段就是大小步算法与 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 算法要轻量许多了。