Public-Key

如何使用公鑰和消息簽名驗證私鑰所有權?

  • April 22, 2022

當我使用私鑰簽署消息並獲得消息簽名時,我如何能夠 - 使用相應的公鑰 - 驗證該消息/交易簽名必須是由持有私鑰的人生成的相關公鑰背後的密鑰?

我的理解是,對於私鑰/公鑰對,該技術的重點是您無法從公鑰中對私鑰進行逆向工程。那麼怎麼可能做到這一點呢?

本質上,從公鑰逆向工程私鑰與驗證某人必須擁有私鑰才能生成與公鑰對應的消息簽名之間有什麼區別?一種可能,而另一種不可能?

我將解釋涉及橢圓曲線的簽名是如何工作的。由於需要在區塊鏈上發布的簽名較小,加密貨幣大多使用橢圓曲線。

當一個只是一個大整數的私鑰映射到一個公鑰(即指定橢圓曲線上的一個點)上時,這種映射具有一定的數學性質。請注意,此映射是以“單向”的方式完成的。您可以輕鬆地從私鑰映射到公鑰橢圓曲線點,但實際上無法反轉該操作。

首先,橢圓曲線上的點在我們稱之為“加法”的運算下會形成一個阿貝爾群。這意味著你可以用點做看起來像簡單代數的事情。你可以拿分 $ A $ 和 $ B $ , 添加它們以獲得點 $ C $ ,您將能夠觀察到 $ A+B==B+A $ . 請注意,我們只定義了加減運算,不能將點與其他點“相乘”或“除”。

其次,私鑰整數到點的映射是“加法同態的”。這意味著如果你有私鑰 $ a $ 和 $ b $ , 映射到公鑰 $ A $ 和 $ B $ , 那麼公鑰 $ a+b $ 將等於兩者 $ A+B $ 並 $ C $ .

私鑰到公鑰的映射就是取一個私鑰 $ a $ 併計算公鑰 $ aG $ ,這意味著添加眾所周知的點 $ G $ 對自己 $ a $ 次。因為通過將 G 添加到自身來實際計算這個需要永遠 $ a $ 有時,有可用的數學捷徑。由於這些快捷方式的存在只是為了快速執行乘法而不是向後退並根據乘法結果確定私鑰,因此這成為單向“陷門”功能。

現在,假設我有私鑰 $ a $ 和公鑰 $ A=aG $ ,你對我提出了挑戰。你想出一個隨機的私鑰整數 $ x $ , 你要我給你一個響應整數 $ y $ 這樣您就可以驗證 $ xA==yG $ . 我只有知道私鑰才能通過你的挑戰 $ a $ ,這將允許我計算 $ y=xa $ . 這將驗證,因為那時 $ xA==xaG==yG $ .

我上面描述的有兩個缺陷。第一個是一旦我通過了挑戰,你就可以很容易地計算出我的私鑰 $ a $ 作為 $ y/x $ .

第二個缺陷是我需要你給我一個挑戰,而不是簡單地給你一個簽名而不需要和你互動。

第一個缺陷是通過包含一個“致盲因素”來解決的,它允許我在不洩露我的私鑰的情況下通過挑戰。例如,使用 Schnorr 簽名,我選擇一個隨機私鑰 $ k $ , 只顯示 $ K=kG $ ,然後問你你的挑戰 $ x $ . 然後我產生一個值 $ y $ 這樣您就可以驗證 $ xA==K+yG $ . 現在,在我揭露之後 $ y $ 要通過挑戰,你知道我只能計算 $ y $ 知道我的私鑰 $ a $ ,但你不能在不知道我的秘密致盲因子的情況下計算我的私鑰 $ k $ .

第二個缺陷是通過使用Fiat-Shamir 啟發式方法來解決的,該方法使用一個充當“隨機預言機”的函式來創建一個挑戰,該函式允許我在沒有作弊的情況下提出隨機挑戰。在 ECDSA 簽名方案的情況下,此函式輸出是從特定輸入映射的公鑰的 x 座標。在 Schnorr 簽名的情況下,該函式是加密安全散列,例如 SHA512/256。

