密碼學(xué)-比特幣的數(shù)學(xué)基礎(chǔ)區(qū)塊鏈

                  鏈向財(cái)經(jīng) 2018-10-05 19:02
                  分享到:
                  導(dǎo)讀

                  我們要保證的是,即使數(shù)據(jù)被竊取了,竊取者也無(wú)法使用。而要做到這一點(diǎn),只要雙方事先約定一套加密解密的方法,以密文的方式傳輸信息,就可以有效地防止信息泄露。

                  一、密碼學(xué)的本質(zhì)
                   

                  很顯然,之所以要有密碼,是想對(duì)信息保密,而之所以要保密,是出于政治、軍事、經(jīng)濟(jì)以及個(gè)人的利益而著想。那么可想而知,一旦密碼被破譯,將產(chǎn)生極為嚴(yán)重的后果。
                   

                  所以,密碼學(xué)的思考方向總結(jié)來(lái)說(shuō)有兩點(diǎn):一個(gè)是要有一套加密解密的規(guī)則(或者數(shù)學(xué)算法),二是研究如何在現(xiàn)有規(guī)則(算法)的基礎(chǔ)上確保所傳遞信息安全的策略。通俗點(diǎn)講,我們傳遞信息時(shí)主要是要防備信息的泄露。那么我們首先想到的是防止消息在傳輸過程中被第三方截獲,比如說(shuō)話被偷聽、郵件被偷看、網(wǎng)絡(luò)數(shù)據(jù)被竊取。而事實(shí)上,在現(xiàn)代技術(shù)極大透明的情況下,不被竊取是很難做到的,所以,我們要保證的是,即使數(shù)據(jù)被竊取了,竊取者也無(wú)法使用。而要做到這一點(diǎn),只要雙方事先約定一套加密解密的方法,以密文的方式傳輸信息,就可以有效地防止信息泄露。

                  二、什么是哈希算法
                   

                  在早期,傳統(tǒng)加密方法是不能公開的,因?yàn)橹懒思用芊椒?,只需要反向?jì)算就能解密。那么,有沒有一種加密方法,使得即使知道了加密方法,也不能恢復(fù)出原文呢?隨著技術(shù)的進(jìn)步,尤其是數(shù)學(xué)理論的擴(kuò)展,密碼學(xué)也得以發(fā)展,現(xiàn)在我們只需要在加密過程中加入一些不可逆的運(yùn)算就可以達(dá)到這個(gè)目的。我們來(lái)舉個(gè)例子,Bob想向Alice遞一些小秘密,但為了防止Bob說(shuō)謊,我們可以這樣做:
                   

                  1.Bob先設(shè)想一個(gè)數(shù),并加上123456。
                   

                  2.把結(jié)果平方,取第3~10位,組成一個(gè)8位數(shù)。
                   

                  3.再用這個(gè)數(shù)除以456789求余數(shù),然后把這個(gè)結(jié)果告訴Alice。
                   

                  4.Alice猜測(cè)Bob設(shè)想的是奇數(shù)還是偶數(shù)。
                   

                  5.Bob告訴Alice原始數(shù)字,Alice按照上面的過程再計(jì)算一遍,看結(jié)果是否和Bob給的結(jié)果一致。
                   

                  我們假設(shè)Bob設(shè)定的是1234,按照上面的過程依次得到:
                   

                  1234 123456=124690
                   

                  124690×124690=15547596100
                   

                  54759610mod456789=401719(Mod表示除法求余數(shù))
                   

                  Alice拿到的結(jié)果是401719,這樣既可以驗(yàn)證Bob有沒有撒謊,同時(shí)Alice又很難根據(jù)401719反向算出123456。這樣也不能絕對(duì)保證Bob不作弊,但如果Bob想作弊,他就必須事先找到一奇一偶兩個(gè)數(shù),它們按照上面的運(yùn)算能得到一樣的結(jié)果。這個(gè)難度取決于上面算法的難度。
                   

                  而在密碼學(xué)中,這種會(huì)丟掉一部分信息的加密方式被稱為“單向加密”,也叫作哈希算法。
                   

                  一個(gè)可靠的哈希算法至少需要滿足下面幾個(gè)條件:
                   

                  1.對(duì)于給定的數(shù)據(jù)M,很容易算出哈希值X=F(M);
                   

                  2.根據(jù)X很難算出M;
                   

                  3.很難找到M和N令F(M)=F(N)。
                   

                  目前在互聯(lián)網(wǎng)世界中,被認(rèn)為安全且被廣泛使用的哈希算法包括MD5、SHA-256等。哈希算法的結(jié)果長(zhǎng)度都是固定的,MD5的結(jié)果長(zhǎng)度為32個(gè)字符,SHA-256則達(dá)到64個(gè)字符,所以SHA-256看起來(lái)更安全一些,更難找到能算出相同結(jié)果的M和N。比如“1234”使用MD5算法計(jì)算的結(jié)果是81DC9BDB52D04DC20036DBD8313ED055”,而用SHA-256算法計(jì)算出的結(jié)果是“03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4”。
                   

                  然而,這種單向加密算法并不能用來(lái)進(jìn)行普通的信息傳輸,更多是用來(lái)進(jìn)行傳輸結(jié)果的準(zhǔn)確性驗(yàn)證。很多下載網(wǎng)站都提供了下載文件的原始MD5值供校驗(yàn),以防止文件被病毒修改。

                  三、非對(duì)稱加密
                   

                  現(xiàn)在我們來(lái)看一下在真正要進(jìn)行信息傳輸?shù)那闆r下應(yīng)該怎么辦。同樣假設(shè)Alice和Bob要通過互聯(lián)網(wǎng)傳輸一份絕密情報(bào),那么,如何阻止第三方在網(wǎng)絡(luò)上截獲信息呢?對(duì)于我們普通大眾來(lái)說(shuō),一般是使用如WinRAR等工具對(duì)文件進(jìn)行加密壓縮,然后通過電子郵件或者QQ把加密的文件發(fā)過去,同時(shí),通過發(fā)短信或者打電話把解壓密碼告訴對(duì)方。但是,若是重大的商業(yè)情報(bào)或者國(guó)家的絕密情報(bào),這種做法很顯然非常容易被竊取并破解。那么怎么辦呢?這里我們有兩種思路可以嘗試解決:
                   

                  1.密碼學(xué)世界有一個(gè)柯克霍夫原則:即使密碼系統(tǒng)的任何細(xì)節(jié)已為人熟知,只要密鑰(key)未泄露,它也應(yīng)是安全的。無(wú)論是在戰(zhàn)爭(zhēng)時(shí)期還是和平時(shí)期,都不能把保密的希望寄托于系統(tǒng)或算法的秘密性。機(jī)械可以拆解,軟件可以反編譯。密碼系統(tǒng)的所有細(xì)節(jié)總會(huì)被有心人一一拆解。這個(gè)時(shí)候,如果系統(tǒng)符合柯克霍夫原則,那么即使對(duì)手拆解了系統(tǒng)但不知道密鑰,他也沒有辦法破譯加密的信息。滿足這種嚴(yán)苛條件的密碼系統(tǒng)才是安全的。
                   

                  2.要是有一種加密系統(tǒng),加密和解密使用不同的密碼,假設(shè)有2個(gè)密碼A和B,使用A對(duì)數(shù)據(jù)M進(jìn)行加密得到加密數(shù)據(jù)X=F(A,M)。但是,知道A和X無(wú)法解密出M,必須用另一個(gè)密碼B使得數(shù)據(jù)還原M=F(B,X)。Alice只需公布密碼A,Bob使用公開渠道拿到的A對(duì)情報(bào)進(jìn)行加密,再通過任意方式發(fā)給Alice進(jìn)行解密,這樣一來(lái),即使所有的通信被監(jiān)聽,對(duì)手也不可能拿到情報(bào)。
                   

                  如果使用我們?cè)O(shè)想的這些神奇加密算法,似乎問題就可以迎刃而解了,但問題是,這樣的技術(shù)存在嗎?聽上去似乎并不可能,因?yàn)閺闹庇X上判斷,知道了加密方法就一定知道解密方法,只需要反過來(lái)計(jì)算就可以了。加密方法和解密方法是否可能不對(duì)稱?有可能!

                  四、數(shù)學(xué)小魔術(shù)的秘密
                   

                  我們來(lái)看一個(gè)小時(shí)候經(jīng)常在《趣味數(shù)學(xué)》這類書里看到的數(shù)學(xué)小魔術(shù):讓對(duì)方任意想一個(gè)三位數(shù),并把這個(gè)數(shù)和91相乘,然后說(shuō)出乘積的最后三位數(shù),就可以猜出對(duì)方想的是什么數(shù)字。比如對(duì)方想的是123,那么對(duì)方就計(jì)算出123×91=11193,并把結(jié)果的末三位193告訴我??雌饋?lái),這么做似乎損失了不少信息,我可能沒法反推出原來(lái)的數(shù)。不過,我仍然有辦法:只需要把對(duì)方告訴我的結(jié)果乘以11,乘積的末三位就是對(duì)方剛開始想的數(shù)字了。可以驗(yàn)證一下,193×11=2123,末三位正是對(duì)方所想的秘密數(shù)字!其實(shí)道理很簡(jiǎn)單,91乘以11等于1001,而任何一個(gè)三位數(shù)乘以1001后,末三位顯然都不變(例如123乘以1001就等于123123)。先讓對(duì)方用他所想的數(shù)字乘以91,假設(shè)乘積為X;我再在X的基礎(chǔ)上乘以11,其結(jié)果相當(dāng)于我倆合作把原數(shù)乘以了1001,末三位自然就變了回去。X乘以11后的末三位是什么只與X的末三位有關(guān),因此,對(duì)方只需要告訴我X的末三位就行了,這并不會(huì)丟失信息。知道原理后,我們可以構(gòu)造一個(gè)定義域和值域更大的加密解密系統(tǒng)。比如,任意一個(gè)數(shù)字乘以400000001后,末八位都不變,而400000001=19801×20201,于是你乘以19801,我乘以20201,一個(gè)加密解密不對(duì)稱的系統(tǒng)就構(gòu)造好了。我們甚至還可以構(gòu)造一個(gè)更大的系統(tǒng):
                  4000000000000000000000000000001=1199481995446957×3334772856269093,這樣我們就成功構(gòu)造了一個(gè)30位的加密系統(tǒng)。這是一件非??岬氖虑?,任何人都可以按照這個(gè)方法加密一個(gè)數(shù)字,但是只有自己才知道怎么把所得的密文變回去。
                   

                  但如果僅僅按照上面的思路,如果對(duì)方知道原理,知道我要構(gòu)造出帶很多0的數(shù),根據(jù)19801和8位算法這兩個(gè)條件其實(shí)可以比較容易地窮舉出400000001這個(gè)目標(biāo)值。要解決這個(gè)問題,我們來(lái)看看真實(shí)世界是怎么處理的。

                  五、RSA算法與橢圓曲線算法
                   

                  直到1976年以前,所有的加密方法都是同一種模式:
                   

                  1.甲方選擇某一種加密規(guī)則,對(duì)信息進(jìn)行加密;
                   

                  2.乙方使用同一種規(guī)則,對(duì)信息進(jìn)行解密。
                   

                  由于加密和解密使用同一種規(guī)則(簡(jiǎn)稱“密鑰”),這被稱為“對(duì)稱加密算法”。這種加密模式有一個(gè)最大的弱點(diǎn):甲方必須把加密規(guī)則告訴乙方,否則無(wú)法解密。這樣一來(lái),保存和傳遞密鑰就成了最讓人頭疼的問題。尤其是人數(shù)多了之后,每?jī)蓚€(gè)人都要互相商量一個(gè)密鑰,復(fù)雜性大大提高,而傳遞密鑰則帶來(lái)更高的安全風(fēng)險(xiǎn)。
                   

                  直到1977年,李維斯特、沙米爾和艾德曼設(shè)計(jì)了一種算法,可以實(shí)現(xiàn)非對(duì)稱加密。這種算法用他們?nèi)齻€(gè)人的名字命名,叫作RSA算法。直到現(xiàn)在,RSA算法一直是應(yīng)用最廣泛的非對(duì)稱加密算法。毫不夸張地說(shuō),只要有計(jì)算機(jī)網(wǎng)絡(luò)的地方,就有RSA算法,其非對(duì)稱加密模式的流程如下:
                   

                  1.乙方生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。
                   

                  2.甲方獲取乙方的公鑰,然后用它對(duì)信息進(jìn)行加密。
                   

                  3.乙方得到加密的信息后,用私鑰解密。
                   

                  由于公鑰加密的信息只有私鑰解得開,因此只要私鑰不泄露,通信過程就是安全的。
                   

                  RSA算法為什么更加安全呢?在數(shù)學(xué)世界里,有一些公認(rèn)的、需要消耗極大計(jì)算量才能得出結(jié)果的難題,比如大數(shù)因式分解問題、離散對(duì)數(shù)問題、橢圓曲線問題。RSA算法正是用到了大數(shù)分解這一相當(dāng)犀利的不對(duì)稱難題。比如對(duì)于我們上面構(gòu)造過的30位加密系統(tǒng):
                   

                  4000000000000000000000000000001=1199481995446957×3334772856269093
                   

                  反過來(lái)算乘積非常容易,但是要把4000000000000000000000000000001分解成后面兩個(gè)乘數(shù),在沒有計(jì)算機(jī)的時(shí)代幾乎不可能成功!而一旦數(shù)字長(zhǎng)達(dá)數(shù)百位,即使是超級(jí)計(jì)算機(jī)也需要耗費(fèi)海量的時(shí)間來(lái)計(jì)算才有可能。

                  橢圓曲線算法(ECC)則是另一種著名的非對(duì)稱算法,在比特幣體系里占據(jù)重要地位,是比特幣錢包安全性的密碼學(xué)基石,也是比特幣被稱為密碼學(xué)貨幣(Cryptography)的原因。

                  ECC各方面的性能和RSA比起來(lái)幾乎完勝:
                   

                  1.安全性能更高。比如160位ECC與1024位RSA有相等的安全強(qiáng)度。
                   

                  2.計(jì)算量小,處理速度比RSA快得多。
                   

                  3.存儲(chǔ)空間占用小。密鑰尺寸和系統(tǒng)參數(shù)與RSA相比要小得多。
                   

                  4.帶寬要求低。
                   

                  ECC的這些特點(diǎn)使它逐漸取代RSA,成為通用的公鑰加密算法。

                  加密 算法 密碼 信息 RSA
                  分享到:

                  1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
                  2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
                  3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。