天天看點

區塊鍊之旅(四)雙花攻擊、博弈論、Hash函數、數字簽名

雙花攻擊

簡介

“雙花”,即一筆錢被花了兩次或者兩次以上,也叫“雙重支付”

“雙花攻擊”,又叫“雙重消費攻擊”,即同一筆資金,通過某種方式被花費了兩次,取得了超過該筆資金的服務。

實作

在确認前的雙花:零确認的交易本來就可能最後沒有寫入區塊鍊。除非小額,最好至少等确認即可規避此類雙花。

在确認後的雙花:這就要控制超50%算例才能試試。即類似于一個小分叉,将給一個商店的交易放入孤立區塊中。這種确認後的雙花,很難實施,隻是理論上可行。

案例

2018年發生的比特币黃金(BTG)的雙花攻擊。BTG當時是全球第27大的加密貨币。攻擊者控制BTG網絡上51%以上的算力(具體百度)

博弈論

博弈論又被稱為對策論(Game Theory)即是現代數學的一個新分支,也是運籌學的一個重要學科。博弈論是區塊鍊的數學基礎理論,區塊鍊是基于一個分布式網絡技術,在分布式網絡上,任何一個節點獲得資訊的權利是對等的,你能在這個系統上得到的任何資訊,另外一個人也完全能夠得到。

關鍵概念

納什均衡:納什均衡是博弈論的一個解決方案。假設每個參與者都知道其他參與者的政策的情況下,沒有參與者可以通過改變自身政策使自身受益的一個概念。

謝林點:這也是博弈論的一個解決方案。是指人們在沒有溝通的情況下的選擇傾向,做出這一選擇可能因為他看起來自然、特别、或者與選擇者有關。

模型

決策者:例如公司董事長

戰略:未來推動公司發展而做出的決定

回報:政策的結果

分類

根據參與者之間是否具有限制力的協定,博弈可分為。

合作博弈:研究合作中如何配置設定利益的問題,目的是使得協定架構内所有參與者都滿意,例如歐佩克組織。

非合作博弈:隻争取對自己最大化的利益,不考慮其他參與者的利益,與其他參與者之間沒有共同遵守的協定

根據參與者選擇政策、做出決定的先後順序,博弈可分為。

靜态博弈:參與者的政策又先後,但後做的政策的參與者并不知道其他參與者的政策,例如石頭剪刀布遊戲。

動态博弈:後的參與者知道其他參與者提前選擇的政策,如下象棋。

根據對其他參與者的資訊掌握程度,博弈分為。

完全資訊博弈:博弈中對其他參與者的特征、利益、可能選擇的政策等資訊有一個準确的了解,反之就是不完全資訊博弈。

按照結果可分為。

零和博弈、負和博弈、正和博弈(雙赢博弈)

Hash函數

一種算法,也稱散列函數,消息摘要函數,單向函數或雜湊函數,任意程度的二進制資料映射為固定長度的二進制資料。

特點

确定性:對同一個輸入的資料,無論重複計算多少次,結果相同。

單向性:hash函數的數學原理無逆運算,不能将hash值轉換成加密前的資訊。

隐秘性:已知hash值的情況下,沒有可行的辦法算出函數的輸入值。、

防篡改:任何微小的輸入都有可能對輸出産生巨大的影響。

抗碰撞:任意兩個不同的資料庫,hash值相同的可能性極小。

MD系列、SHA系列

MD5

package main
import(
    "fmt"
    "crypto/md5"
    "encoding/hex"
)
func main(){
    //方法一
    data:=[]byte("hello world")
    s:=fmt.Sprintf("%x",md5.Sum(data))
    fmt.Println(s)
    //方法二
    h:=md5.New()
    h.Write(data)
    s= hex.EncodeToString(h.Sum(nil))
    fmt.Println(s)
}      

SHA256

package main
import(
    "fmt"
    "github.com/nebulasio/go-nebulas/crypto/hash"
    "encoding/hex"
    "crypto/sha256"    
)

func main(){
    //方法一 一個方法直接輸出
    data:=[]byte("hello world")
    hash:=hash.Sha256(data)
    fmt.Println(hex.EncodeToString(hash))
    sha256.New()
    //方法二 按照步驟一步一步輸出
    h:= sha256.New() //建立sha256算法
    h.Write(data)  //用sha256算法對參數a進行加密,得到8個變量
    hashTemp := h.Sum(nil)//将8個變量相加得到最終hash
    fmt.Println(hex.EncodeToString(hashTemp))
}      

