在學(xué)習(xí)區(qū)塊鏈的過程中經(jīng)常會(huì)遇到密碼學(xué)的概念奠旺,有時(shí)候會(huì)混淆本文將對(duì)以下概念進(jìn)行簡單解釋:hash(哈希购裙、散列)算法聚磺,數(shù)字摘要,對(duì)稱加密秆剪,非對(duì)稱加密,數(shù)字簽名爵政,Merkle樹仅讽,同態(tài)加密(Homomorphic Encryption),零知識(shí)證明钾挟。
hash算法
簡單來說就是把任意數(shù)據(jù)(二進(jìn)制)變?yōu)楣潭ㄩL度的二進(jìn)制洁灵,小到一個(gè)數(shù)字“1”,大到一個(gè)視頻文件掺出,只要是最終以二進(jìn)制形式存儲(chǔ)的數(shù)據(jù)徽千,就能通過hash算法變?yōu)楣潭ㄩL度的一串?dāng)?shù)據(jù)苫费。
一個(gè)優(yōu)秀的hash算法有一下四個(gè)特點(diǎn):
正面快速:就是說加密的速度要在有限時(shí)間和有限資源內(nèi)完成,且越快越好双抽。
逆向困難:就是說給你一個(gè)加密后的hash值數(shù)據(jù)百框,要想逆向破解獲得加密前的明文是極其困難的。
輸入敏感:明文只要發(fā)生哪怕一點(diǎn)點(diǎn)改變牍汹,進(jìn)行hash運(yùn)算后的值都會(huì)產(chǎn)生很大的改變铐维。
沖突避免:不同的明文,他們進(jìn)行hash運(yùn)算后的hash值基本不可能一樣柑贞。
沖突避免又叫做“抗碰撞性”方椎,如果給你一個(gè)明文,得到hash值后钧嘶,你無法找到另外一個(gè)明文的hash值與他一樣棠众,那么就叫做“抗弱碰撞性”。要是你自己隨便找兩個(gè)明文有决,讓他們的hash值一樣闸拿,如果做不到,那么叫做“抗強(qiáng)碰撞性”书幕,也就是說具有更強(qiáng)的“抗碰撞性”新荤。
現(xiàn)在比較流行的就是MD5和SHA-1算法。但是由于這兩種算法不夠安全台汇,也就是在“抗碰撞性”上做得不夠好苛骨,于是又有了SHA-224、SHA-256苟呐,SHA-512等算法痒芝。
比特幣采用的SHA-256 hash算法,共有256位牵素,也就是2的256次方個(gè)結(jié)果(這個(gè)數(shù)字十分巨大)严衬,產(chǎn)生新區(qū)快時(shí)候,由于hash逆向困難笆呆,曠工就要用哪一個(gè)值去跟新區(qū)塊的hash的值碰撞请琳,誰先猜對(duì),就讓誰在新的區(qū)塊中寫入信息赠幕,并且獲得新區(qū)快中的獎(jiǎng)勵(lì)btc俄精。
小張對(duì)“1”和“2”進(jìn)行的hash算法,下面有很多種:md5榕堰,sha1竖慧,sha256等。
數(shù)字摘要
其實(shí)就是運(yùn)用hash算法來對(duì)內(nèi)容進(jìn)行hash運(yùn)算,由于前面說過了测蘑,一旦更改了原數(shù)據(jù)哪怕是一點(diǎn)點(diǎn)灌危,hash值都會(huì)產(chǎn)生巨大的改變,所以這個(gè)數(shù)字摘要可以避免數(shù)據(jù)被篡改碳胳。
一個(gè)簡單的實(shí)例就是比如小張要給你傳一個(gè)文件勇蝙,為了避免別人在文件中加入木馬,小張就對(duì)文件進(jìn)行數(shù)字摘要的獲取挨约,然后再單獨(dú)把摘要(hash值)給你味混,當(dāng)你拿到文件后,你也對(duì)文件進(jìn)行跟小張一樣算法的hash運(yùn)算诫惭,如果得到的hash值跟小張傳給你的一樣翁锡,那么就證明文件沒問題,可以打開夕土,否則就證明被篡改了馆衔。
不光是比特幣,數(shù)字簽名還有更多更廣泛的運(yùn)用怨绣,比如之前介紹過的ULORD角溃,就是把具有版權(quán)的數(shù)字化作品進(jìn)行數(shù)字簽名,然后把簽名存儲(chǔ)在公有鏈上篮撑,既能防止被串改减细,還能對(duì)版權(quán)進(jìn)行控制。
在比特幣交易中赢笨,當(dāng)你要轉(zhuǎn)賬時(shí)候未蝌,需要把交易信息和一串?dāng)?shù)字簽名一起傳給礦工,礦工根據(jù)數(shù)字簽名對(duì)你的交易信息進(jìn)行校驗(yàn)茧妒,就如同上面說的一樣萧吠,防止交易信息被篡改。
數(shù)字簽名就是對(duì)信息的數(shù)字摘要進(jìn)行了非對(duì)稱加密而來嘶伟。
接下來要說說加密算法中的對(duì)稱和非對(duì)稱加密怎憋。
加密算法
我們在加密過程中又碌,要用加密算法和一個(gè)key來進(jìn)行加密九昧,舉個(gè)最簡單的例子,你要傳送一個(gè)信息數(shù)字“1”給小伙伴毕匀,但是不想被別人知道铸鹰,你就跟小伙伴約定:“我先把信息加上一個(gè)值,你拿到后再減去一個(gè)值就能得到原文(加密算法)皂岔,這個(gè)值我每次跟你偷偷約定(key)”蹋笼。比如這次約定的key是8,于是我就傳一個(gè)“9”給小伙伴,同時(shí)告訴他剖毯,“key的值是8”圾笨,他拿到“9”后,再減去8就得到了原文“1”逊谋。
根據(jù)加密和解密時(shí)候的key相同或者不同擂达,加密算法分為了對(duì)稱加密和非對(duì)稱加密。
對(duì)稱密鑰加密 (Symmetric Key Encryption)
特點(diǎn):公鑰(加密使用)胶滋、私鑰(解密使用)相同板鬓。
優(yōu)點(diǎn):加密速度快,空間占用小究恤,保密強(qiáng)度高俭令。
缺點(diǎn):key需要多方持有且高度保密,如果有一人泄露部宿,信息就全部泄露了抄腔。
代表算法:DES、3DEA理张、AES妓柜、IDEA等。
適用場景:大量數(shù)據(jù)的加解密涯穷。
非對(duì)稱加密(asymmetric encryption)
特點(diǎn):公鑰(加密使用)棍掐、私鑰(解密使用)不同。
優(yōu)點(diǎn):公私鑰分開拷况,便于管理作煌。
缺點(diǎn):加密速度慢。
代表算法:RSA赚瘦、EIGamal粟誓、橢圓曲線系列算法。
適用場景:簽名起意、密鑰協(xié)商場景鹰服。
實(shí)例:小張可以把公鑰廣播出去,需要跟小張通訊的人都可以用公鑰對(duì)信息進(jìn)行加密揽咕,小張拿到加密信息后悲酷,用自己獨(dú)有的私鑰進(jìn)行解密,就能得到傳給小張的信息了亲善。
其實(shí)對(duì)稱和非對(duì)稱還可以組合適用设易,比如小張先用非對(duì)稱加密把公鑰給你,你把一個(gè)對(duì)稱加密的臨時(shí)秘鑰加密了給小張蛹头,小張拿到這個(gè)對(duì)稱加密的key后再對(duì)大量數(shù)據(jù)進(jìn)行加解密處理顿肺。這樣安全性和加解密速度都可以得到保障了戏溺。
數(shù)字簽名
之前說了在比特幣中,要用到數(shù)字簽名校驗(yàn)交易信息是否是你發(fā)出屠尊。你使用比特幣的時(shí)候都有一個(gè)私鑰旷祸,你先把自己的交易信息進(jìn)行hash運(yùn)算取得數(shù)字摘要,然后用私鑰對(duì)摘要進(jìn)行非對(duì)稱加密讼昆,接著把交易信息和加密后的數(shù)字簽名一起發(fā)給曠工肋僧,礦工收到你的申請(qǐng)后,就用交易信息中的你的公鑰進(jìn)行解密得到數(shù)字摘要控淡,然后再對(duì)加以信息進(jìn)行hash嫌吠,保證兩個(gè)數(shù)字摘要一致,防止交易信息被篡改掺炭。這樣既能保證交易信息沒有被篡改辫诅,也能保證這筆交易確實(shí)是你發(fā)起的了。所以大家看出來了涧狮,保存好自己的私鑰是多么重要的一件事炕矮。
Merkle樹
默克爾樹,又叫做哈希樹者冤。是一種二叉樹肤视。見下圖。
簡單說就是D0涉枫,D1邢滑,D2,D3愿汰。困后。。都是數(shù)據(jù)衬廷,他們兩兩內(nèi)容進(jìn)行hash后得到上面的節(jié)點(diǎn)N(i)摇予,最后得到總的節(jié)點(diǎn)Root。
特點(diǎn)就是:低層無論哪一個(gè)節(jié)點(diǎn)發(fā)生變動(dòng)吗跋,都會(huì)向上傳導(dǎo)侧戴,最終導(dǎo)致根節(jié)點(diǎn)發(fā)生變化。
應(yīng)用場景:
1.快速比較大量的數(shù)據(jù):如果兩個(gè)默克爾樹的根相同跌宛,就證明兩個(gè)數(shù)據(jù)必然相同酗宋。
2.能夠快讀定位到變動(dòng)的數(shù)據(jù):比如D1有變化,就會(huì)影響N1秩冈,N4和Root本缠,沿著Root - N4 - N1斥扛,可以快速定位到D1.
3.零知識(shí)證明:比如要證明數(shù)據(jù)中包含D0入问,但是又不想D0知道D1丹锹。。芬失。D3的內(nèi)容楣黍,這時(shí)就可以公布N0 - N4 節(jié)點(diǎn),D0通過比對(duì)hash就能得到自己也在數(shù)據(jù)中棱烂,但是不知道其他內(nèi)容租漂。
同態(tài)加密
如果我們有明文A和明文B,我們分別對(duì)A颊糜、B進(jìn)行加密得到密文C和D哩治。我們把C和D進(jìn)行相加,然后再用解密算法進(jìn)行解密衬鱼,一般情況下我們得到的解密結(jié)果都是無意義的信息业筏。
但是同態(tài)加密就是說:我們對(duì)C+D進(jìn)行解密后,得到的結(jié)果就是A+B的結(jié)果鸟赫。
如果滿足加減法就叫做加加法同態(tài)蒜胖。
如果滿足乘除法就叫做加乘法同態(tài)。
如果滿足加減法又滿足乘除法就叫做加全同態(tài)抛蚤。
目前的算法例如:RSA滿足乘法同態(tài)台谢,Paillier滿足加法同態(tài),第一個(gè)全同態(tài)是09年才出現(xiàn)的Gentry算法岁经。
這樣的好處是:比如企業(yè)要用到云計(jì)算朋沮,但是又不想把數(shù)據(jù)公開出去。就可以把同態(tài)加密算法加密的密文發(fā)送到第三方云平臺(tái)缀壤,等第三方計(jì)算完成后朽们,取回本地進(jìn)行解密操作。
大家可以看到不光是區(qū)塊鏈诉位,各行各業(yè)中密碼學(xué)都是應(yīng)用廣泛骑脱,區(qū)塊鏈更是把密碼學(xué)運(yùn)用到了的一個(gè)巔峰,要想好好了解區(qū)塊鏈技術(shù)苍糠,了解密碼學(xué)的一些基礎(chǔ)知識(shí)還真是必不可少叁丧!