椭圆曲线密码学的简单介绍

作者:Nick Sulivan 译者:明明想说

转载请注明出处

作者Nick Sulivan最近加入了CloudFlare,之前他作为一个系统工程师在苹果公司效力了6年,并在这期间完成了许多重要的密码学著作。作者拥有滑铁卢大学的数学本科学位和卡尔加里大学专攻密码学的计算机科学硕士学位。这篇文章最初登在 CloudFlare blog 网站,然后经过简单修改后放在了Ars网上。

需要注意的是椭圆曲线密码学(ECC)是一套关于加密数据、解密数据和交换秘钥的算法。目前的密码学标准Dual_EC_DRBG,是一个可用种子(seed)根据椭圆曲线计算生成一串随机数字的函数,该标准疑似被美国国家安全局(NSA)植入了后门程序。该简单介绍恰好发布在国际知名的密码学专家呼吁全世界都采用ECC标准来避免可能的“密码学灾难”的两个月之后。


椭圆曲线密码学(ECC)是目前被广泛使用的最强大的,同时也是最难懂的一个密码学。为保证客户的HTTPS连接到他们的数据中心之间的数据传输是安全的,越来越多的网站都大量采用ECC加密。基本上,为了确认系统的安全性,终端用户了解其背后的技术也是非常重要的。为了这个目的,我们试图找一个写的较好的,通俗易懂的ECC初级读本来分享给我们的用户。遗憾的是没有找到,所以我们决定自己写一份,即以下所写。


提示:ECC是一个复杂的主题,几乎不太可能把它写成一个精简的博文。也就是说,得写一篇完整的内容详实的文章。如果你只想知道ECC的要点,这是摘要版本:ECC是下一代的公钥密码学,它基于当前已被广泛承认的数学计算模型。相比前一代公钥密码学系统(如RSA),ECC提供了更安全的基础。假如你想在保持性能的同时保证更高的安全,那么就采用ECC吧。如果你想知道更多细节,请继续读下去。

公钥密码学的黎明

密码学的历史可以分成两个时代:经典密码学和现代密码学。两个时代的转折点发生在1977年,当时RSA算法和DH算法(Diffie-Hellman秘钥交换协议/算法)被首次提出(译者注:RSA算法是1977年首次面世,DH算法是在1976年被提出的)。这些新的算法具有划时代的意义,因为它们第一次使基于数论的安全通讯密码学方案成为可行的;同时也是第一次使通讯双方在不需要共享秘钥的情况下能够安全通讯。密码学过去的双方需在世界范围内传输电报密码本来进行通讯,而现在任意双方都能够进行已被证明安全的通讯,并且不需要担心有人窃听到密钥的交换。


现代密码学建立在这样一个理念之上,即用来加密数据的密钥可以被公开,而解密数据用的密钥保持私有即可。因而,这种加解密方式被称为公钥密码学系统。第一个应用公钥密码学理念的算法,同时也是目前应用最广泛的算法就是RSA——用首次公开描述该算法的三个人名的首字母命名:Ron Rivest,Adi Shamir,和Leonard Adleman。


我们公钥密码学系统需要的是一组单方向很容易计算但很难反方向倒推的算法。例如RSA,只需要简单的将两个质数相乘即可。显然获得两数乘积非常简单,但其对应的因式分解算法需将乘积分解成两个质数则非常困难。类似这样特性--向一个方向计算容易,但很难反方向倒推--的算法被称作单向陷门函数(trapdoor functions)。能否找到一个好的trapdoor函数对构造一个安全的公钥密码系统至关重要。简单来说,trapdoor函数中单方向计算和反方向倒推之间的难度差值越大,则基于该密钥对的系统就越安全。

一个简单的RSA算法


RSA算法是当前最流行也是最明了的公钥密码学系统。它的安全性基于因式分解的缓慢和乘法的快速的事实上。接下来是关于RSA算法的说明及其工作原理的叙述。


总之,一个公钥加密系统有两部分:一是公钥,二是私钥。加密操作通过将要传递的信息进行一个数学运算来得到一串看起来随机的编码。解密操作则是将该随机编码通过另一个数学运算来获得原来的编码信息。用公钥进行加密的信息只能用对应的私钥进行解密。


计算机并不能处理任意大的数字。因此我们要选择一个最大值,并确保我们的数据不会超过最大值从而仅处理那些小于最大值的数字。我们可以模拟时钟一样来对待这些数字。任何一个比最大值大的数的都将被截取并返回一个有效范围内的数。


