本文首發自蟲洞社區,轉載請註明出處。html
密碼學概念算法
密碼學是對信息進行編碼實現隱蔽信息的一門科學,採用密碼技術能夠隱藏和保護須要保密的信息,使未經受權者不能提取信息。須要隱藏的消息稱爲「明文」;明文被變換成的另外一種隱蔽的形式就是「密文」。這種變換稱爲「加密」;加密的逆過程,即從密文恢復出對應的明文的過程稱爲「解密」。對明文進行加密時採用的一組規則(函數)稱爲「加密算法」。對密文解密時使用的算法稱爲「解密算法」。通常地,加密算法和解密算法都是在一組密鑰控制之下進行的,加密時使用的密鑰稱之爲「加密密鑰」,解密時使用的密鑰稱之爲「解密密鑰」。安全
什麼是密碼系統呢?密碼系統是一個概念,能夠用如下的等式簡單歸納:函數
把密碼系統拆開來看,就容易理解,一個完整的密碼系統,一定包含算法、祕鑰、明文、密文四個部分。區塊鏈
密碼體制中根據加密祕祕鑰是否相同,分爲對稱加密算法和非對稱加密算法。顧名思義,非對稱加密算法須要兩個不一樣密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,若是用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;若是用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。反之使用同一祕鑰的算法稱爲對稱算法。網站
對稱算法:加解密使用同一祕鑰。
非對稱算法:加解密使用不一樣的祕鑰。編碼
對稱與非對稱加密方式對比:加密
因爲對稱算法加解密祕鑰是相同的,因此對稱算法的安全性依賴祕鑰的長度,一般狀況下祕鑰越長,安全性越高。因此56bit的DES的安全性極低,極容易被暴力破解。而3DES是爲了兼容DES的折中方案,目前比較安全的算法是AES。spa
說到非對稱算法,通常都會先想到大名鼎鼎的RSA算法。RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。RSA的公鑰、私鑰的組成,以及加密、解密的公式以下:
固然非對稱算法還有橢圓曲線算法ECC,其主要安全性在於利用了橢圓曲線離散對數問題的困難性,證實過程仍是挺繁瑣,這邊不細講,有興趣同窗能夠本身蒐集資料瞭解下。3d
Hash算法又叫作雜湊算法、單項散列函數。散列函數就是把可變長度輸入串(叫預映射)轉化成固定長度的輸出串(叫散列值)的一種函數。
Hash函數的要求:
Hash函數算法特色:
生日問題:假設每一個人的生日都是等機率的,每一年365天,在k箇中至少兩我的的生日機率大於1/2,問k最小是多少?
P(至少兩人生日相同)=1- P(k人生日都不一樣)
P(365, k) = 1- (1-1/365)(1-2/365)…(1-k/365)
p(365,23) = 0.5073
因此只要23我的,兩我的相同生日的機率就大於50%了。根據生日悖論能夠獲得這樣一個結論:對於hash值長度爲2n的hash函數,生日攻擊的複雜度是2n/2,注意這邊攻擊的是hash函數的抗第二原性。
王小云教授破解hash函數又是怎麼回事。根據hash函數的特定咱們知道,hash是不可能被破解的,這邊說的破解說的是一個概念叫理論破解,指的是提出一個算法,使得能夠用低於理論值得枚舉次數找到碰撞。王小云的主要工做是給出了MD5,SHA-0的碰撞,以及SHA-1的理論破解,例如她證實了160位SHA-1,只須要大約2^69次計算就能找出來,而理論值是2^80次。因此王小云的貢獻就是找到了比生日攻擊複雜度低得多算法來快速找到一對強碰撞,弱碰撞依舊是不行的。
hash函數經常使用在密碼加密中,這樣即便密碼泄露也沒法反向獲得明文密碼。可是能夠事先獲得一些字符的hash值,而後對比這個hash值獲得明文密碼,這就是常見的彩虹表破解。因此爲了提升安全性,一些網站還會對密碼加salt後再進行hash計算,這邊所謂的salt就是幾位隨機字符串。接下來重點說下hash函數在區塊鏈中的應用。哈希算法在區塊鏈系統中的應用很普遍:比特幣使用哈希算法經過公鑰計算出錢包地址、區塊頭以及交易事務的哈希值,梅克爾樹結構自己就是一顆哈希樹,就連挖礦算法都是使用的哈希值難度匹配;以太坊中的挖礦計算也使用哈希算法,其中的梅克爾-帕特里夏樹一樣也是一顆哈希樹。下面就舉兩例說明下hash在區塊鏈中的重要性。
一:梅克爾樹
在區塊主體中,全部交易信息先進行兩個一組的哈希計算,這種結構叫作梅克爾樹(Merkle Tree),並且是一棵倒掛的樹。例如一個區塊裏只有4筆交易,則默克爾樹生成過程。
二:Hash挖礦那hash在區塊鏈中最爲人知的應用是hash挖礦,那這究竟是怎麼一回事呢?例如比特幣中的挖礦,簡單來講,即要找出相似 00010000000000000000000000000000 的目標hash。後面挖礦愈來愈困難,就是由於要找到hash值愈來愈小。因此,能夠簡單理解爲挖礦就是找出某隨機數的hash使得比目標hash還要小。