當我使用私鑰簽署消息/交易¹
並獲得消息/交易¹簽名時,

至關重要的是,它在這兩件事中使用了不同的公鑰/私鑰對。問題的其餘部分與這兩件事中的第一件事無關。一切都是關於在第二件事中驗證簽名,對照簽名者在第二件事中使用的公鑰/私鑰對的公鑰。假定所述公鑰對驗證者可用。匹配的私鑰不是。

使用私鑰/公鑰對,該技術的重點是您不能從公鑰逆向工程私鑰

正確的。還有更多:使用公鑰不可能執行私鑰打算執行的操作。

從公鑰逆向工程私鑰與驗證某人必須擁有私鑰才能生成與公鑰對應的消息簽名之間有什麼區別?一種可能,而另一種不可能?

簽名根據此圖工作:

簽名 並通過現代教科書

  • $ 1^n $ 編碼整數 $ n $ 定義鍵的大小。在實踐中 $ n $ 是固定的和公開的。
  • $ (\mathrm{pk},\mathrm{sk}) $ 是密鑰生成算法輸出的公鑰/私鑰對 $ \mathrm{Gen} $ . 假設 $ \mathrm{sk} $ 由密鑰對的指定所有者保密,該所有者通常是執行的人 $ \mathrm{Gen} $ .
  • $ m $ 是要簽名的消息(任意位串,可能出於大小要求而保存)。
  • $ \sigma $ 是消息的簽名。它是由 $ \mathrm{sk} $ 和 $ m $ 通過簽名算法 $ \mathrm{Sign} $ .
  • $ b $ 是完整性指標,它採用兩個值之一,ValidInvalid。它是由 $ \mathrm{pk} $ , $ m $ 和 $ \sigma $ 通過驗證算法 $ \mathrm{Vrfy} $ .

簽名方案是正確的,根據圖紙, $ b $ 總是有效的。當對手給出時,它是安全的² $ \mathrm{pk} $ 以及獲得的能力 $ \sigma_i $ 對於任何 $ m_i $ 他們認為合適,無法展示 $ (m,\sigma) $ 配對 $ \mathrm{Vrfy}(\mathrm{pk},m,\sigma) $ 有效,並且 $ m\ne m_i $ 對於任何 $ i $ . 還有一些技術細節³。

令人驚訝的是,存在正確且安全的簽名方案。設計一個是長期的。但這並不比公鑰加密的可能性更令人驚訝。如果一個人最關心的是理解簽名的使用,一種選擇是承認存在這樣的簽名方案。

另一種選擇是學習一個。我建議Schnorr 簽名替代版本),該原理在某些加密貨幣中使用,可能是最簡單的,並且在隨機預言模型下對所使用的組中的離散對數問題的難度具有相對簡單的定量安全性降低這是雜湊。暴露它會使答案的長度增加三倍。


¹ 在加密貨幣上下文中,消息可能會描述交易。

² 根據選擇的消息攻擊標準下的 Existentially UnForgeable,通常是現代介紹性論述中唯一討論的標準。還有其他有用的簽名安全標準。

³ $ \mathrm{Gen} $ , $ \mathrm{Sign} $ , $ \mathrm{Vrfy} $ 並且對手被建模為機率多項式時間算法。命題是針對任何固定的 $ (\mathrm{pk},\mathrm{sk}) $ 對輸出 $ \mathrm{Gen} $ , 除非機率可以忽略不計 $ p(n) $ , 那是 $ p(n) $ 這樣對於任何多項式 $ Q(n) $ 它擁有 $ \displaystyle 0=\lim_{n\to\infty} p(n),Q(n) $ . 在實踐中 $ n $ 選擇得足夠高以使該機率實際上可以忽略不計。

引用自:https://crypto.stackexchange.com/questions/99740