在RSA里,这个最大值(记为max)可通过两个随机质数相乘获得。专门挑选的公钥和私钥是两个大于零小于最大值的数字(记为pub和priv)。加密一个数字时,计算该数字的pub次幂值,若所得数值超过最大值max则进行截取返回处理。解密该信息时,计算该信息值的priv次幂,(译者注:若超过max则截取返回后)将得到加密前的数字。这个算法看起来挺神奇,事实上确实如此(译者注:此处作者解释的不是很清楚,可以网上搜索专门的RSA算法原理来加深理解,RSA在数学上也是可以证明的)。这个算法的特性在被发现时是当时的一个大突破。


想要创造一个RSA秘钥对,首先随机选两个质数来计算最大值(max)。然后挑选一个数值作为公钥pub。根据先前挑选的两个质数,就能用公钥计算出一个相对应的私钥priv。这也是如何破解RSA的算法——将最大值因式分解成先前的质数,便可以用公钥来计算对应的私钥从而解密其中的私有信息。


这里举一个更具体的例子。取质数13和7,它们的相乘结果为最大值为91。我们取5为公钥。由于我们知道91可以分解为7和13,,然后使用扩展欧几里得算法,我们可以计算得到私钥是29。


这几个参数(max:91,pub:5,priv:29)完全可以看成是一个实用型RSA系统。你可以取一个数字并且计算它的5次方来加密,然后对所得数字进行截取返回处理;截取返回后的数字进行29次方幂的计算,将所得数字再截取返回将会得到原来加密前的数字。


接下来,我们用以上的数值加密信息“CLOUD”。


为了用数字表示这个信息,我们把字母转换成数字。拉丁字母表通常用UTF-8来表示。每个字母都对应一个数字。

在这个编码下,CLOUD是67,76,79,85,68。每个数字都小于我们的最大值91,所以我们可以单独地加密处理它们。我们从第一个字母开始。


我们计算它的5次方来得到加密的值。


67×67 = 4489 = 30 *

*因为4489大于最大值,需要取模计算。 我们把它除以91然后取余数。


4489 = 91×49 + 30


30×67 = 2010 = 8


8×67 = 536 = 81


81×67 = 5427 = 58


这意味着67(或C)的加密值是58。


对每个字母重复这个过程,我们得到加密信息CLOUD变成:58,20,53,50,87


要解密这个加密形式的信息,我们取每个数字并用它乘以它自己29次:


58×58 = 3364 = 88 (记住,所得数字大于max时依然要进行截取返回处理。)

88×58 = 5104 = 8

9×58 = 522 = 67


瞧,我们又得到了67。将剩余数字作上述运算,同样会得到原来的信息。


要点就是要找一个数字,用该数字进行n次幂运算得到一个数值,然后用所得数值再次进行特定次幂运算需得到原来的数字。


没有完美的trapdoor


RSA和Diffie-Hellman由于严格的安全认证而变得强大。作者证明破坏这个系统相当于解决一个公认很难的数学问题。因式分解是一个非常著名的问题,并且从很早以前就一直被研究(可参考埃拉托色尼筛选法the Sieve of Eratosthenes)。任何一次破解都将会是一个重大新闻,并且破解者将会赚得大笔意外之财。

"Find factors, get money" - Notorious T.K.G. (Reuters)

这说明,在位对位基础上的计算处理,因式分解并非最难解的问题。像两次筛法(Quadratic
Sieve)和普通数域筛选法 ( General Number Field Sieve )这类专门加工过的算法在解决素数因子分解的问题上是比较成功的。相比那些仅靠猜测已知的质数对那种简单算法,这些算法运行的更快,并且在高密度解空间内可以节省计算力。


这些因式分解算法随着被因式分解的数字的变大而变得更有效率。大数字因式分解和大数字乘法之间的难度差距随着数字(即秘钥的字节长度)变大而缩小。随着大数字解码资源的增加,秘钥的长度也必须更快增长。这对计算能力有限的手机和低功率设备来说,是不可持续的。因此从长期来看,因式分解和乘法之间的计算难度差值也是不可持续的。


所有这些意味着RSA对未来的密码学来说并不是理想的加密系统。在一个理想的trapdoor函数里,伴随数字长度的变化,小数值和大数值都应该受到同样的计算难度变化。所以我们需要一个更好的基于trapdoor的公钥系统。


