Gadgetnedbrytningen i FHE || Math ∩ Programmering

Gadgetnedbrytningen i FHE || Math ∩ Programmering


På sistone har jag studerat Fully Homomorphic Encryption, vilket är den mirakulösa förmågan att utföra godtyckliga beräkningar på krypterad data utan att lära mig någon information om det underliggande meddelandet. Det är den mest omfattande privata datorlösningen som kan existera (och den finns!).

Det första FHE-schemat av Craig Gentry var baserat på idealiska galler och ansågs vara mycket komplext (jag tog mig aldrig tid att lära mig hur det fungerade). Vissa senare scheman (GSW = Gentry-Sahai-Waters) är baserade på matrismultiplikation och är begreppsmässigt mycket enklare. Ännu nyare FHE-scheman bygger på GSW eller använder det som en kärnsubrutin.

Alla dessa scheman injicerar slumpmässigt brus i chiffertexten, och varje homomorf operation ökar bruset. När bruset blir för stort kan du inte längre dekryptera meddelandet, och då och då måste du använda en process som kallas “bootstrapping” som minskar brus. Det tenderar också att vara prestandaflaskhalsen för alla FHE-scheman, och denna flaskhals är anledningen till att FHE inte anses vara praktiskt än.

För att minska bullertillväxten använder många FHE-system som GSW en teknisk konstruktion som kallas för gadgetnedbrytning. Trots det fruktansvärt vaga namnet är det en avgörande begränsning för bullertillväxt. När det dyker upp i en tidning, är det vanligtvis anmärkt som “väl känt i litteraturen”, och detaljerna du behöver för att implementera det utelämnas. Det är en av dessa ämnen.

Så jag ska ge några detaljer. Koden från det här inlägget finns på GitHub.

Binär siffra nedbrytning

För att skapa ett FHE-schema måste du tillämpa två homomorfa operationer på chiffertexter: addition och multiplikation. De flesta FHE-system tillåter en av de två operationerna trivialt. Om chiffertexterna är siffror som i RSA multiplicerar man dem som siffror och det multiplicerar de underliggande meddelandena, men addition är inte känt för att vara möjligt. Om chiffertexter är vektorer som i “Learning With Errors”-schemat (LWE) – grunden för många FHE-scheman – lägger du till dem som vektorer och det lägger till de underliggande meddelandena. (Här är “felet” i LWE synonymt med “slumpmässigt brus”, jag kommer att använda termen “brus”) I LWE och de flesta FHE-scheman döljer en chiffertext det underliggande meddelandet genom att lägga till slumpmässigt brus, och tillägg av två chiffertexter lägger till motsvarande brus. Efter för många oförminskade tillägg kommer bruset att växa så stort att det hindrar meddelandet. Så du slutar beräkna, eller så använder du en bootstrapping-operation för att minska bruset.

De flesta FHE-scheman tillåter dig också att multiplicera en chiffertext med en okrypterad konstant $ A$, men då skalas bruset med en faktor på $ A$, vilket är oönskat om $ A$ är stort. Så du måste antingen begränsa koefficienterna för dina linjära kombinationer med någon övre gräns, eller använda en version av gadgetnedbrytningen.

Den enklaste versionen av gadgetnedbrytningen fungerar så här. Istället för att kryptera ett meddelande $ m \i \mathbb{Z}$, skulle du kryptera $ m, 2m, 4m, …, 2^{k-1} m$ för ett val av $ k$, och sedan för att multiplicera $ A < 2^k$ skriver du de binära siffrorna för $ A = \sum_{i=0}^{k-2} a_ och du beräknar $k-1} a_ \sum_{i=0}^{k-1} a_i \textup{Enc}(2^im)$. Om bruset i varje kryptering är $ E$ och summering av chiffertexter summerar brus, så minskar detta trick brustillväxten från $ O(AE)$ till $ O(kE) = O(\log(A)E)$, till priset av att spåra $ k$ chiffertexter. (Att kalla bruset $ E$ är lite av ett missbruk—i verkligheten är felet samplat från en slumpmässig distribution—men förhoppningsvis förstår du min poäng).

