Bitcoin-Core

關於為 ECDSA 生成隨機數的問題

  • August 16, 2022

製作 SECP256K1 簽名的組成部分之一是一個隨機數,該隨機數隨後乘以生成器點,以便在進一步計算中使用。

如果我們想像 k - 是隨機數,G - 是生成點,那麼:

來自 Jimmy Song 的比特幣程式

k(隨機數)的長度是多少,以字節、位為單位?

但是,我試圖在比特幣核心原始碼中找到答案,但它有點難以閱讀,並且可以在那裡找到答案。

   /* Generate an ECDSA signature `noncefp` and `ndata` 
allows you to pass a * custom nonce function, passing `NULL` 
will use the RFC-6979 safe default. * Signing with a valid context, 
verified secret key * and the default nonce function should never fail. */
   
   return_val = secp256k1_ecdsa_sign(ctx, &sig, msg_hash, seckey, NULL, NULL);
   
   assert(return_val);

我不確定 k 在程式碼中的位置。

對其他事情也很好奇:

有沒有人成功複製,模仿了 k 的簽名,其中 k 是未知的?

有沒有人成功“探勘”,或暴力強制 ak 簽名?

是否可以通過在比特幣核心中實現的函式/算法隨機生成隨機數來強制 k ?(我想是 RFC-6979 什麼的)

k(隨機數)的長度是多少,以字節、位為單位?

256 位。

ECDSA 中的數字k(也稱為 nonce)必須是一個不可預測的值,與所有有效私鑰集合中的均勻隨機數無法區分。對於 secp256k1,該範圍是從0x10xffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140(含)。由於下限如此接近 0,而上限如此接近2 256,因此僅使用統一的 256 位值將始終是有效的 k,除非機率可忽略不計。

有沒有人成功複製,模仿了 k 的簽名,其中 k 是未知的?

如果你能成功猜出簽名中使用的k值,你就可以計算出它的私鑰。對於正常執行的錢包軟體,這對第三方來說是不可能的。

有沒有人成功“探勘”,或暴力強制 ak 簽名?

蠻力只適用於從非常小的範圍內選擇的糟糕生成的隨機數,這可能相當罕見。然而,在實踐中還存在其他濫用隨機數創建的情況,並已被利用。

其中之一是使用相同的私鑰對不同的消息重複使用相同的 nonce 值兩次。當被辨識時,這也允許計算私鑰。這用於攻擊 PlayStation 3 安全性(每個簽名使用相同的k值)。

本文描述了更微妙的 nonce 犯罪,以及針對它們的相當先進的攻擊。

是否可以通過在比特幣核心中實現的函式/算法隨機生成隨機數來強制 k ?(我想是 RFC-6979 什麼的)

RFC6979 描述了一種去隨機化的隨機數生成算法。稍微簡化一下,它的建議類似於使用*Hash(private_key || message)*作為隨機數。這具有第三方無法預測的特性(因為他們不知道私鑰),並且永遠不會導致在同一私鑰下重複使用不同的消息。

當以這種方式生成隨機數並且您不知道私鑰時,嘗試暴力破解是沒有希望的。使用像Pollard’s Rho這樣的算法從公鑰計算私鑰,然後求解隨機數,這比嘗試直接暴力破解隨機數要快很多數量級。

引用自:https://bitcoin.stackexchange.com/questions/114908