椭圆曲线:一个更好的trapdoor的构建区


在RSA和Diffie-Hellman面世后,研究人员不断探寻其他基于数学的密码学解决方案,努力寻找超越因式分解的其他算法,以构建更好的trapdoor函数。1985年,一种基于椭圆曲线(一个深奥的数学分支)的加密算法被提出来。


但到底什么是椭圆曲线并且其背后的trapdoor函数是如何工作的?尴尬的是,不像因式分解--那些我们在中学就学到过的东西--大多数人对椭圆曲线函数的有关数学知识并不熟悉。这个数学知识并不那么简单,也没那么容易解释,但我将在接下来的几个篇幅把椭圆曲线介绍一下。(如果你已开始脑袋发晕,你可以直接跳到“这一切说明什么”的章节。)


一条椭圆曲线是一组满足一个特定方程的点的集合。椭圆曲线的方程类似这样:

= + ax + b


它的图形看起来有点像露露柠檬的商标倾斜到旁边的样子:

椭圆曲线还有其他的表现形式,但准确来说椭圆曲线是一个二元方程,其中一个二阶变量,一个三阶变量。一个椭圆曲线不仅仅是一张漂亮的图片,它有一些十分契合密码学的特性。


奇特的对称性


仔细看上文的椭圆曲线,它有几个有趣的特性。


其中一个特性是水平对称。曲线上的任何点以X轴作映射后得到的仍然是同一曲线。一个更加有趣的特性是任何不垂直的直线穿过曲线最多有三个交点。


让我们来把曲线想象成一个怪异的桌球游戏。取曲线上的任意两点并且沿他们作一条直线;这条直线与椭圆曲线有一个以上的交点。在这个桌球游戏里,我们拿球从A点射向B点。当它撞上曲线时,这个球要么向上反弹(如果它位于X轴下方)或者向下反弹(如果它位于X轴上方)到曲线的另一边。

(备注:动态图,可参考原文,网址见末尾)


我们把球沿两点的移动叫作“打点(dot)”。曲线上的任意两点被打点后都能得到一个新点。


A dot B = C


我们也能持续做一串移动来用它自己反复“打点"。


A dot A = B


A dot B = C


A dot C = D


...


事实证明如果你有两个点,一个是起点,一个是打点n次后得到的终点,在你只知道起点和终点,想找出n的值是很困难的。继续回到我们怪异桌球的比喻,如果在任意一段时间内有人在房间内单独玩我们的桌球游戏。对他来说,他很容易通过上述规则反复击球至终点。再假设有另外的人在他击球后走进房间并看到球最终的位置,即使他知道这个游戏的所有规则以及球的起点,在没有全程观察游戏球到达最终点的情况下,他也不能算出击球的次数。正推容易,但反推很难。这就是一个非常棒的trapdoor函数的基础。


进一步阐述


上文的简化曲线非常适合阐述和解释椭圆曲线的基本概念,但这并不能完全代表用于密码学里的椭圆曲线。


为此,我们不得不像RSA算法那样把数字限制在一个固定范围内。不像曲线上可以取任何点的任何值那样,我们只能取一个固定范围内的所有整数值。当我们计算椭圆曲线的公式( = + ax + b)时,如果我们的计算值超出最大值,我们用相同的方式(译者理解同RSA截取返回的处理方式)持续处理数字的取值。如果我们挑选一个大质数作为最大值,这时的椭圆曲线叫做“prime curve”,并且有非常出色的密码学特性。


下图是一个以所有数字绘制的曲线 = -x+1的例子:

下图是最大值为97并以所有整数点绘制的同一曲线:

以传统观念来讲,这看起来几乎不像一个曲线,但它确实是。这是原始曲线计算超出最大值截取返回后的打点(dot),并且只有击打到的曲线整数点坐标时才被着色标出。你依旧能看到它的对称性。


事实上,你依旧能在这个曲线上玩这个模拟的桌球游戏并且同时打点。曲线方程上任一条线的方程依然有同样的特性。此外,打点操作能被快速的计算。你可以想象成两点间的直线在超过范围值后进行截取返回处理直到撞上曲线上的点。就像,在我们的怪异桌球游戏里,当一个球打到桌子的边缘(max)后用魔法将它送到桌子的对面,并继续它的行程直到遇到一个曲线上的点,有点类似贪吃蛇游戏。

(备注:动态图,可参考原文)


