ecdsa算法[ecdsa算法安全吗]

币安(Binance)最新可用网址(点击下图直达注册!)

最近有一位之前找过东方区块链网的用户问了我们小编的一个问题,我相信这也是很多币圈朋友经常会疑惑的问题:ecdsa算法相关问题,ecdsa算法安全吗相关问题,带着这一个问题,让专业的小编告诉您原因。

每个人都可能以某种形式听说过ECDSA。当我说“数字签名”时,有些哥们会更好地认识到这一点,当然有些哥们根本不知道我在说什么。

我曾经试着去了解ECDSA是如何工作的,但很难搞清楚,因为大多数在线参考文献是不够的。他们要么是太基本了 – 他们只是解释算法的基础知识, 或者他们太牛叉-“它是如何工作的?” 。所以你在“它是如何工作的”和“我们是如何到达这里的?”之间挣扎着。所以,如果你没有数学或密码学的学位,但仍然想知道它是如何工作的(除非“奇迹发生,或者你是天才”),那么,恭喜你,你来对地方了。

ECDSA 全称 “ Elliptic Curve Digital Signature Algorithm ”,它用于创建数据的数字签名(例如文件),以便在不影响安全性的情况下验证其真实性。把它想象成一个真实的签名,你可以识别某人的签名,但是如果没有其他人知道你就不能伪造它。 ECDSA签名与真实签名之间的区别在于,伪造ECDSA签名是不可能的。

理解 ECDSA 要注意区分其与用于加密数据的 AES(高级加密标准)的区别。ECDSA不会加密或阻止某人查看或访问你的数据,但它可以防止数据被篡改。

在“ECDSA”这里有两个词值得注意,那就是“曲线”和“算法”,因为这意味着 ECDSA 基本上都是关于数学的。所以我认为首先要说:“嗨,兄弟们,你现在还在扯学的那些高数完全没有什么卵用么!“ECDSA涉及到的数学是相当复杂的,所以我尽量庸俗化,让非技术人员可以理解,但你仍然可能需要一些在数学知识正确理解。下面,我将分两部分来处理,一部分是关于它是如何工作的一个高层次的解释,另一部分是深入理解其内部的工作原理。

其实原理很简单,你拿出纸来,绘制一个数学上的曲线方程,然后你在该曲线上随机选择一点作为你起始的点,然后你生成一个随机数,这是你的私钥,你用这个随机数和“起点”来做一些神奇的数学方程,并且在曲线上得到第二个点,那就是你的公钥。

当你想签署一个文件时,你将使用这个私钥(随机数)和一个散列的文件(一个唯一的数字来表示文件)为一个神奇的方程,这会给你你的签名。签名本身分为两部分,分别称为R和S.为了验证签名是否正确,您只需要公钥(使用私钥生成的曲线上的那个点),然后将其放入另一个神奇的方程与签名的一部分(S),如果它使用私钥正确签名,它会给你另一部分的签名(R)。所以为了简短起见,一个签名由两个数字R和S组成,你用一个私钥生成R和S,如果一个使用公钥和S的数学方程给你R,那么签名是有效的。没有办法知道私钥或仅使用公钥创建签名。

OK,目前你只了解了一点基础知识,你或许没意识到,ECDSA 是复杂的,公钥、私钥又是什么鬼?别担心,你马上就会明白,但首先解释一下,为什么使用ECDSA以及它可能有什么用?

除了上述提到的“我需要签署合同/文件”之外,下面是一些别的用例:例如,我们不希望其数据被用户破坏或修改,例如只允许用户你加载官方地图但不可以进入国防部或电话或其他类型的设备,只允许你安装官方的应用程序。

在这种情况下,文件(应用程序,游戏地图,数据)将用 ECDSA 签名,公钥将与应用程序/游戏/设备捆绑在一起并验证签名,以确保数据没有被修改,而私钥被锁在一个安全的地方。虽然你可以使用公钥验证签名,但是你不能用它创建/伪造一个新的签名,那么这个公钥就可以随应用/游戏/设备一起分发,而不用担心。

这与AES加密系统不同,后者允许您对数据进行加密,但您需要密钥进行解密,而这样的应用程序需要捆绑你的密钥。

一个很好的例子就是PlayStation 3游戏机被打开了,所有的文件都可以被解密,PS3文件中的所有密钥都可以被提取出来,但是还有一件东西需要破解,就是ECDSA签名,它可以防止任何人使应用程序运行在最新的固件上

再通俗一点的解释,http与https的区别,我们拥有一个SA认证机构,私钥拿在自己手里,公钥广播出去,我拿私钥验证公钥(这个仅仅是用来理解公钥和私钥,到此为止啊)。

OK,下面建议你备好垃圾桶,可能会感到恶心或者不适。