數字簽名

數字簽名在資訊安全,包括身份認證、資料完整性、不可否認性以及匿名性有着重要應用,是吸納帶密碼學的重要分支。簽名隸屬于公鑰密碼學。

簽名過程:發送方用自己的私鑰對發送資訊進行所謂的加密運算,得到一個hash值,該hash值就是簽名。使用時需要将簽名和資訊發給接收方。接受者用發送方公開的公鑰和接收到的資訊對簽名及逆行驗證,通過認證,說明接受到的資訊是完整的,準确的,否則說明消息來源不對。

普通簽名

簽名隻是用一把私鑰,并且是發送方自己進行的簽名動作,這類簽名就是普通簽名,常用的簽名方法有很多,包括RSA數字簽名,DSS數字簽名,ElGamal數字簽名,ECDSA數字簽名

eg:

ECDSA簽名對資料helloworld進行簽名,上鍊之前需要先進行驗證,驗證通過之後才能上鍊。

基本過程

通過ecdsa.GenerateKey産生一私鑰;輸出的私鑰是指針類型。

通過私鑰産生公鑰

對資料進行hash運算,實際公鍊中就是挖礦過程

未來可以給任何長度的data進行簽名,我們建立自己的簽名方法。

驗證資料是否合法,也就是通過公鑰對簽名進行驗證,通過後才能對資料進行上鍊動作。

群簽名

入群:群成員在入群之前候會給群管理進行申請入群,通過後,申請人會和群管理者達成互動式協定,該協定可生成群成員的私鑰。群管理者隊該密鑰進行簽名,并頒發給申請人,完成入群。群成員群管理者将群公鑰對外開放。

簽名:群成員通過自己的群密鑰和群公鑰對消息進行簽名,擷取群簽名。

驗證:通過輸入群公鑰和群簽名用公開的某種驗證方法進行驗證,傳回值隻有真假,驗證者無法計算得到簽名者是群公鑰裡的具體成員,隻知道該簽名屬于群公鑰裡面,可以代表群體。

追蹤:群管理者可以通過群簽名得到具體是哪個群成員進行去拿命的。

群簽名是一個中心化的簽名結構,該結構的算法都是群管理者定的,造成簽名者的隐私沒有左到真正的保證。

關鍵要素

隻有群體中合法成員才能代表整個群體進行簽名。

接收者可以用群公鑰驗證群簽名的合法性,但不知道群簽名使群體中具體哪個成員所簽。

在發生争議時,群管理者可以識别出實際的簽名者。

環簽名

可以認為是不可追蹤的群簽名,實際的操作過程都是自己完成的,沒有群管理者。

簽名者是某個群體的成員,他把其他群體的公鑰拿來并加上自己的公鑰組成一個群公鑰,然後用自己的私鑰和群公鑰要釋出的資訊進行環簽名。接收者接受到群公鑰、簽名、和資訊,然後對簽名進行驗證,如果簽名來自群公鑰,那麼驗證成功,否則消息不合法。

群公鑰中的簽名者的公鑰隻是迷惑作用,并不對資料進行任何操作。

形成的簽名因為是每個其他群公鑰産生的資料和自己用私鑰産生的資料組成的環,自己的資料隐藏環中,攻擊者很難找到簽名者的公鑰,是以簽名者的隐私很好的被保護起來了。

盲簽名

盲簽名允許使用者獲得一個消息的簽名,而簽名者即不知道該消息的内容,也不知道該消息的簽名。

盲簽名可用于需要提供匿名性的密碼協定中,如電子投票和電子現金。

基本組成:

消息盲化:使用者利用盲因子對要簽名的資訊進行盲化處理,然後将盲化後的消息發送給簽名者。

盲消息簽名:簽名者對盲化後的消息進行簽名,是以他并不知道真實消息的具體内容。

恢複簽名:使用者除去盲因子,得到真實消息的簽名。

零知識證明

實質上是一種涉及兩方或更多方的協定,即兩方或更多方完成一項任務所需要采取的一系列步驟。證明者向驗證者證明并使其相信自己知道或擁有某一消息,當證明過程不能向驗證者洩露任何關于被證明消息的資訊。

簡單了解,就是證明者能夠在不向驗證者提供任何有用資訊的情況下,讓驗證者相信你。