就像这个新的曲线所表示的,你可以将信息用曲线上的一点来表示。假定你的一个信息,并且知道它的一个x坐标,并试图找到其在曲线上的y坐标。在实践中会比这更复杂一些,但是基本的概念类似。


你得到这些点


(70,6), (76,48), -, (82,6), (69,22) *

*没有与65匹配的x值;在现实世界里,这能够被避免。


通过一个最大值质数、一个椭圆曲线方程和曲线上的一个公共点,便可以得到一个确定的椭圆曲线密码系统。私钥是一个数字priv,公钥是通过自己priv次的打点得到公共点。在这种密码学系统里,通过公钥计算私钥就是求解椭圆曲线离散对数函数。这就是那个我们寻找的trapdoor函数。


这一切说明什么?


椭圆曲线离散对数算法是基于ECC最难的问题。即便最近30年的研究,数学家任然没有找到一个能够解决这个问题的改进方法。也即是说,和因式分解不同,基于当前已知的数学方法,找不到可以缩小该trapdoor函数的正反计算难度差值的办法。这意味着对于许多同样位数长度的数字,解决椭圆曲线离散对数问题要比因式分解困难的多。因为一个算法的计算空间越密集意味着一个密码系统越强大,所以椭圆曲线密码学系统比RSA和Diffie-Hellman更加难以攻破。 为了理解这到底有多难被攻破,Lenstra最近提出了“全球安全(Global Security)”的概念。你可以计算攻破一个(椭圆曲线)密码学算法需要多少能量和计算该能量能煮沸多少水进行对比。这是一种密码学的碳排放量的衡量。通过这样的测量方法,破解一个228字节的RSA秘钥所需能量少于煮沸一勺水的能量。相对地,破解一个228字节的椭圆曲线秘钥所需能量足够煮沸地球上所以水。而RSA要达到这样的安全强度,需要2,380个字节的秘钥长度。 使用ECC,你可以用更简短的秘钥获得相同的安全强度。简短秘钥是非常重要的,尤其是在现实中密码学算法越来越多的运行在小功率设备里,例如手机。尽管两质数相乘比把结果因式分解要简单,但当质数变得非常大,在低功率设备上仅仅只是乘法步骤都将花费很长一段时间来计算。虽然可以通过增加秘钥长度来保持RSA的安全性,但却是以牺牲客户端的性能为代价。ECC提供了一个较好的选择:使用简短并且快速的秘钥来达到高安全性。


椭圆曲线的运用


经过一个缓慢的开始后,以椭圆曲线为基础的算法越来越普及,使用椭圆曲线算法的步伐也正在加速。现在ECC被广泛用于各种各样的应用:美国政府用它保护内部通讯;Tor项目用它来确保匿名性;比特币用该机制证明比特币的所有权;苹果公司用它对iMessage进行签名服务;它还被用于DNSCurve进行DNS信息的加密;同时它是SSL/TLS协议认证安全网页浏览的首选方法。越来越多的网站使用ECC来支持完善前向保密(perfect forward secrecy)协议,而该协议对网络隐私来说是必不可少的。第一代密码学算法比如RSA和Diffie-Hellman在很多领域仍然是行业标准,但ECC正在快速成为网络隐私与安全的首选解决方案。


如果你用最新版本的Chrome或Firefox浏览器里访问Cloudflare博客的HTTPS链接,那么你的浏览器使用的就是ECC。你可以自己确定是否是如此。在Chrome里,你可以点击地址栏里的锁然后到链接标签页查看建立这个安全连接时用的是哪一种密码学算法。点击Chrome30版的锁会出现如下的画面。

上图和本文讨论相关的部分涉及到ECDHE_RSA。 ECDHE表示Elliptic Curve Diffie Hellman Ephemeral,这是一个基于椭圆曲线的秘钥交换机制。这个算法被网站用在SSL里来提供对完善前向保密协议的支持。RSA部分意味着RSA被用来进行服务器的身份认证。

用RSA的网站使用它(译者注:ECDHE_RSA)是因为他们的SSL证书必须是RSA秘钥对。现代的浏览器也支持基于椭圆曲线密钥对的认证证书。如果网站的SSL证书是一个椭圆曲线密钥对的证书,这个页面将被声明为ECDHE_ECDSA。
服务器的身份验证将会用ECDSA(椭圆曲线数字签名算法)来认证。


下面是一个关于ECDHE的简单ECC曲线例子。(这和谷歌用的是同样个曲线):

