理解 Shamir's Secret Sharing:信任的數學
在安全領域,我們經常面臨一個悖論:有些秘密太過關鍵,無法信任給單一一個體,但如果該人無法聯繫上,這些秘密又太過重要而不能丟失。無論是需要多位主管授權的企業主密鑰,還是數位資產的家族復原計畫,亦或是技術團隊的分散式備份系統,對於「基於閾值」的信任系統的需求是普遍存在的。
Adi Shamir 是 RSA 演算法的設計者之一,他在 1979 年解決了這個問題。他開發了一種方法,將秘密拆分為多個碎片(shares),使得達到最小數量(閾值)的碎片可以重建秘密,而任何低於該閾值的數量都絕對無法揭示原始數據的任何資訊。
幾何直覺:兩點成線
要理解 Shamir's Secret Sharing (SSS) 的運作方式,我們可以從幾何學的一個基本原理開始:兩個不同的點可以確定唯一的一條直線。
想像你有一個秘密——例如數字 7。為了隱藏這個秘密,你將它放在圖表的縱軸(y-intercept)上。接著,你畫出一條通過該點的隨機直線。直線的斜率是隨機選擇的;這種隨機性正是掩蓋秘密的關鍵。
如果你將這條線上的其中一個點交給一個人,他們無法確定秘密。單個點可以讓無限多條直線通過,每條線在 y 軸上的交點都不同。對於單個碎片持有者來說,每個可能的秘密都是等可能的。
然而,一旦兩個人結合了他們的點,直線就固定下來了。有了兩個點,就只有一條可能的直線,並且可以在該直線與 y 軸的交點處精確地讀取秘密。這是一種 2-of-n 的秘密分享方案:你可以分發任意數量的點,但任何兩個點都足以進行復原。
擴展閾值:增加「彎曲度」
為了增加復原所需的碎片數量,你只需增加曲線的複雜度。雖然直線(一次多項式)需要兩個點,但拋物線(二次多項式)需要三個點才能被唯一確定。
一般而言,一個 $k$ 個碎片的閾值需要一個 $k-1$ 次的多項式:
- 2 個碎片: 一條直線(1 次)
- 3 個碎片: 一條拋物線(2 次)
- 4 個碎片: 一個三次曲線(3 次)
在實際應用中,這些點並非繪製在座標紙上,而是使用 finite-field arithmetic(有限域算術)來計算。這確保了碎片保持為整數,並防止攻擊者利用近似值或四捨五入來猜測秘密。核心屬性保持不變:除非你達到閾值 $k$,否則秘密不僅僅是「難以找到」——它在數學上是不可見的。
實際應用與實作
Shamir's Secret Sharing 不僅僅是一個理論上的好奇心;它被用於高風險環境中以消除單點故障。
分散式金鑰管理
從 Bitcoin 社群使用 3-of-5 方案來管理私鑰,到團隊分發用於次級秘密儲存庫的密碼,SSS 允許一種「民主化安全」的存取方式。正如社群從業者所指出的,這種技術允許組織在不「真正」將完整金鑰交給任何單一一個體的情況下,分發存取權限。
增強型復原流程
Ente 利用 SSS 在其