關於為 ECDSA 生成隨機數的問題
製作 SECP256K1 簽名的組成部分之一是一個隨機數,該隨機數隨後乘以生成器點,以便在進一步計算中使用。
如果我們想像 k - 是隨機數,G - 是生成點,那麼:
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,該範圍是從0x1到0xffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140(含)。由於下限如此接近 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這樣的算法從公鑰計算私鑰,然後求解隨機數,這比嘗試直接暴力破解隨機數要快很多數量級。