首先我们了解一下,什么是数字签名。
什么是数字签名?
在现实工作与生活中,我们一般使用签名的方式表达对一份重要文件的认可,而其他人通过识别你的签名,来确定你是否已确认/同意这份文件。
但是通过临摹等方式,有些人可以伪造出相似度达99%的字迹,假装你的签名,这时候非专业人员可能无法分辨出,是否为你本人所签署。
而数字签名就是对现实签名以电子的方式实现,它不仅可以完全达到现实签名的特点,甚至能够做的更好。数字签名的主要作用就是,数字签名的主要作用就是保证了数据的有效性(验证是谁发的)、完整性(证明信息没有被篡改,而这是手写签名不具备的功能)以及抗抵赖性(人们不能否认自己发送信息的行为和内容)。
与手写的签名不同,数字签名与被签名信息有着很强的关联,对输入信息的轻微改动,都会产生完全不同的数字签名。
一般来说,数字签名不会对信息直接进行加密,而是选择对信息的Hash值(Hash值是根据信息内容计算出来的一个指定长度数字,可以验证数据传递的完整性)进行加密,并把加密结果附加到被签名的信息后面。
用户如果需要确定信息的完整性或真实性,可对原Hash值进行解密,得出第一个Hash值,再对接收到的信息使用Hash函数得出第二个Hash值,将两个Hash值进行对比,如果相同,说明收到的内容确实来自合法用户,并且在传输过程中没有被篡改。
常用的数字签名算法有基于RSA的数字签名、DSA、ECDSA等,我们今天就要谈谈基于椭圆曲线密码学的ECDSA算法。
什么是ECDSA?
ECDSA,全称为椭圆曲线数字签名算法,主要用于对数据(比如一个文件)创建数字签名,以保障信息在传递和使用过程中的完整性、真实性和不可抵赖性。
ECDSA 是基于椭圆曲线密码(ECC,Eliptic Curve Cryptography)的数字签名算法,即使用基于ECC的公钥密码算法对信息的Hash值进行加密。
ECDSA的优势
那么同为数字签名,为什么现在ECDSA成为了新潮?
因为它是目前已知的公钥体制中,加密强度最高的一种。相较于目前最为普及的RSA算法,ECDSA算法使用更短的密钥,就可以实现和密钥长度数倍于自己的RSA相同的安全性能。
ECDSA算法与RSA算法相比,具有以下优势:
a.在相同密钥长度下,安全性能更高。例如,160位ECDSA已经与1024位的RSA有着相同的安全强度。
b.计算量小,处理速度快。在私钥的处理速度上(解密和签名),ECC远比RSA快得多。
c.存储空间占用小。ECC的密钥尺寸和系统参数与RSA相比要小得多, 占用的存储空间更小,占用带宽更少,因此ECDSA非常适用于移动互联网。
如果要说ECDSA算法有什么缺点的话,那就是:理论难以理解,实现技术复杂。
ECDSA的原理
需要注意ECDSA的两个词:Curve(曲线)与 Algorithm(算法),这意味着ECDSA基本上是基于数学原理的,而且涉及非常复杂的数学原理。
对于 ECDSA,首先需要知道曲线参数,参数是 a,b,p,N 和 G。你已经知道 a 和 b 是曲线函数的参数(y ^ 2 = x ^ 3 + ax + b),即 'p' 是模的底数,'N' 是曲线的点数,'G' 是ECDSA所需要的,它代表一个'参考点'或者你可以理解为一个起点。参考点可以是曲线上的任何点。
曲线上的参数是非常重要的,不知道它们,就不能签名或验证签名。验证签名不仅仅是知道公钥,还需要知道公钥的派生参数。NIST(美国国家标准技术研究院)和SECG(高效密码学标准组织)提供已知安全和高效的预制和标准化曲线参数。
首先,你拥有一个私钥和一个公钥。私钥是一个随机数(也是160位),并且公钥是由 私钥点乘G 所生成的曲线的点。我们把'dA'作为私钥(随机数)和'Qa'作为公钥(椭圆曲线上的点),所以我们有:Qa = dA * G(其中G是曲线参数中的参考点)。
创造签名
那么如何利用ECDSA对一个文件/消息进行签名呢?
首先,你需要知道签名是 40 个字节,并且用两个 20 字节的值来表示,第一个被称为 R,第二个被称为 S 。值对(R,S)就是你的 ECDSA 签名。下面介绍如何计算这两个值,首先你必须生成一个随机值 'k'(20个字节),并使用点乘法来计算点 P = k * G。R为点P的 x坐标的值。
为了计算 S,你必须做一个消息的 SHA1 哈希值,这会给你一个 20 字节的值,你会认为它是一个非常大的整数,我们称它为 'z'。现在你可以用下面的公式计算S:
这里注意k ^ -1是k的 “模乘法逆元”,它不是 k 的倒数,而是一个使得(k ^ -1 * k)mod p等于1成立的整数。
再次提醒,k 是用于生成 R 的随机数,z 是要签名的消息的哈希,dA 是私钥,R是P点的X坐标值。
验证签名
最后这个就是之前用来产生签名的方程,这是相匹配的。