龙空技术网

以太坊黑暗森林中的怪物:ECDSA和数字签名详解

元宇宙虫洞 271

前言:

今天姐妹们对“ecdsa算法特点”大致比较珍视,咱们都需要分析一些“ecdsa算法特点”的相关知识。那么小编也在网络上收集了一些关于“ecdsa算法特点””的相关内容,希望看官们能喜欢,大家快快来了解一下吧!

上周,以太坊黑暗森林中的一个怪物向我展示了自己。 在这之前的 16 小时,我在TUX听说它的存在后放下了加密的诱饵。 我预料到了,但刷新 Etherscan 并看到我所有的 Ether 都消失了仍然令人惊讶。

这个怪物正在观察以太坊在创建交易过程中的一个隐秘错误:在签署交易时重复使用一个数字。 我去寻找这个怪物,下饵,在野外看到它,发现了无法解释的踪迹。 要了解此机器人的工作原理,我们需要先查看 ECDSA 和数字签名。

ECDSA

支撑两种最大的加密货币——比特币和以太坊——是椭圆曲线数字签名算法,或 ECDSA。顾名思义,ECDSA 是一种生成数字签名的方案。这些签名是我们证明账户和资产所有权的方式。每个签名证明两件事:

您拥有一些称为私钥的秘密。每个私钥都与一个称为公钥的公知密钥相关联。您的加密“地址”是一个公钥。您使用私钥对特定消息进行签名。在我们的例子中,消息是交易。

ECDSA 之所以有效,是因为您可以轻松地使用私钥生成公钥,但不能使用公钥来导出私钥。但是,您可以在某些有限条件下使用签名来撤销私钥。这有点技术性,但请耐心听我解释。

为了生成签名,ECDSA 需要一个私钥 d、一个随机数 k 和消息的哈希值 h。它将这些与与私钥 d 相关联的公钥 Q 以及由 ECDSA 算法标准化的两个数字 G 和 n 组合在一起。这些一起用于使用以下算法计算数字签名:

r = k * G \mod n

s = \frac{h + d * r}{k} \mod n

r 和 s 一起形成数字签名。

nonce 的作用是什么?

ECDSA 签名中使用的随机数 k 至关重要。它永远不应该被透露,并且应该只使用一次。这就是为什么这个随机数也被称为 nonce,从现在开始我将在提到 k 时使用 nonce。如果攻击者知道使用了什么随机数来生成特定签名,那么他们就可以恢复用于签署该消息的私钥。通过一些代数,可以推导出以下公式:

d=(s*k-h)*r^{-1} \mod n

类似地,如果一个 nonce 在两个不同的签名中被重用,那么用于签署这些签名的私钥可以被恢复。同样,通过一些代数,我们可以从以下等式中推导出使用的随机数:

k=(h_1-h_2)*(s_1-s_2)^{-1}\mod n

有了随机数,我们就可以像上面一样恢复私钥。

那么我们如何判断一个 nonce 是否被重用了呢?

回想一下ECDSA算法中生成r的公式r = k * G mod n。鉴于 G 和 n 只是保持固定的数字,从签名到签名变化的唯一变量是随机数 k。因此,如果 k 在两条消息中重复使用,那么它们的签名将具有相同的 r,这就是为什么 k 永远不会被重复使用的原因!

考虑到这一点,我们现在知道当 ECDSA 的nonce 被重用于签署以太坊交易时要寻找什么:来自同一账户的两笔交易具有相同的 r 但不同的 s 值。我从 tux 那里听说有机器人在监视可能的此类错误,并且在周末的Hackathon中,我开始亲眼目睹。

一个快速的保证:普通最终用户不应该太担心这些攻击媒介。您无法重用随机数或将该随机数公开给公众。这是加密领域代码库的开发人员应该担心的事情,而不是您。

创建密码诱饵

我的计划很简单:为了引诱这个黑暗森林怪物,我会用相同的 r 发送两笔交易,并在该账户中留下一些 ETH 作为诱饵。如果有人在看,那么他们可以盗走我的私钥并拿走 ETH。

为了创建重复使用nonce的诱饵,我需要强制我的交易使用相同的数字签名两次。幸运的是,这并不容易做到。你不能用 MetaMask 做到这一点。通过深入研究 ethers.js(一个流行的 web3 库)的导入,我发现了它里面看起来像用于椭圆曲线加密的库。

(不要在家里尝试这个!)

我将随机数设置为 1!然后我制作了一个新的私钥并加载了 0.04 ETH 并编写了一个简单的脚本将 ETH 转移给我自己。

我快速连续运行了两次,发送了两个立即登陆链的交易。由于我的 nonce 设置为 1,这两个交易应该具有相同的 r,但不同的 s 值。一个快速的脚本证实了这一点:

既然这些交易已经包含在链上,这个账户背后的私钥现在已经泄露给任何正在观看的人。我的诱饵已经下好了。

一瞥深渊

一旦包含第二笔交易,我就立即刷新了被盗账户的 Etherscan 页面。什么也没发生;钱还在那里。在接下来的几个小时里,我再次刷新页面,越来越困惑,想知道随着时间的推移我是否犯了错误。仍然什么也没发生,我去睡觉了。

第二天早上我刷新页面并发现我的余额已经空了! 16 小时后,对一个未知账户的单笔交易盗走了我留在账户中的 0.04 ETH。

怪物抬起了头;它正在监视以太坊上有相同 的r 的交易,盗走他们的私钥,并拿走他们的钱。我很困惑,我的钱花了这么长时间才被拿走。毕竟,绝对可以通过这种方式以编程方式来盗走这些钱。为什么有人看到后不立即盗走这笔钱呢?一个答案可能是他们在等着看我是否将更多的钱转移到我的帐户中。不管怎样,我对我的实验成功微笑了,心里想,我可能永远不会认为我的私钥再次泄露是一件很酷的事情。

乍一看,这个机器人似乎也拿走了其他人的钱。

该帐户有稳定的 ETH 流从许多不同的帐户发送给它。它只发送了一次 ETH,那就是支付 3 次 ERC20 转账的 gas 费。这个账户里总共有大约 3,700 美元。

为了寻找 ECDSA nonce 重用攻击的其他实例,我编写了一个脚本来快速检查帐户的交易是否多次包含 r 值。我输入了向攻击者发送 ETH 的第二个地址,发现该帐户在 1 个以上的交易中重复使用了相同的 r。

这加强了我的信念,即该机器人正在监视以太坊以上 ECDSA nonce 重用的账户。有趣的是,这个用户有两个单独的实例,在两个不同的交易中重用了一个nonce。再一次,当他们的受害者犯了一个错误时,这个黑暗森林的生物的移动速度惊人地缓慢。受害者的钱花了几个小时才被拿走。

在此之后,我查看了接下来发送攻击者 ETH 的两个地址。令我惊讶的是,我发现这些账户向攻击者发送了他们所有的 ETH,但从未重用过 ECDSA nonce!经过调查,我发现有 20 个不同的帐户向攻击者的地址发送了一笔交易,但只有 9 个是以前重复使用 nonce 的帐户。

其他11个呢?攻击者是如何得到他们的钱的?我不确定。一个答案可能是该生物正在使用其他策略来盗走私钥,例如检查使用常用单词、短语或数字作为其私钥的帐户。还有更复杂的方法可以利用不良的随机数生成。但是,这仍然是猜测,我调查的各种方向似乎都没有给出任何明确的答案。

黑暗森林的生物可能已经现身。但它是什么或它接下来会袭击哪里仍然是个谜。

作者:bertcmiller 译者:zzzzac

标签: #ecdsa算法特点