Vissa människor kallar mappningen $ \textup{PowersOf2}(m) = m \cdot (2^0, 2^1, 2^2, \dots, 2^{k-1})$, och för den här artikelns skull låt oss kalla operationen att skriva ett tal $ A$ i termer av dess binära siffror $ \textup=(a_s,t) ={Bin}(A) a_{k-1})$ (observera att den första siffran är den minst signifikanta biten, dvs. det är en liten endian-representation). Sedan expanderar PowersOf2 och Bin en heltalsprodukt till en punktprodukt, samtidigt som potenserna 2 flyttas från den ena sidan till den andra.

$$\displaystyle A \cdot m = \langle \textup{Bin}(A), \textup{PowersOf2}(m) \rangle$$

Detta inspirerade följande “proof by meme” som jag inte kan motstå att inkludera.

Gadgetnedbrytningen i FHE || Math ∩ Programmering

Att räkna ut ett exempel, om meddelandet är $ m=7$ och $ A = 100, k=7$, då $ \textup{PowersOf2}(7) = (7, 14, 28, 56, 112, 224, 448, 896)$ och $ \textup{Bin}(A) = 0,0,$ (0,0,0,$) little-endian), och prickprodukten är

$$\displaystyle 28 \cdot 1 + 224 \cdot 1 + 448 \cdot 1 = 700 = 7 \cdot 2^2 + 7 \cdot 2^5 + 7 \cdot 2^6$$

En generaliserad prylkonstruktion

Man kan generalisera den binära siffrans uppdelning till olika baser, eller till vektorer av meddelanden istället för ett enda meddelande, eller att inkludera en delmängd av siffrorna för varierande approximationer. Jag har funderat över ett FHE-schema som klarar alla tre. I mitt sökande efter klarhet stötte jag på en trevlig artikel av Genise, Micciancio och Polyakov som heter “Building an Efficient Lattice Gadget Toolkit: Subgaussian Sampling and More”, där de anger en bra allmän definition.

Definition: För varje ändlig additiv grupp $ A$, en $ A$-grej av storlek $ w$ och kvalitet $ \beta$ är en vektor $ \mathbf{g} \in A^w$ så att vilket gruppelement som helst $ u \in A$ kan skrivas som en heltalskombination $ u = \sum_{i=1}^w g_i x_i$ där $ \mathbf{x} = (x_1, \dots , x_w)$ har norm som mest.