让我们从基本知识开始(对于知道这个知识的人可能是无聊的,但对于那些不了解的人是必须的):ECDSA只使用整数数学,没有浮点数(这意味着可能的值是1,2,3等等,但不是1.5, 2.5等),而且数字的范围受到签名中使用多少比特的限制(更多比特意味着更大的数字,更高的安全性,因为猜测变得更难(在这个等式中使用的关键数字)。计算机使用“位”来表示数据,一位是二进制符号(0和1)中的“数字”,而8位代表一个字节。每增加一位,可以表示的最大数量加倍,4位可以表示0到15(总共16个可能的值),5位可以表示32位数值,6位,您可以表示64个值等。一个字节(8位)可以表示256个值,32位可以表示4294967296个值(4千兆)。通常ECDSA将使用总共160位,嗯哼,一个 49 位大的数字…..

你需要知道的另一个数学结构是模数,可以通过说它是整数的其余部分来简化模数。例如,x mod 10意味着x除以10的其余部分,它将始终是0和9之间的数字,所以142 mod 10例如给出2。另一个例子是x mod 2,其中偶数和0分别为0和1。

ECDSA 与消息的 SHA1 加密散列一起使用来签名(文件)。哈希是另一个数学方程式,适用于每个数据字节,这将给一个数据唯一的数字。例如,所有字节的值的总和可以被认为是非常 low 的散列函数。所以如果消息(文件)有任何变化,那么哈希将是完全不同的。在 SHA1 哈希算法的情况下,它总是 20 个字节(160位)。这对于验证文件没有被修改或损坏是非常有用的,对于任何大小的文件,你都会得到 20 字节的哈希值,你可以轻松地重新计算哈希值以确保匹配。 ECDSA 所标记的实际上就是散列,所以如果数据发生变化,散列会发生变化,而且签名不再有效。

为了理解,我们来一个例子。我们将使用最简单的(和最 low 的)散列函数,其中我们将所有数据的总和作为结果的模数10。

首先,你需要明白一点,世间万物将被用一个数字来表示。一个文本文件是一系列的字节,正如我们前面所解释的,它代表了8位,这意味着它可以表示一个介于0和255之间的数字。所以,如果我们将每个字节作为一个数字并添加文件的每个字节,那么我们结果为 10 的模数,我们将以 0 到 9 之间的数字作为结果散列。数据相同,我们将总是得到相同的哈希值,如果更改了文件中的一个字节,结果可能会不同。当然,你也会明白,为了获得相同的散列值,改变文件将是非常容易的,因为只有10种可能性(0到9),那么就有十分之一的机会获得相同的散列值通过改变文件的内容。

这就是 SHA1 起作用的地方,SHA1 算法比我们简单的“模数 10 ”散列函数复杂得多,它将给出非常大的数字(160位,所以是一个十进制的49位数),它的特殊性使得我们如果从文件中修改了一位数据,结果就会彻底改变。

这使得 SHA1 成为一个非常好的哈希算法,这种算法是不可预知的,这是非常安全的,并且几乎不可能得到“冲突”(当两个不同的文件具有相同的哈希),并且不可能伪造数据来获得特定的哈希,如果你 OK 的话,不要听我逼逼了,建议你参加最强大脑。

那么,它是如何工作的呢?ECDSA是基于下面的一个方程等式:

y^2 = (x^3 + a * x + b) mod p

你首先需要注意的是有一个模(mod),并且 ‘y’ 是平方的(不要忘记这是图上曲线的方程)。这意味着对于任何x坐标(不要忘记,我们只使用整数),您将有两个y值,并且曲线在X轴上是对称的。该模是一个素数,并确保所有的值在160位的范围内,它允许使用“ modular square root ”和 “ modular multiplicative inverse ”

的数学,使计算的东西更容易。由于我们有一个模(p),这意味着 y ^ 2 的可能值在 0 和 p-1 之间,这之间便是所有可能的值。因为,ECDSA规定只能是整数,只有那些值较小的子集才能构成一个“完美平方”(两个整数的平方值),这给了 N 个可能的点,其中 N p(N 是数字 0 和 p 之间的完美平方)。到目前为止,你确定还能跟着我的思路么?哈哈,不着急,刚刚开始。。。)

由于每个 x 将产生两个点(y ^ 2的平方根的正值和负值),这意味着有 N / 2 个可能的 “x” 坐标是有效的,并在曲线上给出一个点。因为整数计算和模数的限制,所以符合这些条件的点在椭圆曲线上是有限的。

总结一下,然后再继续。 ECDSA方程为我们提供了一个有限数量的有效点的曲线(N),因为 Y 轴受模量(p)的约束,并且需要是在 X 轴上具有对称性的完美平方(y ^ 2) 。我们总共有 N / 2 个可能的,有效的 x坐 标,不要忘记 N p。

关于椭圆曲线你需要知道的另一件事是“点加法”的概念。它被定义为增加一个点 P 到另一个点 Q 将导致一个点 S,使得如果你绘制一条线从 P 到 Q,它将与第三个点 R 上的曲线相交,这是 S 的负值(记住该曲线在X轴上是对称的)。在这种情况下,我们定义了R = -S来表示R在X轴上的对称点。看上面的图来理解。

所以你可以看到一个形式为y ^ 2 = x ^ 3 + ax + b(其中a = -4和b = 0)的曲线,它在 X 轴上是对称的,其中 P + Q 是对称点 R 点是从 P 到 Q 的直线的第三个交点。

同样的,如果你做 P + P,它将是 R 的对称点,它是与点 P 相切的线的交点。P + P + P 是所得点之间的相加点由于 P + P + P可以写成(P + P)+ P,这就定义了“点乘法”,其中 k * P 是点 P 到点 K 的相加点。看看上面的两个图像点乘法的例子。

