一.寫在前面git
本系列的內容主要是來自於肖臻老師的區塊鏈技術於應用的公開課和一些本身的理解。這節的主要內容爲比特幣中運用到的密碼學原理,主要是兩部分hash和簽名。如下內容按這兩部分來展開。算法
二.cryptographic hash fucntion安全
在密碼學中用到的hash被稱爲cryptographic hash fucntion,中文譯爲密碼散列函數。它主要有三個特性,分別是collision resistance、hiding和puzzle friendly函數
2.1 collision resistance區塊鏈
collision resistance即抗碰撞性。所謂的碰撞就是在使用hash的過程當中所沒法避免的hash衝突。hash衝突是指假設有輸入x,y以及hash函數h,當有x不等於y時,卻出現h(x) = h(y)。因爲輸入空間和對應映射的輸出空間的差距,hash碰撞是不可避免的。具體而言假設hash輸出的結果爲256比特位,則輸出空間爲2256,而輸入空間是無限的,顯然碰撞是必定會發生的。那這裏所謂的抗碰撞性是指什麼呢?實際上是指當你已有x以及h(x)這兩個值,除了使用暴力求解的方式,沒有什麼有效的方式去找到一個y使h(y)=h(x),同時暴力求解的代價很是高。簡單的說就是人爲製造hash碰撞幾乎是不可能。那麼這個特性能夠運用在什麼地方呢?經過上述所講能夠發現,幾乎是找不到一個y使它的hash值與x的hash值相同,也就意味着一旦x發生修改,對應的hash值也會發生改動,能夠運用這點對信息作摘要。比方說你將一個文件進行hash獲得hash值,並將hash值保存在本地,而後將文件上傳到網盤保存,當你再次從網盤下載迴文件時如何判斷文件是否被修改,只須要再對網盤計算一次hash值便可,比較此次的hash值與以前保存在本地的hash值是否一致便可判斷出文件是否被修改。加密
2.2 hiding文件上傳
hiding即隱匿性。簡單的說就是指hash的過程是不可逆的。具體而言如今有x和它的hash值h(x),除了暴力求解遍歷全部輸入的方式,沒什麼好的辦法能從hash值h(x)推出x的內容,即hash值不會泄露輸入的信息。要作到hiding的這一特性,它對輸入是有要求的,必須知足輸入空間足夠大和各類輸入的可能性較爲平均這兩點。只有知足這兩點才能夠作到除了暴力求解沒什麼有效的方式能夠進行逆hash運算且暴力求解的代價極大。在實際的使用當中爲了作到這兩點經常須要對輸入的數據x再鏈接上一連串的隨機數從而知足上述的要求。當某hash函數具有了collision resistance和hiding這兩點時,咱們就能夠實現digital commitment(數字化承諾)或者a digital sealed envelope(數字密封信封)。舉個例子,假設這麼一個情景,甲代表本身能夠預測明日哪支股票大漲,那麼該如何證實甲的預測是否正確,顯然若是在當下直接公佈甲的預測結果並等到明日觀察股市狀況來驗證這種方式是不可行,由於股市極可能受到甲預測的影響,比方說甲是巴菲特,那麼明日的股市或多或少都將受到影響,這樣驗證的過程就將變得不許確。一種可行的方式是將甲預測的結果寫入信封,密封好交由第三方安全機構等明日股市狀況出來後再公開。而當hash函數具備collision resistance和hiding這兩種特性時,咱們就能夠先對預測進行hash而後直接公佈於衆,首先因爲hiding的特性,預測的內容是沒法知曉的,也就沒法影響到股市的發展,其次因爲collision resistance的緣由,預測的內容是沒法篡改的,也就作到了和信封同樣的效果。hash
2.2 puzzle friendlyit
puzzle friendly即謎題的友好性。除了經過使用hash函數去計算hash的值,沒有其餘什麼方法能讓你僅僅經過輸入的數據判斷出它的hash值是怎麼樣的。舉個例子假設爲256比特位的hash結果,如今須要的是前k位爲0的hash的結果,除了去一個個試探每一個輸入值的hash結果判斷結果是否知足這個特徵以外沒有其餘有效的辦法能讓你直接看出哪一個輸入會有這樣的hash輸出。這個特性有什麼做用呢?它主要體如今它是比特幣挖礦過程工做量證實的基礎。常說的比特幣挖礦的過程,其實就是求解一個長隨機數n,這個n和區塊鏈中的區塊的塊頭組成輸入信息x,使x的hash值h(x)落在某個指定的範圍內。因爲puzzle friendly的緣由,只能經過一個個遍歷輸入的方式去尋找這個n而沒有其餘捷徑尋找到這個隨機數n,而這個尋找隨機數的過程就是工做量的證實。io
三.簽名
簽名是屬於非對稱的加密方法。有非對稱加密算法天然也就有對稱算法,二者的區別在於在加密和解密的過程當中是否使用相同的密鑰。對稱加密算法在加密和解密的過程當中使用相同的密鑰,這就帶來了密鑰分配和運輸的問題。而非對稱密鑰很好的解決了這個問題,每一個個體都擁有一對密鑰,稱爲公鑰和私鑰,私鑰保存在本地,公鑰則向全體公開,解決了密鑰分配和運輸的問題。是否可能經過不斷產生公私鑰對同時比較是否有和其餘人一致的公鑰從而破解出私鑰的情形?這種狀況發生的機率極低,能夠忽略不記。當採用非對稱加密算法時,當某個個體想向另外一個個體發送信息時,只須要將信息使用對方的公鑰加密便可,當對方收到後,再用本身的私鑰解密。而所提到的簽名就是要證實信息是本人發送的,只須要對所發送的信息使用私鑰進行加密,接受方想進行驗證只要使用公鑰進行解密便可,若爲其餘人冒名,則解密出來的信息將是沒法被理解的,也就知曉冒名現象的發生。
四.寫在最後
對區塊鏈方面感興趣的同窗能夠加個好友,你們一塊兒討論一下。