max:
115792089210356248762697446949407573530086143415290314195533631308867097853951

curve: = + ax + b

a =
115792089210356248762697446949407573530086143415290314195533631308867097853948

b = 41058363725152142129326129780047268409114441015993725554835256314039467401291


使用ECDSA对性能改善显著超过了RSA。即使与一个没有最佳编译优化的椭圆曲线代码的旧版OpenSSL相比,一个256字节秘钥的ECDSA签名要比一个2048字节秘钥的RSA签名快过20倍。


在一个用OpenSSL0.9.8的苹果笔记本里(MacBook Pro),“速度”基准显示:


Doing 256 bit sign
ecdsa's for 10s: 42874 256 bit ECDSA signs in 9.99s


Doing 2048 bit
private rsa's for 10s: 1864 2048 bit private RSA's in 9.99s


用ECDSA算法的签名比用RSA算法的快23倍。


用ECC节省服务器和浏览器的时间,能量和计算资源,帮助我们更快、更安全地浏览网页。


不足之处


椭圆曲线算法也不尽完美。依然有一些问题和不确定性使它不能让行业里的每个人都能放心使用。


包括最近新闻也提到的一点就是双椭圆曲线确定性随机比特生成器(Dual_EC_DRBG)问题。这是一个由美国国家标准协会(NIST)制定并被美国国家安全局(NSA)大力提倡的随机数发生器。Dual_EC_DRBG利用椭圆曲线算法的机制生成随机数。这个算法涉及到在曲线上取点并反复在椭圆曲线上进行“打点”操作。该算法公布之后,据报道可能存在一个后门程序,可以根据一个密码完全预测其返回的数字顺序。最近,RSA公司由于其安全产品生产线上的随机数发生器被设置为默认的伪随机数发生器而召回了它的部分产品。无论这种随机数发生器是否被写了后门程序都不会改变椭圆曲线技术本身的力量,但这确实引起了关于对椭圆曲线标准化过程的一些问题。这也是我们应该将注意力用在确保系统充分使用随机数的部分原因。


世界有怀疑精神的密码学专家普遍不信任美国国家标准协会(NIST)和美国国家安全局(NSA)发布的标准。而几乎所有被广泛应用的椭圆曲线都归入这个范畴。目前未发现针对这些有效的椭圆曲线算法的攻击,但不好的椭圆曲线也确实存在,而且部分人认为这种暂时的相安无事总比把问题暴露出来更好。除美国国家标准协会(NIST)之外,有关椭圆曲线高效算法的发展也取得了进步,包括Daniel
Bernstein (djb)设计的曲线25519和近期由Paulo
Baretto 及其合作者设计出来的曲线。但这些椭圆曲线距离被广泛采用还需时日。除非这些非经典的曲线被浏览器应用,否则它们很难被用于互联网上的安全密码传输。


关于ECC的另一个不确定性与专利有关。包含特定用途的椭圆曲线在内,有超过130个专利被BlackBerry占有(通过2009年收购Certicom)。许多专利被限制用于个人组织甚至NSA。这使一些ECC开发商停下来考虑他们是否侵犯了这些专利。在2007年,Certicom由于索尼使用一些椭圆曲线而申请起诉它,后来诉讼在2009年被撤销。现在有许多ECC算法被认为没有侵犯这些专利并且被广泛应用。


ECDSA数字签名相比于RSA有一个缺点,即它需要较高的信息熵。没有适当的随机性,私钥可能会泄露。安卓系统上的随机数发生器有一个漏洞,在2013年早期,该漏洞使黑客能够找到保护几个人比特币钱包的ECDSA私钥。应用ECDSA的索尼游戏机也有一个类似的漏洞。游戏机需要一个好的(信息熵较高的)随机数来源来产生签名。Dual_EC_DRBG因而不被推荐。


展望未来


尽管有上面警告,ECC算法的优势依然超过被广泛接受的传统RSA算法。许多专家担忧RSA和Diffie-Hellman背后的算法可能在五年以内被攻破。随着时间推移,ECC可能是以后唯一选择。



译者注: 在保证原文翻译的基础上,尽量保证表达通顺,极少部分是根据译者理解进行翻译的。翻译不好的地方还请见谅。

原文标题:A (relatively easy to understand) primer on elliptic curve cryptography

原文作者: Nick Sullivan

原文发表时间:2013年10月25日,

原文网址:A (relatively easy to understand) primer on elliptic curve cryptography

编辑于 2017-09-19