在这里,你可以看到两条椭圆曲线和一条从中画出切线的点 P,它与曲线相交于第三点,其对称点是 2P,然后从那里你从 2P 和 P 画出一条直线,会与曲线相交,对称点为3P。等等…你可以继续做点乘法。现在是否明白了为什么在进行加法时需要取 R 的对称点,因为相同点的多次加法总会给出相同的直线和相同的三个交点。

点乘法的一个特殊性是,如果你有一个点 R = k * P,那么你知道 R 并且知道 P,但是没有办法找出 ‘k’ 的值是什么。由于没有点减法或点除法,所以不能只求解 k = R / P。另外,由于你可能做了数百万次的增加,你只能在曲线上的另一个点上,你不知道你是怎么到达的。你不能扭转这个操作,而且你找不到与你的点 P 相乘的值 “k”,给你的结果点 R.

即使你知道原始点和终点也不能找到被乘数的东西是ECDSA算法背后安全的基础,这个原理被称为 “ 陷阱门函数 “。

上面是对 ECDSA 的铺垫,下面让我们认识一下 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是曲线参数中的参考点)。

那么你如何签署一个文件/消息?

首先,你需要知道签名是 40 个字节,并且用两个 20 字节的值来表示,第一个被称为 R,第二个被称为 S ..所以这个对(R,S)一起是你的 ECDSA 签名..现在这里是如何创建这两个值,以签署一个文件..首先你必须生成一个随机值 ‘k’(20个),并使用点乘法来计算点 P = k * G。那个点的 x 值将代表 ‘R’。由于曲线 P 上的点由其坐标(x,y)表示(每个坐标长度为20个字节),因此只需要签名的 “x” 值(20个字节),该值将被称为“R” 。现在你需要的是 “S” 值。

为了计算 S,你必须做一个消息的 SHA1 哈希值,这会给你一个 20 字节的值,你会认为它是一个非常大的整数,我们称它为 ‘z’。现在你可以用下面的公式计算S:

S = k ^ -1(z + dA * R)mod p

这里注意到k ^ -1是k的 “模乘法逆”,它基本上是 k 的倒数,但由于我们正在处理整数,所以这是不可能的,所以它是一个数字,使得(k ^ -1 * k)mod p等于1.再次提醒,k 是用于生成 R 的随机数,z 是要签名的消息的哈希,dA 是私钥,R 是 k 的 x 坐标 * G(其中G是曲线参数的原点)。

现在你已经签名了,你想验证一下,它也很简单,你只需要公钥(当然是曲线参数)就可以做到这一点。你用这个公式来计算一个点P:

P = S ^ -1 * z * G + S ^ -1 * R * Qa

如果点P的x坐标等于R,表示签名有效,否则不是。

很简单,是吧?现在让我们看看为什么..这将需要一些数学来验证:

我们有 :

P = S ^ -1 * z * G + S ^ -1 * R * Qa

但是 Qa = dA * G,所以:

P = S ^ -1 * z * G + S ^ -1 * R * dA * G = S ^ -1(z + dA * R)* G

但是P的x坐标必须与R相匹配,而 R 是k * G的 x坐标,这意味着:

k * G = S ^ -1(z + dA * R)* G

我们可以通过删除G来简化:

k = S ^ -1(z + dA * R)

通过反转K和S,我们得到:

S = k ^ -1(z + dA * R)

这就是用来生成签名的公式。所以它是匹配的,这就是为什么你可以用上面第一个方程验证签名的原因。

你可以注意到,为了计算 S,您需要 ‘k’(随机数)和 ‘dA’(私钥),但只需要 R和 Qa(公钥)来验证签名。由于 R = k * G 和 Qa = dA * G,并且由于ECDSA 点乘法中的陷阱门函数(在步骤9中说明),所以我们不能通过知道 Qa 和 R 来计算 dA 或 k,这使得 ECDSA 算法是安全的,找不到私钥,没有办法在不知道私钥的情况下伪造签名。

所以你还记得产生一个签名所需的等式吧。 R = k * G 和 S = k ^ -1(z + dA * R) 模 p 这个等式的强度是事实上你有一个等式未知数(k和dA),所以无法确定其中之一。

然而,算法的安全性是基于其实现的,确保“k”是随机生成的,并且没有办法让某人可以猜测,计算或使用计时攻击或任何其他类型的攻击为了找到随机值’k’。但索尼在实现上犯了一个巨大的错误,他们在每个地方都使用相同的“k”值,这意味着如果你有两个相同的k,那么它们将具有相同的R值,这意味着您可以使用两个文件的两个S签名(分别为哈希z和z’以及签名S和S’)来计算k:

S – S’ = k^-1 (z + dA*R) – k^-1 (z’ + da*R) = k^-1 (z + da*R – z’ -dA*R) = k^-1 (z – z’)

So : k = (z – z’) / (S – S’)

一旦你知道了k,那么S的方程就变成了一个方程,其中有一个未知数,然后很容易解析为dA:

dA =(S * k-z)/ R