De huvudsakliga grupperna i mitt fall är $ A = (\mathbb{Z}/q\mathbb{Z})^n$, där $ q$ vanligtvis är $ 2^{32}$ eller $ 2^{64}$, dvs osignerade int-storlekar på datorer för vilka vi får gratis moduloperationer. I det här fallet är en $ (\mathbb{Z}/q\mathbb{Z})^n$-gadget en matris $ G \in (\mathbb{Z}/q\mathbb{Z})^{n \times w}$ och representationen $ x \in \mathbb{Z}^w$ av $ u \in (\/mathbb{mathbb{Z})^s $ u \in (\/mathbb)\{th{th} $ s $ Gx = u$.

Här är $ n$ och $ q$ fixerade, och $ w, \beta$ växlas bort för att göra det valda gadgetschemat mer effektivt (mindre $ w$) eller bättre på att minska brus (mindre $ \beta$). Ett exempel på hur detta skulle kunna fungera visas i nästa avsnitt genom att generalisera den binära siffrans uppdelning till en godtycklig bas $ B$. Detta gör att du kan använda färre siffror för att representera talet $ A$, men varje siffra kan vara så stor som $ B$ och därför är kvaliteten $ \beta = O(B\sqrt{w})$.

En vanlig konstruktion är att konvertera en $ A$-gadget till en $ A^n$-gadget med hjälp av Kronecker-produkten. Låt $ g \in A^w$ vara en $ A$-gadget av kvalitet $ \beta$. Då är följande matris en $ A^n$-gadget av storlek $ nw$ och kvalitet $ \sqrt{n} \beta$:

$$\displaystyle G = I_n \times \mathbf{g}^\top = \begin{pmatrix} g_1 & \dots & g_w & & & & & & & & \\\ & & & g_1 & \dots & g_w & & & & \\\ & & & & & & & \ddots & \dots & & & & & & &_&} &&$

Tomma mellanslag representerar nollor, för tydlighetens skull.

Ett exempel med $ A = (\mathbb{Z}/16\mathbb{Z})$. $ A$-gadgeten är $ \mathbf{g} = (1,2,4,8)$. Denna har storlek $ 4 = \log(q)$ och kvalitet $ \beta = 2 = \sqrt{1+1+1+1}$. Sedan bygger vi för en $ A^3$-gadget

\( G = I_3 \times \mathbf{g}^\top = \begin{pmatrix} 1&2&4&8&&&&&&&&& \\ &&&&1&2&4&8&&&& \\ &&&&&&&&&&&2&2&4&8 \end{pmatrix} \)

Nu givet en vektor $ (15, 4, 7) \in \mathbb{A}^3$ skriver vi den på följande sätt, där varje liten endian-representation är sammanlänkade i en enda vektor.

$$\displaystyle \mathbf{x} = \begin{pmatrix} 1\\ 1\\ 1\\ 1\\ 0\\ 0\\ 1\\ 0\\ 1\\ 1\\ 1\\ 0 \end{pmatrix}$$

Och slutligen,

\( (15, 4, 7) = G \mathbf{x} = \begin{pmatrix} 1 & 2 & 4 & 8 & & & & & & & & \\ & & & & 1 & 2 & 4 & 8 & & & & & \\ & & & & & & & & & & 1 & 2 & 4 & 8}{ pmatrix}{ 1\\1\\1\\1\\0\\0\\\1\\0\\1\\1\\1\\0 \end{pmatrix}\)

För att använda definitionen mer rigoröst, om vi var tvungna att skriva matrisen ovan som en gadget “vektor”, skulle den vara i kolumnordning från vänster till höger, $ \mathbf{g} = ((1,0,0), (2,0,0), \dots, (0,0,8)) \in A^{wn}$. Eftersom vektorn $ \mathbf{x}$ i värsta fall kan vara alla 1:or, är dess norm högst $ \sqrt{12} = \sqrt{nw} = \sqrt{n} \beta = 2 \sqrt{3}$, som påståtts ovan.

En signerad representation i bas B

Som vi har sett byter gadgetnedbrytningen reducering av brus mot en större chiffertextstorlek. Med heltal modulo $ q = 2^{32}$ kan detta finjusteras lite mer genom att använda en större bas. Istället för PowersOf2 skulle vi kunna definiera PowersOfB, där $ B = 2^b$, så att $ B$ delar $ 2^{32}$. Till exempel, med $ b = 8, B = 256$, skulle vi bara behöva spåra 4 chiffertexter. Och gadgetnedbrytningen av talet vi multiplicerar med skulle vara små siffrorna i dess bas-$ B$-representation. Kostnaden här är att den maximala posten för den sönderdelade representationen är 255.

Vi kan finjustera detta lite mer genom att använda en signerad bas-$ B$ representation. Såvitt jag vet är detta inte samma sak som vad datorprogrammerare normalt kallar ett signerat heltal, och det har inte heller något att göra med tvås komplement representation av negativa tal. I stället för de normala bas-$ B$ siffrorna $ n_i \in \{ 0, 1, \dots, B-1 \}$ för ett tal $ N = \sum_{i=0}^k n_i B^i$, väljer den signerade representationen $ n_i \in \{ -B/2, -B/2 + 1, B, s, 1, B, s, 1, B, s, 1, – 1 \}$.

Att beräkna siffrorna är något mer involverat, och det fungerar genom att förskjuta stora koefficienter med $ -B/2$, och “absorbera” effekten av den förändringen till nästa mer signifikanta siffra. T.ex. om $ B = 256$ och $ N = 2^{11} – 1$ (alla 1:or upp till den 10:e siffran), då är den osignerade little-endian bas-$ B$ representationen av $ N$ $ (255, 7) = 255 + 7 \cdot 256$. Motsvarande signerad bas-$ B$ representation subtraherar $ B$ från den första siffran och adderar 1 till den andra siffran, vilket resulterar i $ (-1, 8) = -1 + 8 \cdot 256$. Detta fungerar generellt på grund av följande “lägg till noll”-identitet, där $ p$ och $ q$ är två på varandra följande osignerade siffror i den osignerade bas-$ B$-representationen av ett tal.

$$\displaystyle \begin{align} pB^{k-1} + qB^k &= pB^{k-1} – B^k + qB^k + B^k \\\ &= (pB)B^{k-1} + (q+1)B^k \end{align}$$

Sedan om $ q+1 \geq B/2$, skulle du upprepa och föra 1:an till nästa högre koefficient.

Resultatet av allt detta är att det maximala absoluta värdet av en koefficient för den signerade representationen halveras från den osignerade representationen, vilket minskar brustillväxten till priset av en något mer komplex representation (ur implementeringssynpunkt). En annan bieffekt är att det största representativa antalet är mindre än $2^{32}-1$. Om du försöker tillämpa den här algoritmen på ett så stort antal, skulle den största siffran behöva flyttas, men det finns ingen efterföljare att bära till. Snarare, om det finns $ k$-siffror i den osignerade bas-$ B$-representationen, har det maximala antalet som kan representeras i den signerade versionen alla siffror satta till $ B/2 – 1$. I vårt exempel med $ B=256$ och 32 bitar är den största siffran 127. Formeln för det maximala representerbara heltal är $ \sum_{i=0}^{k-1} (B/2 – 1) B^i = (B/2 – 1)\frac{B^k – 1}{B-1}$.

max_digit = base // 2 - 1
max_representable = (max_digit
    * (base ** (num_bits // base_log) - 1) // (base - 1)
)

En enkel python-implementering beräknar den signerade representationen, med kod kopierad nedan, där $ B=2^b$ är baseoch $ b = \log_2(B)$ är base_log.

def signed_decomposition(
  x: int, base_log: int, total_num_bits=32) -> List(int):
    result = ()
    base = 1 << base_log
    digit_mask = (1 << base_log) - 1
    base_over_2_threshold = 1 << (base_log - 1)
    carry = 0

    for i in range(total_num_bits // base_log):
        unsigned_digit = (x >> (i * base_log)) & digit_mask
        if carry:
            unsigned_digit += carry
            carry = 0

        signed_digit = unsigned_digit
        if signed_digit >= base_over_2_threshold:
            signed_digit -= base
            carry = 1
        result.append(signed_digit)

    return result

I en framtida artikel visar jag hur gadgetnedbrytningen fungerar i en praktisk miljö som kallas nyckelbytevilket gör att man kan konvertera en LWE-chiffertext krypterad med nyckel $ s_1$ till en LWE-chiffertext krypterad med en annan nyckel $ s_2$. Denna operation ökar bruset, och därför används gadgetnedbrytningen för att minska brustillväxten. Nyckelbyte används i FHE eftersom vissa operationer (som bootstrapping) har bieffekten av att byta krypteringsnyckel.

Tills dess!





Source link

Postagens Similares

  • html సమీక్ష 05

    15 కొత్త ప్రయోగాత్మక వెబ్ కవిత్వం మరియు కళలు, మిల్క్ ఫిష్, బ్యానర్ హైవే మరియు కర్సర్ పార్క్ # నాకు ఇష్టమైనవి Source link

  • 日落 512kb 俱樂部 – Kev Quirk

    2026 年 3 月 7 日 所有美好的事情都必須結束,今天就是我的專案之一「512kb 俱樂部」的日子。 我早在 2020 年 11 月就開始了 51​​2kb 俱樂部,到現在已經有大約 5.5 年了。它已經成為一個排水溝,我準備繼續前進。從今天開始,我將不再接受對該專案的任何新提交。在撰寫本文時,有 25 個 PR 可供新提交,我將處理它們,然後停用提交拉取請求的功能。 多年來,已有近 2,000 個拉取請求,目前 512kb 俱樂部上列出了約 950 個站點。很酷,但需要管理的工作量很大 – 需要審查新提交的內容(這是源源不斷的拉取請求)、清理舊網站、更新網站等。這超出了我的時間。 我還嘗試將時間集中在其他項目上,例如 Pure Commons。 想接手嗎? 看到這樣的計畫半途而廢令人難過,但生活還是要繼續。話雖如此,如果你覺得你想接手512kb俱樂部,我們來聊聊吧, 但有一些先決條件: 我們需要互相了解。抱歉,我不會把這個專案交給我不認識的人。 您可能需要熟悉 Jekyll 和 Git。 我可能會收到很多電子郵件,其中包含提供幫助的資訊(這太棒了),但如果我們以前從未互動過,我就不會繼續接受您的善意提議。 閱讀上述內容後,如果我們彼此認識,並且您仍然感興趣,請使用下面的電子郵件按鈕,我們可以就您可能接手的事宜進行討論。透過接手,我希望你能夠: 取得所有權 512kb.club 域,因此您將承擔續約的財務責任。 擁有 GitHub 儲存庫的所有權,因此您將負責所有拉取請求、問題和任何其他與 Git 相關的事情。 負責專案的所有託管和維護 – 該網站目前託管在我的個人 Vercel…

  • Sisi ni Marafiki wa Knot || Hisabati ∩ Kupanga

    Ni Aprili Poa tena. Kwa majira machache ya kiangazi katika shule ya upili na ya chini, nilikuwa mshauri wa kambi ya siku. Nimeandika hapo awali kuhusu jinsi ilivyonisaidia kukuza ustadi wa kusimulia hadithi, lakini hivi majuzi nilifikiria tena kwa sababu, nilipokuwa nikisafisha kabati lililojaa takataka kuukuu, nilipata begi la uzi wa kudarizi. Wakati stereotypically kutumika…

  • 你怎麼知道的

    2014年12月 我讀過維爾哈杜安關於第四次十字軍東徵的編年史至少兩遍,也許三次。然而,如果我必須寫下我所記得的一切,我懷疑它會比一頁多得多。乘以幾百,當我看著我的書架時,我有一種不安的感覺。如果我對這些書的記憶如此之少,那麼閱讀所有這些書有什麼用呢? 幾個月前,當我閱讀康斯坦斯·里德(Constance Reid)撰寫的出色的希爾伯特傳記時,我找到了這個問題的答案,即使不是這個問題的答案,至少也讓我感覺更好了。她寫道: 希爾伯特對數學講座沒有耐心,因為數學講座向學生灌輸大量事實,卻沒有教他們如何提出問題並解決問題。他經常告訴他們「問題的完美表述已經是解決方案的一半」。 在我看來,這一點一直很重要,在聽到希爾伯特的證實後,我更加確信這一點。 但我最初是如何相信這個想法的呢?結合了我自己的經驗和我讀過的其他內容。那一刻我什麼都不記得了!最後我忘了希爾伯特也證實了這一點。但我對這個想法重要性的日益增強的信念仍然是我從這本書中學到的東西,即使在我忘記了我學過它之後。 閱讀和經驗可以訓練你的世界觀。即使你忘記了這段經歷或你讀過的內容,它對你的世界模型的影響仍然存在。你的頭腦就像一個已編譯的程序,但你卻失去了它的來源。它有效,但你不知道為什麼。 我從維爾哈杜安的編年史中尋找的地方不是我從中記住的東西,而是我對十字軍東徵、威尼斯、中世紀文化、攻城戰等的心智模型。這並不意味著我不能更用心地閱讀,但至少閱讀的收穫並不像看起來那麼小。 回想起來,這是顯而易見的事情之一。但這對我來說是一個驚喜,想必對任何其他因為(顯然)忘記他們讀過的東西而感到不安的人來說也是如此。 不過,意識到這一點不僅能讓你對遺忘感覺好一點。有具體的影響。 例如,閱讀和經驗通常是在發生時使用您當時的大腦狀態進行「編譯」的。同一本書在你人生的不同階段會有不同的編輯方式。這意味著重要的書籍非常值得多次閱讀。我過去常常對重讀書籍感到有些疑慮。我無意識地將閱讀與木工等工作混為一談,木工等工作必須重新做某件事就表明你第一次做錯了。而現在「已讀」這個短語似乎幾乎是格式錯誤。 有趣的是,這種意義不僅限於書籍。科技將越來越多地使重溫我們的經驗成為可能。今天,當人們這樣做時,通常是為了再次享受它們(例如,當查看旅行的照片時)或在編譯的代碼中找到某些錯誤的根源(例如,當斯蒂芬·弗萊(Stephen Fry)成功地記住了阻止他唱歌的童年創傷時)。但隨著記錄和回放生活的技術不斷進步,人們在沒有任何目標的情況下重溫經歷可能會變得很常見,只是為了再次從中學習,就像重讀一本書時一樣。 最終,我們不僅能夠回放體驗,還能夠索引甚至編輯它們。因此,儘管不知道如何知道事情似乎是人類的一部分,但事實可能並非如此。 謝謝 感謝 Sam Altman、Jessica Livingston 和 Robert Morris 閱讀本文的草稿。 Source link

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *