原文链接:Elliptic Curve Cryptography: ECDH and ECDSA
这篇文章是ECC系列的第三篇。
在之前的文章中,我们已经知道了椭圆曲线是什么,并且为了对椭圆曲线上的点做一些数学运算我们定义了群公理。然后我们将椭圆曲线限制在整数取模的有限域上。在该条件下,我们发现椭圆曲线上的点能生成循环子群,接着引入了基点、阶数和辅助因子。
最后,我们已经知道了,有限域中的标量乘法是一个“简单”问题,而离散对数问题似乎是一个“困难”问题。现在我们将看看如何将这些知识应用于密码学。
主要参数(Domain parameters)
我们的椭圆曲线算法将运用在有限域上的椭圆曲线所生成的循环子群上。因此,我们的算法将需要以下参数:
- 描述有限域范围大小的素数p
- 椭圆曲线方程的参数a和b
- 生成循环子群的基点G
- 子群的阶数n
- 子群的辅助因子h
总之,我们算法的主要参数可以定义为一个六元组
![This is the rendered form of the equation. You can not edit this directly. Right click will give you the option to save the image, and in most browsers you can drag the image onto your desktop or another program.](https://img-blog.csdnimg.cn/img_convert/93dc1c7bc645aeb4725244187404433a.gif)
随机曲线(Random curves)
当我说离散对数问题是一个“困难”问题时,这个说法并不完全正确。有一些椭圆曲线是特别弱的以至于一些不怀好意的算法可以有效率地求解离散对数问题。例如,所有具有p = hn(即有限域的阶数等于椭圆曲线的阶数)的曲线都容易受到Smart攻击,这种攻击可以用经典计算机在多项式时间内解决离散对数问题。
现在,假设我给你们一条曲线的主要参数。有可能我发现了一类新的没人知道的弱曲线,也有可能我建立了一个“快速”算法来计算我给你们的曲线上的离散对数。我怎样才能让你相信恰恰相反,也就是说,我不知道自己(所给的曲线)有任何弱点?我如何向你保证这条曲线是“安全的”(也就是说它不会被我用于特殊目的的攻击)?
为了解决这类问题,有时我们需要一个额外的主要参数:种子S。这是一个随机数,用于生成参数a和b,或基点G,或两者。这些参数是通过计算种子S的哈希生成的。哈希,正如我们所知道的那样,“容易”计算,但“难以”逆推(正向计算容易,反向计算困难)。
![](https://img-blog.csdnimg.cn/img_convert/08e7720e6202efc582016cf1cc57c27a.png)
一个关于如何从种子生成随机曲线的简单示意图:一个随机数的哈希用于计算曲线的不同参数
![](https://img-blog.csdnimg.cn/img_convert/dbd1bab10b9bdc5f10a48291f2432c16.png)
如果我们想作弊并试图从主要参数中构造一个种子,我们将不得不解决一个“难解的”问题:逆向哈希
通过种子生成的曲线称为可验证的随机曲线。使用哈希生成参数的原理被称为“nothing up my sleeve”,这个原理在密码学中经常用到。
这个技巧应该能在某种程度上保证曲线不是专门为暴露作者已知的漏洞而设计的。事实上,如果我给你一个带种子的曲线,这意味着我不能自由选择参数a和b,你应该相对肯定的是,曲线不能被我用于特殊目的攻击。我说“相对”的原因将在下一篇文章中解释。
在ANSI X9.62中描述了一种基于 SHA-1的生成和检查随机曲线的标准化算法。如果您感兴趣,可以阅读specification by SECG 规范中生成可验证随机曲线的算法(寻找“可验证随机曲线和基点生成器”)。
我创建了一个tiny Python script ,用于验证shipped with OpenSSL当前提供的所有随机曲线。我强烈推荐你去看看!
椭圆曲线密码学(Elliptic Curve Cryptography)
前面的学习使我们花了很长时间,但终于到了椭圆曲线密码学这部分内容了!因此,简单地说:
- 私钥是一个从
中选择的一个整数d(其中n为子群的阶)
- 公钥为点
(其中G为子群的基点)
你看到了什么?如果我们知道d和G(以及其他的主要参数),那么找到H便很“容易”。但如果我们知道H和G,想找到私钥d就很困难了,因为这需要我们解决离散对数问题。
现在我们将基于此来阐述两个公钥算法:用于加密的ECDH (Elliptic curve Diffie-Hellman)和用于数字签名的ECDSA (Elliptic curve Digital Signature Algorithm)。
用ECDH加密(Encryption with ECDH)
ECDH是椭圆曲线的 Diffie-Hellman algorithm 的变体。它实际上是一种密钥协商协议,而不仅仅是一种加密算法。这基本上意味着ECDH(在某种程度上)定义了应该如何在各方之间生成和交换密钥。如何使用这些密钥加密数据取决于我们自己。
它解决的问题如下:双方(通常是Alice和Bob)希望安全地交换信息,这样第三方(中间人)可能会拦截他们,但可能不会解码信息。这是TLS背后的原则之一,举个例子。
工作流程如下:
- 首先,Alice和Bob生成自己的私钥和公钥。我们有Alice的私钥
和公钥
, Bob的私钥
和公钥
。请注意,Alice和Bob都使用相同的主要参数:同一有限域上同一椭圆曲线上的同一基点G。
- Alice和Bob通过一个非安全信道交换他们的公钥
和