一旦你知道了私钥dA,你现在就可以签名你的文件,PS3将把它识别为索尼签署的真实文件。这就是为什么确保用于生成签名的随机数实际上是“密码随机”的原因。这也是为什么不可能拥有高于 3.56 的自定义固件的原因,仅仅是因为自从 3.56 版本以来,索尼已经固定了他们的 ECDSA 算法实现并且使用了现在不可能找到私钥的新密钥。

这个问题的另一个例子是,当一些比特币客户端使用非密码随机数生成器(在某些浏览器和某些Android客户端上)导致他们使用相同的“k”值签名交易时,恶意人员能够找到他们的比特币钱包的私钥和窃取他们的资金。

这显示了每次签名时使用真正的随机数字的重要性,因为如果(R,S)签名对的R值在两个不同的签名上相同,您将公开私钥。

关于这个的一个笑话在xkcd漫画221(见上图)中显示,这成为了解释这个问题的前景。每当这种算法的执行错误发生时,图像经常被重新使用。

ECDSA算法是非常安全的,不可能找到私钥……只要实现正确完成就行了。如果有办法找到私钥,那么每个计算机,网站,系统的安全性可能会受到影响,因为很多系统都依靠 ECDSA 来保证安全性,这是不可能的。

但愿这能够帮助大家初步理解ECDSA算法,也希望对大家有所帮助。

原文链接: Understanding-how-ECDSA-protects-your-data

y^2 = (x^3 + a * x + b) mod p

上述的曲线是在整数,一定bit数量(假设是160bit)内可以表达的,p是 160bits内可以表示的大整数。

为什么是这种曲线定义呢,我个人觉得有3个原因:

在椭圆曲线上随意取两个点 A,B,连接A,B两个点的直线与曲线的新的交点称为C,C关于X对称的-C点表示为 A+B。

乘法可以用加法表示,但是算法复杂堵是 log(n)。

其实为什么选择上述的椭圆曲线实际上是由这个加法规则选出来的,总是要求解这个新的交点更加简单。

R=k*P 的性质,已知R与P的值,无法推出k的值, 而知道k值于P值是很容易计算R值(log(n))。这是ECDSA签名算法的理论基础。

如何利用这个门限函数来做一个签名算法呢?

一个顺理成章的想法是: 给验证人一个 R和P,那只有签名人才能提供K,那K是不是可以作为一个签名指纹呢?

ok,咱先生成一个公私钥对, Qa = dA * G , Qa 就是公钥, dA 是一个随机数,就当是一个私钥吧,当然这个椭圆曲线的 a , b , p , G 值都是要公开的。这个 G 就是椭圆曲线上随机挑选的一个节点,我们叫原点,也是要公开的。

每次对一个数据做签名,都随机生成一个随机数 K 吧, P = K * G 。咱们把 P的x轴坐标R作为签名的一部分。另一部分签名数据叫 S 。

显然这个 S 既要和 dA 相关,也要和被签名的信息 z 相关。我们就假定:

S = Sig(dA, G, z, R, K) , 那这个函数就是签名函数。

而验证函数应该只有 S,R ,而不会有 K,dA

P = h(S, G, z, R) , h 就是签名函数。

密码学专家想到了一个实现:

S = k^-1 (z + dA * R) mod p

k^-1 表示的是关于p的模逆元。( k^-1 * k mod p = 1)。

可以推倒初验证函数:

== k = S^-1 (z + dA * R) mod p

== k*G = S^-1 (z + dA * R) *G

== P = S^-1*z*G + S^-1*dA*R*G

== P = S^-1*z*G + S^-1*R*Qa

对于验证者来说,需要计算: S^-1*z*G + S^-1*R*Qa 的x坐标是否就是 R 。

go的椭圆曲线 a 为固定的-3, 而 b 可以自由的选择,而p224, p256曲线的其实指的是 曲线的bit位数是224和256。

算法实现着为了更加快速地执行曲线上的加法和乘法,对笛卡尔坐标做了投射成(x,y,z)的雅各布坐标,投射关系:

可以加速在雅各布坐标系上的运算,在需要最终结果的时候再投射回笛卡尔坐标系。

一个曲线的表示:

公私钥对的表示:

可以看出曲线,公钥,私钥拥有的信息越来越全。

公钥是 曲线信息+ dA*G的信息。

私钥是 公钥信息 + dA信息。

美国国安局发布的曲线其实是 secp256k1 , 对于其参数其实没有很好的解释,大家猜测是国安局找到了这是一条弱化的椭圆曲线,因此BTC在设计之初也没有采用这个曲线,而是用了 Koblitz Curve , b 是7, a 是0,btcsuit的package中,对 KoblitzCurve 是golang的 curvparam 的一层封装(主要是为了加速),但是有更多的参数, 是因为a和b等参数都是预先设定的,增加更多的参数来加速计算。至于公私方法和golang基本一样。

Ed25519 从某种意义上来说也属于椭圆曲线密码学,不同的是它采用扭曲爱德华兹曲线作为椭圆曲线,同时采用的签名机制也不同于 ECDSA 算法。EdDSA 的重要实现 ED25519 是 Daniel J. Bernstein 等人设计的 EdDSA 算法,采用的曲线参数完全公开,并说明了参数选取的意义,保证曲线中并未内置后门。

曲线:

y^2 = (x^3 + x^2 + {一个很大的随机数}x ) mod p

他生成公私钥的流程有一些区别,seed作为私钥,seed计算出的hash值去和G相乘得到公钥,为了防止多次计算,把这部分公钥扩展到私钥的后面作为一个完整的私钥。计算签名的时候,普通ecdsa会生成一个随机数K,而ec25519为了避免伪随机数被猜测到,因此是私钥和msg的hash值作为这个随机数。

????先放一张以太坊的架构图:

? ??在学习的过程中主要是采用单个模块了学习了解的,包括P2P,密码学,网络,协议等。直接开始总结:

? ??????????????秘钥分配问题也就是秘钥的传输问题,如果对称秘钥,那么只能在线下进行秘钥的交换。如果在线上传输秘钥,那就有可能被拦截。所以采用非对称加密,两把钥匙,一把私钥自留,一把公钥公开。公钥可以在网上传输。不用线下交易。保证数据的安全性。

????????如上图,A节点发送数据到B节点,此时采用公钥加密。A节点从自己的公钥中获取到B节点的公钥对明文数据加密,得到密文发送给B节点。而B节点采用自己的私钥解密。

????????2、无法解决消息篡改。

????如上图,A节点采用B的公钥进行加密,然后将密文传输给B节点。B节点拿A节点的公钥将密文解密。

????????1、由于A的公钥是公开的,一旦网上黑客拦截消息,密文形同虚设。说白了,这种加密方式,只要拦截消息,就都能解开。

????????2、同样存在无法确定消息来源的问题,和消息篡改的问题。

????????如上图,A节点在发送数据前,先用B的公钥加密,得到密文1,再用A的私钥对密文1加密得到密文2。而B节点得到密文后,先用A的公钥解密,得到密文1,之后用B的私钥解密得到明文。

????????1、当网络上拦截到数据密文2时, 由于A的公钥是公开的,故可以用A的公钥对密文2解密,就得到了密文1。所以这样看起来是双重加密,其实最后一层的私钥签名是无效的。一般来讲,我们都希望签名是签在最原始的数据上。如果签名放在后面,由于公钥是公开的,签名就缺乏安全性。

????????2、存在性能问题,非对称加密本身效率就很低下,还进行了两次加密过程。

????????如上图,A节点先用A的私钥加密,之后用B的公钥加密。B节点收到消息后,先采用B的私钥解密,然后再利用A的公钥解密。

????????1、当密文数据2被黑客拦截后,由于密文2只能采用B的私钥解密,而B的私钥只有B节点有,其他人无法机密。故安全性最高。

????????2、当B节点解密得到密文1后, 只能采用A的公钥来解密。而只有经过A的私钥加密的数据才能用A的公钥解密成功,A的私钥只有A节点有,所以可以确定数据是由A节点传输过来的。

????????经两次非对称加密,性能问题比较严重。

????????基于以上篡改数据的问题,我们引入了消息认证。经过消息认证后的加密流程如下:

????????当A节点发送消息前,先对明文数据做一次散列计算。得到一个摘要, 之后将照耀与原始数据同时发送给B节点。当B节点接收到消息后,对消息解密。解析出其中的散列摘要和原始数据,然后再对原始数据进行一次同样的散列计算得到摘要1, 比较摘要与摘要1。如果相同则未被篡改,如果不同则表示已经被篡改。

????????在传输过程中,密文2只要被篡改,最后导致的hash与hash1就会产生不同。

????????无法解决签名问题,也就是双方相互攻击。A对于自己发送的消息始终不承认。比如A对B发送了一条错误消息,导致B有损失。但A抵赖不是自己发送的。

????????在(三)的过程中,没有办法解决交互双方相互攻击。什么意思呢? 有可能是因为A发送的消息,对A节点不利,后来A就抵赖这消息不是它发送的。

????????为了解决这个问题,故引入了签名。这里我们将(二)-4中的加密方式,与消息签名合并设计在一起。

? ? ? ?在上图中,我们利用A节点的私钥对其发送的摘要信息进行签名,然后将签名+原文,再利用B的公钥进行加密。而B得到密文后,先用B的私钥解密,然后 对摘要再用A的公钥解密,只有比较两次摘要的内容是否相同。这既避免了防篡改问题,有规避了双方攻击问题。因为A对信息进行了签名,故是无法抵赖的。

????????为了解决非对称加密数据时的性能问题,故往往采用混合加密。这里就需要引入对称加密,如下图:

????????在对数据加密时,我们采用了双方共享的对称秘钥来加密。而对称秘钥尽量不要在网络上传输,以免丢失。这里的共享对称秘钥是根据自己的私钥和对方的公钥计算出的,然后适用对称秘钥对数据加密。而对方接收到数据时,也计算出对称秘钥然后对密文解密。

????????以上这种对称秘钥是不安全的,因为A的私钥和B的公钥一般短期内固定,所以共享对称秘钥也是固定不变的。为了增强安全性,最好的方式是每次交互都生成一个临时的共享对称秘钥。那么如何才能在每次交互过程中生成一个随机的对称秘钥,且不需要传输呢?

????????那么如何生成随机的共享秘钥进行加密呢?

