--基于格密碼全同態(tài)加密的數(shù)學(xué)基礎(chǔ)
此情此景,我想先吟詩(shī)二首:
從文學(xué)的角度看,以上兩首詩(shī)比李白寫的稍微遜色一點(diǎn),不過(guò),從數(shù)學(xué)角度來(lái)看,簡(jiǎn)直可以獲得諾貝爾數(shù)學(xué)領(lǐng)域的文學(xué)獎(jiǎng)(可惜了,目前還沒(méi)有這個(gè)獎(jiǎng)項(xiàng))。
以上是定場(chǎng)詩(shī),本文旨在盡量少用數(shù)學(xué)公式的情況下,解釋清楚FHE(Fully Homomorphic Encryption,全同態(tài)加密)相關(guān)的數(shù)學(xué)基礎(chǔ)。話不多說(shuō),我們繼續(xù)。
一點(diǎn)定乾坤
當(dāng)時(shí)的故事是這樣的:
一個(gè)陽(yáng)光明媚的下午,初三(一)班剛剛上完第二節(jié)數(shù)學(xué)課,老師講的是函數(shù)相關(guān)的內(nèi)容。陽(yáng)光灑在我課桌上,溫暖的光線散射到眼睛里,而我卻盯著老師講的拋物線函數(shù)圖像,一動(dòng)也不動(dòng)。
當(dāng)時(shí)我本子上的圖像是下面這樣的:
發(fā)呆的時(shí)候,我們班里的泰勒同學(xué)去完廁所從教室前門走了進(jìn)來(lái),我的座位正沖門口,可能是他發(fā)現(xiàn)了我在發(fā)呆,就徑直走了過(guò)來(lái),跟我說(shuō):
“干嘛呢?大白天的,發(fā)什么呆啊?”
“發(fā)呆跟白天晚上有關(guān)系嗎?”我應(yīng)道,“別打擾我,我在思考一個(gè)深?yuàn)W的問(wèn)題!”
“什么問(wèn)題啊?別思考了,我跟你說(shuō)個(gè)事兒,我會(huì)魔法你知道嗎?”泰勒不僅沒(méi)走開(kāi),反而挨著我坐了下來(lái)。
“別扯了,我們又不是幼兒園的小朋友,都初三了,誰(shuí)還相信魔法?!”我有點(diǎn)不耐煩,打算繼續(xù)思考我的深?yuàn)W的問(wèn)題。
“你別不信啊,我眼睛有透視的能力”泰勒有點(diǎn)不依不饒,繼續(xù)說(shuō)道:
“不信的話,你把你的草稿本合起來(lái),別讓我看到,我可以在不看你本子的前提下,知道你畫的是什么函數(shù)”
“滾一邊兒去,我沒(méi)那閑工夫跟你玩兒”因?yàn)樘├沾驍辔业乃悸罚脍s緊轟他走。
“實(shí)在不信的話,我們?cè)囋嚥痪椭懒藛幔浚 碧├詹粌H沒(méi)走,還挪了一下凳子,離我更近了。
“好吧,好吧,如果不靈的話,有多遠(yuǎn)滾多遠(yuǎn),行不行?”我說(shuō)。
“沒(méi)問(wèn)題,這樣,你把你的函數(shù)圖像用兩本書(shū)遮起來(lái),兩書(shū)之間只留一個(gè)點(diǎn),我可以根據(jù)這一個(gè)點(diǎn)的信息得到整幅函數(shù)圖像!”泰勒顯得有點(diǎn)興奮。我自已也有點(diǎn)躍躍欲試。
“行啊,沒(méi)問(wèn)題,就給你留一個(gè)點(diǎn),看你怎么猜!”我心想,別說(shuō)一個(gè)點(diǎn),就是給你十個(gè)點(diǎn),你能猜出來(lái)的話,我也算你贏。
我邊說(shuō)邊把草稿本打開(kāi),用語(yǔ)文書(shū)和英語(yǔ)書(shū)遮住,中間只留了一個(gè)小縫兒,我自己剛剛能看到橫軸上‘1’對(duì)應(yīng)的那一點(diǎn)點(diǎn)圖像。
“行了,我準(zhǔn)備好了,猜吧!”我說(shuō)。
“好,現(xiàn)在正式開(kāi)始,不過(guò)我要先問(wèn)你幾個(gè)問(wèn)題”泰勒說(shuō)。
“問(wèn)吧,問(wèn)吧!”我說(shuō)。
“請(qǐng)問(wèn),在這個(gè)點(diǎn),這個(gè)函數(shù)的一階導(dǎo)數(shù)是多少?”泰勒正式開(kāi)始了他莫名其妙的發(fā)問(wèn)。
“一階導(dǎo)數(shù)?是2”我略作思考,回答道。
“二階導(dǎo)數(shù)呢?”泰勒繼續(xù)問(wèn)。
“還是2”我腦筋微轉(zhuǎn),答道。
“三階導(dǎo)數(shù)呢?”泰勒繼續(xù)問(wèn)。
“三階導(dǎo)數(shù)啊?是0”我快速說(shuō)道。
“四階導(dǎo)數(shù)呢?”泰勒還要問(wèn),沒(méi)有停下來(lái)的意思。
“哎呀,你煩不煩,三階導(dǎo)數(shù)后面所有的導(dǎo)數(shù)都是0”我說(shuō)。
這時(shí),只見(jiàn)泰勒嘴角上揚(yáng),微微一笑,說(shuō):“你畫的函數(shù)是,對(duì)不對(duì)啊?!”
“這怎么可能?!”我很是驚訝,僅僅通過(guò)一個(gè)點(diǎn)的信息,泰勒怎么會(huì)知道整幅函數(shù)圖像的呢?
只見(jiàn)泰勒那時(shí)的表情,得意洋洋,心滿意足,開(kāi)始手舞足蹈。。。
我還是不信,懷疑剛才泰勒偷看到了我的草稿本兒。所以我又緊接著測(cè)試了,甚至還測(cè)試了
,還有很多其它很復(fù)雜的函數(shù),令人震驚的是,這些函數(shù),無(wú)一例外,泰勒都只通過(guò)一個(gè)點(diǎn)就猜出來(lái)了。
“怎么樣?這回相信我會(huì)魔法了吧?!”泰勒見(jiàn)我不解,輕飄飄撂下這句話就走開(kāi)了,只留下凌亂的我,張著嘴巴,一臉懵。。。
“還真是啊,‘一點(diǎn)定乾坤’,難道說(shuō)的就是這個(gè)?”我不禁自言自語(yǔ)。
讀到這里,聰明的同學(xué)可能早就可以拆穿泰勒所謂的魔法了,不過(guò)我實(shí)在是愚鈍,我們繼續(xù)往下看。。。
一時(shí)含永遠(yuǎn)
泰勒同學(xué)前腳剛走,我的另外一個(gè)叫傅里葉的同學(xué)就跑了過(guò)來(lái),他好像是看到了我和泰勒玩的游戲,跟我說(shuō):
“泰勒那哪叫魔法啊,我會(huì)的才是真正的魔法,我可以讓時(shí)間停止,讓瞬間變永恒”
“你跟泰勒一個(gè)德性,凈扯玄乎兒的,把我當(dāng)幼兒園小朋友耍”我還在琢磨剛剛泰勒是怎么做到的。
“你不相信的話,我們也做個(gè)游戲試試”傅里葉不想放棄展示他的魔法。
“沒(méi)問(wèn)題,直接開(kāi)始吧,你說(shuō)怎么玩?”我說(shuō)。
“好,我的第一個(gè)問(wèn)題是,當(dāng)的時(shí)候,函數(shù)的值是多少?”見(jiàn)我同意玩,傅里葉也是開(kāi)門見(jiàn)山,一下子問(wèn)出了第一個(gè)問(wèn)題,其實(shí),也是唯一的一個(gè)問(wèn)題。
我?jiàn)^筆疾書(shū),畢竟x是個(gè)e指數(shù),還包含三角函數(shù)的角度,但是,我真正計(jì)算才發(fā)現(xiàn),根本用不到筆算,口算就可以。我都一一回答了。當(dāng)然,在這過(guò)程中,我把本子捂得很緊,沒(méi)敢讓他偷看一眼。
“我知道了,你的函數(shù)是,對(duì)不對(duì)啊!”傅里葉得意的問(wèn)。
“我K,你是怎么知道的?!,難道傳說(shuō)中的‘一時(shí)含永遠(yuǎn)’,說(shuō)的就是你?!”我被徹底震驚了。
。。。
。。。
。。。
好吧,我承認(rèn),泰勒和傅里葉不是我的同學(xué),上面的故事都是編的。我也是實(shí)在編不下去了,很多聰明的同學(xué)也早就發(fā)現(xiàn)了泰勒和傅里葉的秘密。
泰勒的秘密就是:
對(duì)于任何一個(gè)光滑函數(shù),都可以表示為多項(xiàng)式的形式,而多項(xiàng)式的系數(shù)可以通過(guò)某一點(diǎn)的導(dǎo)數(shù)獲得。
是的,你沒(méi)看錯(cuò),一個(gè)點(diǎn)竟然蘊(yùn)含了一個(gè)函數(shù)的所有信息。
傅里葉的秘密是:
對(duì)于任何一個(gè)光滑函數(shù),都可以表示為三角函數(shù)累加(積分)的形式,而每一項(xiàng)的系數(shù)可以通過(guò)多個(gè)點(diǎn)的自變量和因變量對(duì)兒(x, f(x))獲得。
是的,你沒(méi)看錯(cuò),我們手機(jī)里的歌曲,不管你播不播放,他總是呆在那里,不曾改變。一個(gè)隨時(shí)間變化的信號(hào),經(jīng)過(guò)傅里葉變換之后,時(shí)間將消失,音樂(lè)會(huì)上一段美妙的音樂(lè),不過(guò)是樂(lè)譜的再一次重復(fù),而無(wú)論重復(fù)多少次,樂(lè)譜從未發(fā)生絲毫改變。
以上被稱為“感覺(jué)第一定理”。
對(duì)于喜歡看公式的同學(xué)(對(duì)于不喜歡看數(shù)學(xué)公式的同學(xué),直接跳過(guò)公式部分,絲毫不用擔(dān)心會(huì)影響你對(duì)本文的理解),就是:
泰勒公式一句話描述:就是用多項(xiàng)式函數(shù)去逼近光滑函數(shù)。
傅里葉變換一句話描述:將用一般多項(xiàng)式表示的時(shí)域的信號(hào),變成頻域的信號(hào)(這句不懂沒(méi)關(guān)系,看完后面就懂了)。
你在其它地方看到的傅里葉變換可能是下面的樣子:
那是因?yàn)闅W拉這位同學(xué)的存在,可以把e指數(shù)變成三角函數(shù)的形式。
歐拉公式:
所以,我總結(jié)下來(lái),就是,對(duì)于任何一個(gè)函數(shù),都可以用一些簡(jiǎn)單的東西的線性組合得到。這里面提到的簡(jiǎn)單的東西,就可以認(rèn)為是搭積木的一個(gè)個(gè)小積木塊,用數(shù)學(xué)的語(yǔ)言,小積木塊就是函數(shù)的基。用線性代數(shù)的語(yǔ)言,小積木塊就是單位向量。而具體的函數(shù),就是用小積木塊搭出來(lái)的各種形狀的積木,以及用單位向量組成的一般向量。
以上被稱為“感覺(jué)定理-2”
彎路走的快
稍作休息,我又可以繼續(xù)編故事了,還是續(xù)集。
傅里葉同學(xué)說(shuō)完答案,同樣留下一頭霧水的我,瀟灑的走開(kāi)了。當(dāng)時(shí),我腦袋里真是一團(tuán)漿糊,泰勒同學(xué)的秘密還沒(méi)搞懂,又來(lái)一個(gè)傅里葉的秘密。秘密加秘密,我就更摸不著頭腦了。
正當(dāng)我一籌莫展之際,我的第三位同學(xué)-凱萊出現(xiàn)在了我的面前。還沒(méi)等我張口請(qǐng)教,凱萊就發(fā)話了:
“泰勒和傅里葉的三腳貓功夫,有啥了不起的,在我看來(lái),不就是多項(xiàng)式的兩種表示形式而已。”
“多項(xiàng)式,我知道,不過(guò),我只知道一種形式,另外一種是啥?”我問(wèn)。
凱萊,不像泰勒和傅里葉,他舉止優(yōu)雅,陣腳不亂,簡(jiǎn)稱“矩陣”(sorry,這是個(gè)諧音梗)。
“不用著急,聽(tīng)我給你慢慢說(shuō)”凱萊搬了自己的凳子來(lái),輕坐在我旁邊。
你看啊,我們一般見(jiàn)到的多項(xiàng)式是下面這樣的,叫多項(xiàng)式的系數(shù)表示法。
這其中的就是多項(xiàng)式的系數(shù),所以叫“系數(shù)(coefficient)表示法”,沒(méi)錯(cuò),數(shù)學(xué)就是這么直白。
除了系數(shù)表示法之外,還有一種,叫“點(diǎn)值表示法(point-value representation)”,顧名思義,就是用這個(gè)多項(xiàng)式上的點(diǎn),以及這點(diǎn)對(duì)應(yīng)的值來(lái)表示。
比如,上面的多項(xiàng)式,用點(diǎn)值表示法,就是:
看到這里,我就有點(diǎn)不太理解了,為啥點(diǎn)值表示法也能代表這個(gè)多項(xiàng)式呢?凱萊,不緊不慢,耐心解釋道:
你看啊,點(diǎn)值表示法里面的每一對(duì)點(diǎn)值,是不是表示下面一個(gè)等式,比如,第一對(duì)兒點(diǎn)值,表示的就是下面的一個(gè)等式。
第二對(duì)兒點(diǎn)值對(duì)應(yīng)的是下面的等式:
從點(diǎn)值表示法來(lái)看,本來(lái)在一個(gè)平面上有無(wú)數(shù)條曲線,每次確定一個(gè)點(diǎn),就要求我們想要的曲線必須經(jīng)過(guò)這個(gè)點(diǎn),當(dāng)我們確定的點(diǎn)的數(shù)量和這條曲線的次數(shù)(就是上面式子中的n)相同時(shí),我們就找到了經(jīng)過(guò)我們指定所有點(diǎn)的唯一一條曲線。這是“感覺(jué)定理-3”
這時(shí),凱萊好像看出了我的心思,說(shuō):
“瞎想什么啊,太難理解了,我們初中生,剛學(xué)過(guò)矩陣,用矩陣表示比你那個(gè)‘真感情’容易多了!”
“什么意思啊?”我還是不太理解。
“你看啊。。。”凱萊又開(kāi)始娓娓道來(lái):
上面用點(diǎn)值表示法表示的多項(xiàng)式,每個(gè)點(diǎn)值對(duì)兒都對(duì)應(yīng)一個(gè)方程,如果我們把他們組合到一起,寫成矩陣的形式,不就是下面這個(gè)樣子嗎:
點(diǎn)值表示法,就是上面三個(gè)矩陣,第1個(gè)和第3個(gè),分別表示“點(diǎn)”和“值”,第2個(gè)矩陣是多項(xiàng)式的系數(shù)。當(dāng)其中第1個(gè)和第3個(gè)矩陣都確定的情況下,第2個(gè)系數(shù)矩陣其實(shí)也就確定了。所以,從這個(gè)角度看,點(diǎn)值表示法和系數(shù)表示法,只是同一個(gè)函數(shù)的兩種表示方式,就好像同一個(gè)函數(shù)既可以按泰勒同學(xué)的方式展開(kāi),也可以按傅里葉同學(xué)的方式展開(kāi),兩種方式描述的其實(shí)是一個(gè)東西。
就好像光的波粒二象性似的,泰勒同學(xué)強(qiáng)調(diào)的是粒子性,而傅里葉同學(xué)強(qiáng)調(diào)的是波動(dòng)性。或者說(shuō),系數(shù)表示法強(qiáng)調(diào)的是函數(shù)的波動(dòng)性,點(diǎn)值表示法更多體現(xiàn)函數(shù)的粒子性。此為“感覺(jué)定理-4”.
凱萊同學(xué)啰啰嗦嗦的說(shuō)了半天,我也不知道說(shuō)了些什么東西,就問(wèn):
“凱萊,你說(shuō)的點(diǎn)值法,我是聽(tīng)懂了,可我沒(méi)看出點(diǎn)值法有啥用處啊”
“這個(gè)用處可就太大了,可以加速多項(xiàng)式乘法!”凱萊說(shuō)。
你看啊,比如,我們有兩個(gè)用系數(shù)表示法表示的多項(xiàng)式:
那么這兩個(gè)多項(xiàng)式的乘法結(jié)果的計(jì)算過(guò)程如下所示:
這個(gè)多項(xiàng)式乘法的復(fù)雜度是,另外還要注意的是,“多項(xiàng)式乘法”中的“乘法”兩個(gè)字非常容易產(chǎn)生誤導(dǎo)作用,給人一種真的是普通乘法的錯(cuò)覺(jué),其實(shí),多項(xiàng)式的乘法操作,實(shí)際上就是卷積運(yùn)算,這一點(diǎn)一定要謹(jǐn)記。
“卷積?有什么特殊的呢?這和點(diǎn)值表示法有啥關(guān)系啊?”我還是似懂非懂的問(wèn)。
“別著急啊,還記得剛剛走的傅里葉同學(xué)嗎?他剛剛使用的秘密武器就是傅里葉變換,還記得嗎?”凱萊問(wèn)我。
“當(dāng)然記得,傅里葉變換可以讓時(shí)間消失的,太厲害了,可以將時(shí)域的信號(hào),變成頻域的信號(hào)!”我說(shuō)。
“完全正確!”凱萊對(duì)我的回答非常滿意,他接著說(shuō):
“多項(xiàng)式的乘法(也就是卷積運(yùn)算),可以先將兩個(gè)多項(xiàng)式分別做傅里葉變換,變完之后的兩個(gè)式子,直接對(duì)應(yīng)項(xiàng)相乘,對(duì)應(yīng)項(xiàng)相乘完之后的結(jié)果再做傅里葉逆變換,得到的結(jié)果就是兩個(gè)原始多項(xiàng)式的乘法結(jié)果!!!”凱萊興奮的嚷道。
“這個(gè)我知道,這不就是卷積定理嘛!卷積定理說(shuō)的是,在一個(gè)域的相乘等于另一個(gè)域的卷積,用式子表示,就是下面這樣子的”我補(bǔ)充道。
“可是,這個(gè)和你前面提到的矩陣有什么關(guān)系啊?!又和多項(xiàng)式的點(diǎn)值表示法有什么關(guān)系啊?!”我還是沒(méi)完全理解凱萊的意思。
“不用著急,這兩個(gè)問(wèn)題很快你就明白了,只需最后一步!”凱萊還是慢條斯理的樣子。
“最后一步?什么最后一步啊?”我問(wèn)。
你看啊,其實(shí)啊,點(diǎn)值表示法有個(gè)非常大的好處,我之前沒(méi)提到,就是:
對(duì)于用點(diǎn)值表示法表示的兩個(gè)多項(xiàng)式的乘法(實(shí)際是卷積),可以直接對(duì)應(yīng)項(xiàng)相乘即可,即,
“我知道了,凱萊,原來(lái)復(fù)雜度為的多項(xiàng)式乘法運(yùn)算,復(fù)雜度降低成
了”我好像發(fā)現(xiàn)了什么新大陸,也吼了起來(lái)。
“不對(duì)啊,好像哪里不對(duì)啊,這個(gè)復(fù)雜度的降低要想實(shí)現(xiàn),需要先把系數(shù)表示法變成點(diǎn)值表示法才行啊!,這個(gè)從系數(shù)轉(zhuǎn)點(diǎn)值的復(fù)雜度也是啊,你這搞半天不是瞎搞了嗎!本來(lái)可以有直行的路可以到達(dá),你這越走越遠(yuǎn)啊!”我剛剛發(fā)現(xiàn)的新大陸瞬間又不香了,滿臉狐疑的看著凱萊。
“不對(duì)啊,好像哪里不對(duì)啊,這個(gè)復(fù)雜度的降低要想實(shí)現(xiàn),需要先把系數(shù)表示法變成點(diǎn)值表示法才行啊!,這個(gè)從系數(shù)轉(zhuǎn)點(diǎn)值的復(fù)雜度也是啊,你這搞半天不是瞎搞了嗎!本來(lái)可以有直行的路可以到達(dá),你這越走越遠(yuǎn)啊!”我剛剛發(fā)現(xiàn)的新大陸瞬間又不香了,滿臉狐疑的看著凱萊。
“你別著急啊,你再仔細(xì)看看,你說(shuō)的沒(méi)錯(cuò),如果是一般的系數(shù)變點(diǎn)值,復(fù)雜度確實(shí)降不下來(lái),可是,如果我取得點(diǎn)是一些特殊的點(diǎn)的話,情況就完全不一樣啦”凱萊繼續(xù)給我解釋,不緊不慢。
“取什么樣的點(diǎn),才能降低復(fù)雜度呢?哦!我知道了,復(fù)數(shù)域的單位根,復(fù)數(shù)域的單位根,復(fù)數(shù)域的單位根!”我連續(xù)說(shuō)了三遍,生怕凱萊聽(tīng)不清楚。
在復(fù)數(shù)域內(nèi),方程有個(gè)根,就叫單位根,這些根分別是:
就是前面傅里葉同學(xué)表演“一時(shí)含永遠(yuǎn)”魔法的時(shí)候用的那幾個(gè)點(diǎn)!!這幾個(gè)點(diǎn)太好了,口算就能知道對(duì)應(yīng)的函數(shù)值,這樣的話,系數(shù)到點(diǎn)值的轉(zhuǎn)換就簡(jiǎn)單多了。
“是的,你終于發(fā)現(xiàn)了傅里葉變換的另外一個(gè)秘密,就是傅里葉變換,其實(shí)就是多項(xiàng)式的系數(shù)轉(zhuǎn)點(diǎn)值,當(dāng)然,我們考慮的是離散的傅里葉變換(DFT)”凱萊繼續(xù)說(shuō)道。
“嗯,后面我就知道了,DFT有個(gè)快速算法,叫FFT,F(xiàn)FT的計(jì)算復(fù)雜度是看到了希望,我又開(kāi)心了起來(lái)。
為了防止忘記,我在心里又重新梳理了一下多項(xiàng)式乘法的過(guò)程:
多項(xiàng)式乘法本質(zhì)是卷積運(yùn)算
卷積運(yùn)算可以分三步:
a. 先把兩個(gè)多項(xiàng)式從系數(shù)表示變成點(diǎn)值表示,這一步就是DFT,可以用FFT加速,F(xiàn)FT采用分治法,可以將一根很長(zhǎng)的木棍兒每次都折半,這樣遞歸下去,就可以降低計(jì)算復(fù)雜度。FFT選用的是單位根,NTT選用的是原根,目的一樣,為了加速DFT, 相比于FFT,NTT還便于取模運(yùn)算。
b. 然后,將用點(diǎn)值形式的兩個(gè)多項(xiàng)式,對(duì)應(yīng)項(xiàng)相乘,就得到了最終結(jié)果的點(diǎn)值表示形式。
c. 最后,還需要把最終結(jié)果的點(diǎn)值表示變回系數(shù)表示
“前幾步上面都提到了,我也理解了,可這最后一步是怎么做到了?”雖然大部分的內(nèi)容我理解了,可再三回憶,最后一步確實(shí)沒(méi)聽(tīng)凱萊說(shuō)過(guò)。
“哎呀,這還不簡(jiǎn)單嗎?提示你一下,看看多項(xiàng)式的矩陣表示形式,對(duì)了,不用往上翻了,我們?cè)賹懸槐椋褪窍旅娴臉幼印眲P萊嘿嘿一笑:
還是原來(lái)的配方,還是熟悉的味道。點(diǎn)值表示變回系數(shù)表示的過(guò)程,不就是已知上面的第1個(gè)矩陣和第3個(gè)矩陣,求中間的系數(shù)矩陣嘛?!
“原理我貌似有點(diǎn)懂了,可是,具體怎么求啊,我線性代數(shù)也學(xué)的不好”我繼續(xù)追問(wèn)凱萊,凱萊畢竟是矩陣?yán)碚摰拇髱熂?jí)人物,這點(diǎn)小問(wèn)題應(yīng)該難不倒他。果然,還不到1秒鐘的時(shí)間,凱萊就發(fā)話了:
“這個(gè)問(wèn)題嘛,等式兩邊都乘上第1個(gè)矩陣的逆矩陣就可以了,注意啊,是“矩陣的逆:”,不是”矩陣的轉(zhuǎn)置:”,這個(gè)千萬(wàn)別混淆了”凱萊細(xì)心的提醒我。
“知道啦,不過(guò),矩陣的逆,復(fù)雜度可很大啊,是,你這又是南轅北轍啊?!”我又有被凱萊耍了的感覺(jué)。
“你說(shuō)的沒(méi)錯(cuò),上面的第一個(gè)矩陣,是一個(gè)特殊的矩陣,叫范德蒙矩陣,一般的范德蒙矩陣的逆,運(yùn)算復(fù)雜度也是,不過(guò),但是,如果我們按照傅里葉同學(xué)的思路,搞出來(lái)的這個(gè)范德蒙矩陣是特殊中的特殊,它的逆矩陣,就是矩陣中的每個(gè)元素的共軛,再除以n,就是這么簡(jiǎn)單,哎喲,就是這么巧合,你說(shuō)神奇不神奇”凱萊難得的大笑起來(lái)。用式子表示,就是下面這個(gè)樣子的:
這個(gè)矩陣的逆,就是:
“原來(lái)如此,原來(lái)如此啊,如果我記得沒(méi)錯(cuò)的話,點(diǎn)值到系數(shù)的變換過(guò)程就是傳說(shuō)中的傅里葉逆變換,也叫IDFT,這個(gè)也有加速版本的IFFT。”我終于恍然大悟,“彎路走的快”,誠(chéng)不欺我,有圖為證。
故事講到這里,我不禁又想起了最開(kāi)始的兩首詩(shī),史上最富含數(shù)學(xué)知識(shí)的文學(xué)作品,名副其實(shí)。不過(guò),看標(biāo)題,內(nèi)容是同態(tài)加密啊,故事都講到這兒了,嘚啵嘚啵嘮半天嗑,咋同態(tài)加密的影兒都沒(méi)看著啊?!
別著急,這是同態(tài)加密的上篇,我們稍作休息,請(qǐng)等待后面的精彩故事。
此情此景,我想再吟詩(shī)二首:
話說(shuō)上篇我們了解到了很多非常重要的內(nèi)容:
多項(xiàng)式從系數(shù)表示變成點(diǎn)值表示的過(guò)程,就是離散傅里葉變換(DFT/FFT)。
多項(xiàng)式從點(diǎn)值表示變成系數(shù)表示的過(guò)程,就是離散傅里葉逆變換(IDFT/IFFT)。
多項(xiàng)式的乘法,本質(zhì)是卷積運(yùn)算,一次卷積運(yùn)算可以分為三步:Convolution=FFT->multiply->IFFT,即卷積定理表達(dá)的內(nèi)容。
以上三種場(chǎng)景,都有相應(yīng)的矩陣操作與之對(duì)應(yīng)。原因是:一個(gè)多項(xiàng)式的點(diǎn)值表示和一個(gè)線性方程組對(duì)應(yīng),線性方程組又和一個(gè)矩陣乘法運(yùn)算對(duì)應(yīng),這樣多項(xiàng)式的乘法就可以轉(zhuǎn)換成FFT相關(guān)的計(jì)算。這一點(diǎn)非常重要,是理解FHE的關(guān)鍵所在。
仔細(xì)思考上篇中討論的內(nèi)容,加上上面幾點(diǎn)提示,這樣我們就把FHE相關(guān)的幾個(gè)非常重要的概念,以及這些概念之間的關(guān)系就搞清楚了,此時(shí),我們的腦海里應(yīng)該出現(xiàn)以下幾個(gè)概念,并且這些概念不再是獨(dú)立的孤島,而是腦海里一片廣闊的大陸:泰勒公式,多項(xiàng)式,系數(shù)表示法,點(diǎn)值表示法,DFT,F(xiàn)FT,卷積,卷積定理,線性方程組,矩陣,矩陣的逆。
好,收拾行囊,我們繼續(xù)趕路,在正式向FHE山頂發(fā)起沖鋒前,我們有必要加深一下對(duì)傅里葉變換的理解,如下圖所示:
仔細(xì)查看上圖。。。在觀察這段時(shí)間里的某個(gè)時(shí)刻,一道金光從腦海劃過(guò):為什么時(shí)間消失了?!我們感知到的隨著時(shí)間流淌的宇宙,進(jìn)行傅里葉變換后會(huì)怎樣?我們又該怎么選擇傅里葉變換的旋轉(zhuǎn)因子(twiddle factor)?如果你的腦海沒(méi)有金光劃過(guò),可以先閱讀一下。
如果腦海里實(shí)在是沒(méi)有金光劃過(guò),也沒(méi)關(guān)系,不會(huì)影響我們最終站上FHE的山頂。我們繼續(xù)。。。
在FHE領(lǐng)域,我們可能會(huì)反復(fù)看到一句話:“FHE是基于格密碼學(xué)的”。這句話很簡(jiǎn)短,既然反復(fù)看到,說(shuō)明應(yīng)該很重要,可是,我從這句話里面又看不出什么東西,每個(gè)字我都認(rèn)識(shí),但就是不知道整句話什么意思。什么道理都懂,仍然過(guò)不好一生。不用著急,我們慢慢拆解:
首先,這里面最難懂的可能是“格”這個(gè)字,于是,我們就百度里一下,“格”是這么定義的:
“ “格”是一種特殊的偏序集。”
也很簡(jiǎn)短,不過(guò)不出意外,還是每個(gè)字都認(rèn)識(shí),但仍然不明白整句話說(shuō)的是啥意思。按道理,既然名字叫“格”,應(yīng)該跟“格子”有關(guān)系啊?!
于是,我們繼續(xù)查找FHE相關(guān)的資料,除了“格”這個(gè)東西,經(jīng)常出現(xiàn)的還有“環(huán)”這個(gè)概念,于是百度之,“環(huán)”定義的第一個(gè)條件是:
“ 集合R在+運(yùn)算下構(gòu)成阿貝爾群” 此外還有“理想(Ideal)”兩個(gè)字也出現(xiàn)在了附近。
也很簡(jiǎn)短,不過(guò)不出意外,還是每個(gè)字都認(rèn)識(shí),但仍然不明白整句話說(shuō)的是啥意思。按道理,既然名字叫“環(huán)”,應(yīng)該跟“鐵環(huán)、手環(huán)”之類的東西有關(guān)啊?!
按圖索驥,從“環(huán)”的定義里,我們發(fā)現(xiàn)了“阿貝爾群”這幾個(gè)字,“阿貝爾”應(yīng)該是個(gè)人名,那“群”又是啥意思?!,于是,繼續(xù)百度之,
“在數(shù)學(xué)中,群表示一個(gè)擁有滿足封閉性、滿足結(jié)合律、有單位元、有逆元的二元運(yùn)算的代數(shù)結(jié)構(gòu),包括阿貝爾群、同態(tài)和共軛類。”
這句話相比之前“格”“環(huán)”的定義稍稍多了幾個(gè)字。欣喜的是,這句話中提到的幾個(gè)概念好像都知道什么意思,比如“結(jié)合律”,“單位元”,“共軛”等,此外,還見(jiàn)到了我們苦苦追尋的“同態(tài)”兩個(gè)字,相比最開(kāi)始的漆黑一片,終于見(jiàn)到了幾個(gè)火星兒,希望有了,勝利可能就在眼前。。。
于是,我們沖向FHE這個(gè)山頂?shù)牡谝粭l路徑就出現(xiàn)在了我們眼前,那便是:群->環(huán)->域->格。雖然只有四個(gè)字,可每個(gè)字看起來(lái)都不是那么好搞定的,畢竟,我們好像依稀聽(tīng)說(shuō)過(guò),“群論”,“環(huán)論”,“抽象代數(shù)”這幾個(gè)可怕的怪物,這么陡峭的山體,一不小心就可能摔得粉身碎骨,永遠(yuǎn)達(dá)不到矗立在山頂?shù)腇HE。
我駐足沉思,難道到山頂只有一條路可走?難道必須從山腳下的“群”開(kāi)始?現(xiàn)在都是新時(shí)代,出門爬個(gè)山,累了都有纜車啊, FHE這座山真有沒(méi)有纜車可坐?如果FHE這座山?jīng)]有纜車,那么FHE這座山附近有沒(méi)有其它的山,如果有其它的山的話,有沒(méi)有可能在兩山的山頂建有“山頂纜車”?
一堆問(wèn)題在我附近的空間里縈繞盤旋,我得不到回答,于是,在沒(méi)看到“山頂纜車”之前,我開(kāi)始從山腳下的“群”開(kāi)始一步一步地爬。。。群是有點(diǎn)抽象,剛開(kāi)始確實(shí)不太容易理解,不過(guò)我走得很快,不一會(huì)就建立了“群,環(huán),域”的簡(jiǎn)單概念。
繼續(xù)爬。。。
爬呀爬。。。
。。。
。。。
。。。
幾天以后。。。
又有一道金光劃過(guò)我腦海的上空,原本漆黑的海面上變得亮了起來(lái)。這道金光就是:
“很多格子擺在一起,看起來(lái)很像矩陣啊!”
是的啊,確實(shí)很多格子排列在一起,從遠(yuǎn)處看,就是一個(gè)矩陣啊,所以,“格”和“矩陣”之間一定存在某種關(guān)系!這個(gè)關(guān)系,不就是兩座山頂之間的“山頂纜車”嗎?!
“矩陣”,我們是比較了解的,如果矩陣和格之間建有山頂纜車的話,豈不美哉。
稍作驗(yàn)證,果不其然,我的想法是對(duì)的,“山頂纜車”早已建成,因?yàn)槲铱吹搅恕罢麛?shù)格”的定義:
“離散的基向量生成空間集合,稱之為整數(shù)格(Integer Lattice)”
這里面可能稍有難度的是“生成空間”,我們先來(lái)搞定它。
在線性代數(shù)中,如果我們要描述一個(gè)線性空間的話,我們需要先找到這個(gè)空間的一組基(Basis)。(PS:看到“基”這個(gè)字,你是不是又想起了傅里葉,想起了泰勒,想起了點(diǎn)值法,想起了消失的時(shí)間。。。)
比如常見(jiàn)的二維平面空間(笛卡爾坐標(biāo)系),我們可以選用x軸和y軸的單位向量,作為我們的基向量(或者叫單位向量),分別是:
這樣的話,任何XY坐標(biāo)系的向量都可以用上面的一組基來(lái)表示。即,
其中c_0和c_1可以是任意實(shí)數(shù),如果是任意實(shí)數(shù),那么v的所有可能的組合,就可以鋪滿整個(gè)二維平面空間,我們管所有的v組成的這個(gè)線性空間,就叫做,b_1兩個(gè)基向量的線性生成空間(Span)。
我們不難想象,如果c_0和c_1是實(shí)數(shù),那么b_0,b_1的生成空間是“連成一片”的,可以叫“片”,但是,如果c_0和c_1是只能是整數(shù)的話,那么b_0,b_1的生成空間就由“片”變成了無(wú)數(shù)個(gè)離散的“點(diǎn)”,這些點(diǎn)整齊的排列在一起,非常像無(wú)數(shù)個(gè)小格子,我們把這樣的一個(gè)離散的生成空間,叫做“整數(shù)格(Integer Lattice)”。
果不其然,從“矩陣”到“格”,只有簡(jiǎn)單的一步,這個(gè)“山頂纜車”建得實(shí)在是太好了。
乘坐這條意外發(fā)現(xiàn)的纜車,我們快速抵達(dá)了“格”,這時(shí),我們離FHE的核心腹地--LWE只有一步之遙了,加油,勝利就在眼前。
稍微瞄一眼上圖,我們就會(huì)發(fā)現(xiàn),這確實(shí)是很多格子啊,“格”這個(gè)字用的還是挺好的。
有了Lattice(格),就有很多跟Lattice 有關(guān)的有意思的問(wèn)題就出現(xiàn)了。比如,想要表達(dá)一個(gè)向量v:
我們會(huì)發(fā)現(xiàn),這個(gè)向量沒(méi)辦法在整數(shù)格中表達(dá)它,因?yàn)檎麛?shù)格中的系數(shù)必須是整數(shù)才行啊。
好了,問(wèn)題來(lái)了,既然不能用整數(shù)格完美表達(dá)v,那么,是否可以找到一個(gè)最接近v的v_0,而v_0可以用整數(shù)格完美表達(dá)。對(duì)于上面的例子:
這個(gè)就是著名的CVP(Closest Vector Problem)難題!!
你可能會(huì)說(shuō),這算哪門子難題啊?我一秒鐘就破解了。
沒(méi)錯(cuò),如果只是二維正交基向量的格,那么CVP問(wèn)題不是特別難,但是,如果基向量不正交呢?如果v的維度變大到, 的成員的值變大到需要1000bit呢?
這個(gè)難度是被嚴(yán)格證明的,CVP問(wèn)題是非常難解決的(Nondeterministic Polynomial hard, NP-hard)。
是的,這個(gè)乍看起來(lái)很簡(jiǎn)單,實(shí)際上很難的問(wèn)題,就是格密碼學(xué)的開(kāi)端。
“什么?!搞了這么久,我以為已經(jīng)達(dá)到了頂峰,竟然被你說(shuō)成是‘開(kāi)端‘?!!”
“是的,的確是格密碼學(xué)的開(kāi)端,現(xiàn)實(shí)就是這么的殘酷,你以為的天花板,很可能只是別人的起點(diǎn)。比如,你家的天花板,可能只是樓上的地板,…^_^”
不過(guò)不要?dú)怵H,前面就是我們要找的LWE了。
在正式引入LWE之前,我們先回顧一下,送我們快速到達(dá)“格”的山頂纜車—矩陣。
是的,通過(guò)上篇的學(xué)習(xí),我們?cè)缇椭懒耍粋€(gè)矩陣乘的式子,對(duì)應(yīng)一個(gè)線性方程組:
其中A是一個(gè)矩陣,x是一個(gè)向量,b也是一個(gè)向量。
已知A和b,求x的過(guò)程,就是求解線性方程組的過(guò)程。具體就是在上篇提到的方法:等式兩邊都乘以的逆矩陣,乘完之后,等式左邊就只剩下我們要求出的未知向量了。
現(xiàn)在稍稍把上面的矩陣乘法等式變化一下:
其中e是一個(gè)在固定數(shù)值范圍內(nèi)隨機(jī)采集的一個(gè)隨機(jī)噪音向量。這時(shí),之前“等式兩邊都乘以A的逆矩陣”的方法就不行了,那我們?cè)趺辞竽兀看鸢负芎?jiǎn)單:
“只能暴力破解”
也就是一個(gè)一個(gè)的猜x這個(gè)向量里的值,然后逐漸逼近。
這就是我們苦苦尋找的LWE(Learning With Error)問(wèn)題!即:
已知一個(gè)矩陣,和它與一個(gè)向量相乘得到的乘積再加上一定的誤差,也就是,如何有效的還原(learn)未知的向量。
“什么?LWE的定義這么草率嗎?”
“是的,有時(shí)候勝利來(lái)得就是這么突然。”
“LWE,我們是知道了,可前面為啥提到CVP問(wèn)題啊?”
如果我們細(xì)心的看LWE的問(wèn)題描述的話,可以發(fā)現(xiàn),LWE問(wèn)題與我們之前提到的CVP問(wèn)題有著驚人的相似。
不能說(shuō)相似,簡(jiǎn)直一模一樣。都是需要找到一組“系數(shù)”--,使得一組基向量--的線性組合,無(wú)限逼近我們想要的目標(biāo)向量--。這里我們使用誤差噪音--的大小來(lái)定義到底我們需要距離目標(biāo)向量多近。
所以,如果CVP是一個(gè)NP-hard問(wèn)題的話,那么LWE問(wèn)題也是一個(gè)NP-hard問(wèn)題了。
現(xiàn)在,我么是時(shí)候展示一下LWE問(wèn)題的數(shù)學(xué)定義了:
是不是猛一看,一堆亂七八糟的數(shù)學(xué)符號(hào),想直接跳過(guò)去?莫慌,其實(shí)很簡(jiǎn)單。此外,這幾個(gè)數(shù)學(xué)符號(hào)會(huì)反復(fù)出現(xiàn)在FHE有關(guān)的論文中,我們是繞不過(guò)去的。
從上面的學(xué)習(xí)中,我們知道,一個(gè)LWE問(wèn)題中,包含以下幾步:
第一,我們需要定義矩陣A的維度--m×n,其中m代表了整個(gè)線性方程組包含幾個(gè)方程,而n代表每個(gè)方程中有幾個(gè)未知數(shù),也稱為“安全系數(shù)”。n越大,LWE越難,m越大,LWE越簡(jiǎn)單。
第二,我們需要決定有限整數(shù)域中的,一般會(huì)選擇一個(gè)很大的素?cái)?shù)。越大,LWE越難。
第三,我們要決定疊加的噪音的取值上限。越大,越難。
第四,上面三條已經(jīng)足夠,不過(guò),為了簡(jiǎn)單,我們一般只設(shè)置一個(gè)參數(shù)n,然后通過(guò)一個(gè)函數(shù)計(jì)算出一組合適的m,q,B,可以保證LWE問(wèn)題實(shí)例很大概率會(huì)擁有唯一的解,一般m,q都是n的多項(xiàng)式倍數(shù)(m=poly(n))。
我們定義了這些參數(shù)之后,LWE問(wèn)題就好理解了:已知和
,求未知向量s。其實(shí),還是我們前面反復(fù)看到的這個(gè)矩陣乘法等式:
此情此景,我就不再吟詩(shī)了。。。
到此為止,其實(shí)我們已經(jīng)掌握了FHE的絕大部分內(nèi)容了,萬(wàn)事俱備,東風(fēng)也不欠了,現(xiàn)在我們正式構(gòu)建一個(gè)我們自己的同態(tài)加密系統(tǒng)。
首先,一個(gè)典型的HE系統(tǒng)包含以下幾步:
第一,密鑰生成(KeyGen)
第二,加密(Enc)
第三,解密(Dec)
第四,同態(tài)運(yùn)算(Eval)
我們下面通過(guò)一個(gè)具體的例子來(lái)說(shuō)明如何構(gòu)建一個(gè)HE系統(tǒng)。
首先,KeyGen(),我們先隨機(jī)生成一個(gè)私密向量s,然后在這個(gè)向量的最下面加一個(gè)“-1”,變成,對(duì),沒(méi)錯(cuò),就是這么草率,就是密鑰。
然后,,其中 m是我們要加密的明文-一個(gè)數(shù)。我們通過(guò)以下方式計(jì)算密文:
其中就是我們上面提到的LWE問(wèn)題,A是隨機(jī)生成的矩陣,s是我們第一步KenGen()生成的,e是一個(gè)隨機(jī)噪音,所以LWE(A,A·s+e)的結(jié)果是一個(gè)看起來(lái)亂七八糟的
的矩陣。
是一個(gè)
單位矩陣。
一個(gè)矩陣C就是我們對(duì)加密之后的密文。
第三步,,在解密時(shí),對(duì)于一個(gè)密文矩陣,我們只需要計(jì)算
,就會(huì)得到
我們是我們的密鑰,是已知的,所以,明文m就水落石出了。不知道各位在這時(shí)有沒(méi)有想到矩陣的特征值和特征向量這兩個(gè)概念。這里,密鑰是特征向量,明文是特征值,所以不加噪聲的話,明文實(shí)際上是在裸奔,畢竟求一個(gè)已知矩陣的特征值和特征向量還是很容易的!
第四步,,即,密文直接加、乘就可以了。這里需要注意的是,密文下的乘法運(yùn)算可能會(huì)將噪音放大,導(dǎo)致解密失敗,為了提高成功解密的概率,我們可以將和,進(jìn)行二進(jìn)制分解(就是用只包含0、1的二進(jìn)制表示)。
如果你看到了這里,那么恭喜你,已基本掌握了FHE的精髓,最后,我們用下圖來(lái)結(jié)束本文:
我定睛觀察上面的圖,持續(xù)十分鐘,然后閉上眼睛,這時(shí)圖中的格子忽然動(dòng)了起來(lái):
Polynomial、Point-Value、Convolution、DFT、FFT、NTT、UnitRoot、PrimitiveRoot、Matrix、Lattice、LWE。。。
這些原來(lái)一個(gè)個(gè)相互獨(dú)立的單詞,忽然間變成了一個(gè)個(gè)精靈,他們開(kāi)心的跳著歡快的舞步,旋轉(zhuǎn)、跳躍、相互握手,點(diǎn)頭致意。。。
。。。
。。。
。。。
最后的最后,送上一幅藏寶圖,祝一路順風(fēng):
審核編輯:劉清
-
傅里葉變換
+關(guān)注
關(guān)注
6文章
442瀏覽量
42881 -
三角函數(shù)
+關(guān)注
關(guān)注
0文章
15瀏覽量
6845 -
同態(tài)加密
+關(guān)注
關(guān)注
1文章
5瀏覽量
1948
原文標(biāo)題:看完這篇文章,還搞不懂全同態(tài)加密,你過(guò)來(lái)打我--基于格密碼全同態(tài)加密的數(shù)學(xué)基礎(chǔ)
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
數(shù)學(xué)專業(yè)轉(zhuǎn)人工智能方向:考研/就業(yè)前景分析及大學(xué)四年學(xué)習(xí)路徑全揭秘

加密算法的選擇對(duì)于加密安全有多重要?
常見(jiàn)的加密算法有哪些?它們各自的優(yōu)勢(shì)是什么?
對(duì)稱加密技術(shù)在實(shí)際應(yīng)用中如何保障數(shù)據(jù)安全?
NAS重置密碼攻略來(lái)襲,讓你告別‘密碼焦慮’!

PostgreSQL將不再支持MD5密碼
Linux系統(tǒng)設(shè)置用戶密碼規(guī)則(復(fù)雜密碼策略)方法
艾體寶洞察 一文讀懂最新密碼存儲(chǔ)方法,揭秘密碼存儲(chǔ)常見(jiàn)誤區(qū)!

擁有SHA-256核心和32Kbits的EEPROM應(yīng)用的加密芯片-GEN-FA

評(píng)論