如何對 SSS 屏蔽共享進行未屏蔽添加?
我試圖了解在進行門檻值屏蔽時如何將 Shamir 的秘密共享算法應用於 AES。
我了解如何創建秘密和計算秘密,我現在正試圖弄清楚當你擁有股票時數學運算(AES 所需的)是如何工作的。為此,我正在閱讀以下來源:Goubin et al, Protecting AES with Shamir’s Secret Sharing Scheme。(isbn 978-3-642-23951-9 中的第 79-94 頁)
它說:添加具有未屏蔽值的股份:$$ {(x_i’, y_i’) \leftarrow (x_i,y_i \oplus u) | \forall (x_i, y_i) \in shares} $$ 在哪裡 $ u $ 是要增加的價值和 $ (x_i, y_i) $ 是原始共享。加法產生一個新的 $ (x_i’, y_i’) $ 分享。
我以這種方式在python(而不是有限域)中實現了這個:
def add_unmasked(self, shares, value): return [{'x': share['x'], 'y': share['y'] ^ value} for share in shares]
但是我看不到正確的結果,如果我有 20 個被共享的秘密,而未共享的結果是 20 個,但如果我加 1,我 80% 的時間都會得到錯誤的結果。
為了完整起見,我的程式碼:
def create_shares(self, to_create): if to_create < self.degree + 1: raise Exception('shares don\'t cover the order') coefficients = self.generate_polynomial(self.degree, self.secret) points = random.sample(range(self.finite_field), to_create) shares = [{'x': point, 'y': sum(coefficient * point ** n for n, coefficient in enumerate(coefficients))} for point in points] return shares def tell_secret(self, shares): # doing a polynomial interpolation using the basic definition. sum y * l where l is the product of x - xi / xm - xi. x is 0 in our case xs = [share['x'] for share in shares] y = 0 for share in shares: l = 1 for x in xs: if x != share['x']: l *= (- x) / (share['x'] - x) y += share['y'] * l return int(round(y))
編輯:閱讀關於有限域中運算符定義的維基百科,我發現了這個:
一個特殊情況是 GF(2),其中加法是異或 (XOR),乘法是 AND。
AES 使用 $ GF(2) $ 有限域,伽羅瓦域 $ GF(2^8) $ 所以當我的論文說: $ \oplus $ 它們表示有限域 GF(2) 的加法運算元。在我的非有限域程序中進行添加時,我的測試證實了這一點。
編輯2:
因此,我將其視為做 $ GF(2^8) $ 除了所有的股份。它使用了 XOR 這個詞,我讀過它應該是有限域中的 XOR,但是當我在我的測試程序中這樣做時,我沒有得到正確的結果。這似乎是因為至少有一個份額的 y 值隨著加法而溢出。
編輯3:
所以我在參考論文中找到了以下幾行:
我們的方案與算法的線性變換保持與布爾遮罩相同的兼容性
因此,該論文似乎在 AES 實現中提出了某種與布爾遮罩混合的 SSS。我仍然沒有完全理解它,但我正在繼續前進,也許如果我稍後再回來,我的理解會有所改善。
您要問的問題似乎是關於如何將公共(未屏蔽?)值添加到秘密共享值。我建議您稍微編輯一下這個問題,以澄清這與 AES 沒有直接關係。
除此之外,將公共值添加到秘密共享值在很大程度上取決於您使用的秘密共享方案,當然還有您正在執行它的代數結構。
秘密共享一個比特 $ b $ 使用附加秘密共享,您可以對隨機位進行採樣 $ b_1 $ 和 $ b_2 $ 受限於 $ b=b_1\oplus b_2 $ . 那麼這對股票是 $ (b_1,b_2) $ . 添加一個公開的位 $ u $ ,您只需要將其添加到其中一個共享中,例如 $ b_2 $ ,所以新股是 $ (b_1, b_2\oplus u) $ . 您可以檢查是否將這些添加(即異或)在一起,然後您會得到 $ b\oplus u $ ,所以你有效地添加了 $ u $ 到秘密。
如果您正在添加秘密共享元素 $ \mathsf{GF}(2^8) $ 而不是單個位,原理是一樣的,只是 XOR 被替換為加法 $ \mathsf{GF}(2^8) $ . 巧合的是,除了 $ \mathsf{GF}(2^8) $ 完全是按組件進行異或,但不一定是這種情況,特別是如果您使用它,例如, $ \mathsf{GF}(3^8) $ .
現在,所有這些都是為了附加秘密共享,但這不是Shamir秘密共享的工作方式。在這個方案中,秘密共享一個值 $ s $ 之中 $ n $ 有門檻的當事人 $ t $ 包括對隨機多項式進行採樣 $ f(\mathtt{X}) $ 最多學位 $ t $ , 約束為 $ f(0)=s $ ,並讓 $ i $ -第一次分享 $ s_i=f(i) $ .¹ 通過這種秘密共享方案,增加了公共價值 $ u $ 是通過讓每一方(不僅僅是一方)將此值添加到其份額中來完成的,得到 $ (f(1)+u,\ldots,f(n)+u) $ 作為股票的向量。我鼓勵您檢查為什麼這是一個有效的 Shamir 共享 $ s+u $ .
綜上所述,我認為您將添加劑與 Shamir 秘密共享混合在一起。您描述和實施的方法是為附加共享添加公共價值,但您在標題和文本 Shamir 秘密共享中提到。
¹ 在這裡,“數字” $ 0,1,\ldots,n $ 我們正在評估多項式只是表示您正在考慮的領域的不同元素的符號,例如 $ \mathsf{GF}(2^8) $ .