????????对于发送方A节点,在每次发送时,都生成一个临时非对称秘钥对,然后根据B节点的公钥 和 临时的非对称私钥 可以计算出一个对称秘钥(KA算法-Key Agreement)。然后利用该对称秘钥对数据进行加密,针对共享秘钥这里的流程如下:

????????对于B节点,当接收到传输过来的数据时,解析出其中A节点的随机公钥,之后利用A节点的随机公钥 与 B节点自身的私钥 计算出对称秘钥(KA算法)。之后利用对称秘钥机密数据。

????????对于以上加密方式,其实仍然存在很多问题,比如如何避免重放攻击(在消息中加入 Nonce ),再比如彩虹表(参考 KDF机制解决 )之类的问题。由于时间及能力有限,故暂时忽略。

????????那么究竟应该采用何种加密呢?

????????主要还是基于要传输的数据的安全等级来考量。不重要的数据其实做好认证和签名就可以,但是很重要的数据就需要采用安全等级比较高的加密方案了。

????????密码套件 是一个网络协议的概念。其中主要包括身份认证、加密、消息认证(MAC)、秘钥交换的算法组成。

????????在整个网络的传输过程中,根据密码套件主要分如下几大类算法:

????????秘钥交换算法:比如ECDHE、RSA。主要用于客户端和服务端握手时如何进行身份验证。

????????消息认证算法:比如SHA1、SHA2、SHA3。主要用于消息摘要。

????????批量加密算法:比如AES, 主要用于加密信息流。

????????伪随机数算法:例如TLS 1.2的伪随机函数使用MAC算法的散列函数来创建一个 主密钥 ——连接双方共享的一个48字节的私钥。主密钥在创建会话密钥(例如创建MAC)时作为一个熵来源。

????????在网络中,一次消息的传输一般需要在如下4个阶段分别进行加密,才能保证消息安全、可靠的传输。

????????握手/网络协商阶段:

????????在双方进行握手阶段,需要进行链接的协商。主要的加密算法包括RSA、DH、ECDH等

? ????? 身份认证阶段:

????????身份认证阶段,需要确定发送的消息的来源来源。主要采用的加密方式包括RSA、DSA、ECDSA(ECC加密,DSA签名)等。

????????消息加密阶段:

????????消息加密指对发送的信息流进行加密。主要采用的加密方式包括DES、RC4、AES等。

????????消息身份认证阶段/防篡改阶段:

????????主要是保证消息在传输过程中确保没有被篡改过。主要的加密方式包括MD5、SHA1、SHA2、SHA3等。

? ?????? ECC :Elliptic Curves Cryptography,椭圆曲线密码编码学。是一种根据椭圆上点倍积生成 公钥、私钥的算法。用于生成公私秘钥。

? ?????? ECDSA :用于数字签名,是一种数字签名算法。一种有效的数字签名使接收者有理由相信消息是由已知的发送者创建的,从而发送者不能否认已经发送了消息(身份验证和不可否认),并且消息在运输过程中没有改变。ECDSA签名算法是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。 主要用于身份认证阶段 。

? ?????? ECDH :也是基于ECC算法的霍夫曼树秘钥,通过ECDH,双方可以在不共享任何秘密的前提下协商出一个共享秘密,并且是这种共享秘钥是为当前的通信暂时性的随机生成的,通信一旦中断秘钥就消失。 主要用于握手磋商阶段。

? ?????? ECIES: 是一种集成加密方案,也可称为一种混合加密方案,它提供了对所选择的明文和选择的密码文本攻击的语义安全性。ECIES可以使用不同类型的函数:秘钥协商函数(KA),秘钥推导函数(KDF),对称加密方案(ENC),哈希函数(HASH), H-MAC函数(MAC)。

? ?????? ECC 是椭圆加密算法,主要讲述了按照公私钥怎么在椭圆上产生,并且不可逆。 ECDSA 则主要是采用ECC算法怎么来做签名, ECDH 则是采用ECC算法怎么生成对称秘钥。以上三者都是对ECC加密算法的应用。而现实场景中,我们往往会采用混合加密(对称加密,非对称加密结合使用,签名技术等一起使用)。 ECIES 就是底层利用ECC算法提供的一套集成(混合)加密方案。其中包括了非对称加密,对称加密和签名的功能。

????????ECC 是?Elliptic Curve Cryptography的简称。那么什么是椭圆加密曲线呢?Wolfram MathWorld 给出了很标准的定义: 一条椭圆曲线就是一组被? ?定义的且满足? 的点集。 ?

这个先订条件是为了保证曲线不包含奇点。

所以,随着曲线参数a和b的不断变化,曲线也呈现出了不同的形状。比如:

????????所有的非对称加密的基本原理基本都是基于一个公式 K = k*G。其中K代表公钥,k代表私钥,G代表某一个选取的基点。非对称加密的算法 就是要保证 该公式? 不可进行逆运算( 也就是说G/K是无法计算的 )。

????????ECC是如何计算出公私钥呢?这里我按照我自己的理解来描述。

? ?????? 我理解,ECC的核心思想就是:选择曲线上的一个基点G,之后随机在ECC曲线上取一个点k(作为私钥),然后根据k*G计算出我们的公钥K。并且保证公钥K也要在曲线上。

????????那么k*G怎么计算呢?如何计算k*G才能保证最后的结果不可逆呢?这就是ECC算法要解决的。

