主页 > imtokenusdt钱包 > 以太坊黑暗森林中的怪物:ECDSA 和数字签名解释

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

imtokenusdt钱包 2023-07-26 05:07:04

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

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

ECDSA

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

您有一些称为私钥的秘密。 每个私钥都与一个称为公钥的公钥相关联。 您的加密“地址”是一个公钥。

您使用您的私钥签署特定消息。 在我们的例子中,消息是交易。

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

sitehtzkw.com 以太坊账户创建_以太坊账户原理_以太坊钱包如何设置子账户

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

r = k * G \mod n

s = \frac \mod n

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

nonce的作用是什么?

ECDSA 签名中使用的随机数 k 至关重要。 它不应该被泄露,并且只应该被使用一次。 所以这个随机数也叫nonce,以后我在提到k的时候就用nonce。 如果攻击者知道用于生成特定签名的随机数,他们就可以恢复用于签署该消息的私钥。 通过一些代数,可以推导出以下公式:

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

以太坊钱包如何设置子账户_以太坊账户原理_sitehtzkw.com 以太坊账户创建

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

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 随机数被重新用于签署以太坊交易时要寻找什么:来自同一账户的两笔交易具有相同的 r 但不同的 s 值。 我从 tux 那里听说有机器人在监视像这样的可能的错误,在周末的黑客马拉松期间,我开始亲眼看到它。

快速保证:普通最终用户不应该太担心这些攻击向量。 您不能重复使用随机数或将该随机数公开给公众。 这是加密世界中代码库的开发人员应该担心的事情,而不是你。

以太坊账户原理_sitehtzkw.com 以太坊账户创建_以太坊钱包如何设置子账户

创建密码诱饵

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

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

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

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

sitehtzkw.com 以太坊账户创建_以太坊账户原理_以太坊钱包如何设置子账户

我快速连续地运行了两次,发送了两笔立即落在链上的交易。 由于我的随机数设置为 1,所以这两个交易应该具有相同的 r,但不同的 s 值。 一个快速脚本证实了这一点:

sitehtzkw.com 以太坊账户创建_以太坊钱包如何设置子账户_以太坊账户原理

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

深渊一瞥

一旦包含第二笔交易,我就刷新了被盗账户的 Etherscan 页面。 没啥事儿; 钱还在。 接下来的几个小时,我又刷新了页面,越看越糊涂,想着是不是时间长了搞错了。 还是什么都没发生,我去睡觉了。

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

怪物抬起头来; 它使用相同的 r 监视以太坊交易,窃取他们的私钥,并拿走他们的钱。 我很困惑,我的钱花了这么长时间才被拿走。 毕竟,绝对有可能通过这种方式以编程方式窃取资金。 为什么没有人看到钱后立即偷走? 一个答案可能是他们在等着看我是否将更多的钱转入我的账户。 无论如何,我对实验的成功微笑,心想,我可能永远不会认为我的私钥再次泄露是一件很酷的事。

乍一看,该机器人似乎也在收走其他人的钱。

sitehtzkw.com 以太坊账户创建_以太坊账户原理_以太坊钱包如何设置子账户

以太坊账户原理_sitehtzkw.com 以太坊账户创建_以太坊钱包如何设置子账户

这个账户有源源不断的 ETH 从许多不同的账户发送到它。 它只发送一次ETH,即支付3次ERC20转账的gas费。 这个账户总共有大约 3,700 美元。

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

sitehtzkw.com 以太坊账户创建_以太坊钱包如何设置子账户_以太坊账户原理

这强化了我的信念,即该机器人正在监控以太坊上 ECDSA 随机数重用的帐户。 有趣的是,该用户在两个不同的交易中有两个单独的实例重复使用随机数。 再一次,当受害者犯错时,黑暗森林中的生物移动速度出奇地慢。 受害者的钱花了几个小时才被取走。

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

其他11个呢? 攻击者是如何拿到钱的? 我不确定。 一个答案可能是该生物正在使用其他策略来窃取私钥,例如使用常用单词、短语或数字作为私钥的支票账户。 有更复杂的方法可以利用不良随机数生成。 然而,这仍然是猜测,我研究过的各个方向似乎都没有给出任何明确的答案。

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