????????首先,我们先随便选择一条ECC曲线,a = -3, b = 7 得到如下曲线:

????????在这个曲线上,我随机选取两个点,这两个点的乘法怎么算呢?我们可以简化下问题,乘法是都可以用加法表示的,比如2*2 = 2+2,3*5 = 5+5+5。 那么我们只要能在曲线上计算出加法,理论上就能算乘法。所以,只要能在这个曲线上进行加法计算,理论上就可以来计算乘法,理论上也就可以计算k*G这种表达式的值。

????????曲线上两点的加法又怎么算呢?这里ECC为了保证不可逆性,在曲线上自定义了加法体系。

????????现实中,1+1=2,2+2=4,但在ECC算法里,我们理解的这种加法体系是不可能。故需要自定义一套适用于该曲线的加法体系。

? ?????? ECC定义,在图形中随机找一条直线,与ECC曲线相交于三个点(也有可能是两个点),这三点分别是P、Q、R。

? ?????? 那么P+Q+R = 0。其中0 不是坐标轴上的0点,而是ECC中的无穷远点。也就是说定义了无穷远点为0点。

????????同样,我们就能得出 P+Q = -R。 由于R 与-R是关于X轴对称的,所以我们就能在曲线上找到其坐标。

????????P+R+Q = 0, 故P+R = -Q , 如上图。

以上就描述了ECC曲线的世界里是如何进行加法运算的。

????????从上图可看出,直线与曲线只有两个交点,也就是说 直线是曲线的切线。此时P,R 重合了。

????????也就是P = R, 根据上述ECC的加法体系,P+R+Q = 0, 就可以得出 P+R+Q = 2P+Q = 2R+Q=0

????????于是乎得到 2*P = -Q (是不是与我们非对称算法的公式 K = k*G 越来越近了)。

????????于是我们得出一个结论,可以算乘法,不过只有在切点的时候才能算乘法,而且只能算2的乘法。

????????假若 2 可以变成任意个数进行想乘,那么就能代表在ECC曲线里可以进行乘法运算,那么ECC算法就能满足非对称加密算法的要求了。

????????那么我们是不是可以随机任何一个数的乘法都可以算呢? 答案是肯定的。 也就是点倍积 计算方式。

????????选一个随机数 k, 那么k * P等于多少呢?

????????我们知道在计算机的世界里,所有的都是二进制的,ECC既然能算2的乘法,那么我们可以将随机数k描 述成二进制然后计算。假若k = 151 = 10010111

????????由于2*P = -Q 所以 这样就计算出了k*P。 这就是点倍积算法 。所以在ECC的曲线体系下是可以来计算乘法,那么以为这非对称加密的方式是可行的。

????????至于为什么这样计算 是不可逆的。这需要大量的推演,我也不了解。但是我觉得可以这样理解:

????????我们的手表上,一般都有时间刻度。现在如果把1990年01月01日0点0分0秒作为起始点,如果告诉你至起始点为止时间流逝了 整1年,那么我们是可以计算出现在的时间的,也就是能在手表上将时分秒指针应该指向00:00:00。但是反过来,我说现在手表上的时分秒指针指向了00:00:00,你能告诉我至起始点算过了有几年了么?

????????ECDSA签名算法和其他DSA、RSA基本相似,都是采用私钥签名,公钥验证。只不过算法体系采用的是ECC的算法。交互的双方要采用同一套参数体系。签名原理如下:

????????在曲线上选取一个无穷远点为基点?G = (x,y)。随机在曲线上取一点k 作为私钥, K = k*G 计算出公钥。

? ?????? 签名过程:

????????生成随机数R, 计算出RG.

????????根据随机数R,消息M的HASH值H,以及私钥k, 计算出签名S = (H+kx)/R.

????????将消息M,RG,S发送给接收方。

? ?????? 签名验证过程:

????????接收到消息M, RG,S

????????根据消息计算出HASH值H

????????根据发送方的公钥K,计算 HG/S + xK/S, 将计算的结果与 RG比较。如果相等则验证成功。

? ?????? 公式推论:

????????HG/S + xK/S = HG/S + x(kG)/S = (H+xk)/GS = RG

????????在介绍原理前,说明一下ECC是满足结合律和交换律的,也就是说A+B+C = A+C+B = (A+C)+B。

????????这里举一个WIKI上的例子说明如何生成共享秘钥,也可以参考 ?Alice And Bob ?的例子。

????????Alice 与Bob 要进行通信,双方前提都是基于 同一参数体系的ECC生成的 公钥和私钥。所以有ECC有共同的基点G。

? ?????? 生成秘钥阶段:

????????Alice 采用公钥算法 KA = ka * G ,生成了公钥KA和私钥ka, 并公开公钥KA。

????????Bob 采用公钥算法 KB = kb * G ,生成了公钥KB和私钥 kb, 并公开公钥KB。

? ?????? 计算ECDH阶段:

????????Alice 利用计算公式 Q = ka * KB ?计算出一个秘钥Q。

????????Bob 利用计算公式 Q’ = kb * KA 计算出一个秘钥Q’。

? ?????? 共享秘钥验证:

????????Q = ka? KB = ka * kb * G = ka * G * kb = KA * kb = kb * KA = Q’

????????故 双方分别计算出的共享秘钥不需要进行公开就可采用Q进行加密。我们将Q称为共享秘钥。

????????在以太坊中,采用的ECIEC的加密套件中的其他内容:

????????1、其中HASH算法采用的是最安全的SHA3算法 Keccak 。

????????2、签名算法采用的是 ECDSA

????????3、认证方式采用的是? H-MAC

????????4、ECC的参数体系采用了secp256k1,? 其他参数体系 参考这里

????????H-MAC 全程叫做 Hash-based Message Authentication Code. 其模型如下:

在 以太坊 的 UDP通信时(RPC通信加密方式不同),则采用了以上的实现方式,并扩展化了。

首先,以太坊的UDP通信的结构如下:

????????其中,sig是 经过 私钥加密的签名信息。mac是可以理解为整个消息的摘要, ptype是消息的事件类型,data则是经过RLP编码后的传输数据。

????????其UDP的整个的加密,认证,签名模型如下:

椭圆曲线加密算法,即:Elliptic Curve Cryptography,简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密。

一般椭圆曲线方程式表示为:(其中a,b,c,d为系数)

y2=ax3+ bx2+cx+d

典型的椭圆曲线如:y2=x3?4×2+16

先摆一个栗子:

小米很难算到的那个数,就是公钥密码算法中的私钥(一个公钥密码算法安全的必要条件(非充分)是“由公钥不能反推出私钥”),公钥密码算法最根本的原理是利用信息的不对称性:即掌握私钥的人在整个通信过程中掌握最多的信息。

椭圆曲线加密算法是一个基于加法阶数难求问题的密码方案。 对于椭圆曲线来讲,椭圆曲线的基点就是例子里面的5,而私钥就是基点的加法阶数(例子里面的11),公钥是基点(5)进行对应阶数的加法(11次)得到的结果(55)。

简单描述就是:G * k = K (G,K公开,k保密)

上述例子相对简单,椭圆曲线加密算法里的加法建立在 “有限域上的二元三次曲线上的点”上 ,组成一个“有限加法循环群”。具体的说,这个加法的几何定义如下图,两个点的加法结果是指这两点的连线和曲线的交点关于x轴的镜像。

如果我们从某一点出发(所谓的单位元,比如正整数域的1,代表一个空间里的最基本单元),不停做自增操作(所谓群操作,比如++),枚举出整个空间的集合元素。如图:

因此给定椭圆曲线的某一点G,从G出发,不停做切线,找对称点,依次得到-2G,2G,-4G,4G,-8G,8G… 。即:当给定G点时,已知x,求xG点并不困难。反之,已知xG点,求x则非常困难。即Q = NG,N就是我们的私钥,Q就是我们的公钥。

现在我们知道了公钥(Q)和私钥(N)的生成的原理,我们在看看椭圆曲线数字签名算法(ECDSA)的过程,椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准。

私钥主要用于 签名,解密 ;公钥主要用于 验签,加密 ,可以通过私钥可以计算出公钥,反之则不行。

公钥加密:公钥加密的内容可以用私钥来解密——只有私钥持有者才能解密。

私钥签名:私钥签名的内容可以用公钥验证。公钥能验证的签名均可视为私钥持有人所签署。

通常需要六个参数来描叙一个特定的椭圆曲线:T = (p, a, b, G, n, h).

p: 代表有限域Fp的那个质数 a,b:椭圆方程的参数 G: 椭圆曲线上的一个基点G = (xG, yG) n:G在Fp中规定的序号,一个质数。 h:余因数(cofactor),控制选取点的密度。h = #E(Fp) / n。

这里以secp256k1曲线(比特币签名所使用的曲线)为例介绍一下公私钥对的产生的过成。

secp256k1的参数为:

本质上ECDSA的私钥就是一个随机数满足在曲线G的n阶里及k∈(0,n),根据Q=kG可以计算出公钥,生成的私钥一般为32字节大小,公钥通常为64个字节大小。如:

ECDSA签名算法的输入是数据的哈希值,而不是数据的本身,我们假设用户的密钥对:(d, Q);(d为私钥,Q为公钥) 待签名的信息:M; e = Hash(M);签名:Signature(e) = ( r, s)。

签名接口:

验证接口:

一个例子:

RSA目前应用最普遍,也是最为经典的一个数字签名加密算法,但是签名长,

产生密钥很麻烦,素数产生技术受限制,难以做到一次一密。

ECDSA 发展势头猛,处在上升阶段,ECDSA算法是ECC+DSA的结合体,相较于RSA数字签名算法,速度快,强度高,签名短,前景乐观。

ECDSA只能用于签名,但是有一种基于ECC的方法可以实现公钥加密

首先选好曲线Ep(a,b,G,n,h),随机选取私钥k,计算公钥:K=kG,信息被编码在点M上

加密:随机选取r,密文为(rG,M+rK)

解密:计算(M+rK)-k(rG),因为它等于(M+rK)-r(kG)=M+rK-rK=M

感谢您阅读本篇对ecdsa算法的详细介绍,如果你对ecdsa算法安全吗还不够了解,想进一步学习关于ecdsa算法的知识,可以在本站首页搜索你想知道的!



返回列表页>>> 比特币最新新闻