近期區(qū)塊鏈中 PoC(Proof of Capacity)共識機制越來越火。在市面中正在使用 PoC 共識機制的幣就有 Burst、BTCHD 等。由于 PoC 的自身機制,使得其對加密函數(shù)的復(fù)雜度和運算速度有一定的要求,而 Shabal 函數(shù)正好可以實現(xiàn)這個特殊的需求,所以在 BurstCoin 中,廣泛使用 Shabal 算法作為 PoC 共識的基礎(chǔ)。
Shabal 名字來源于一位名為 S′ebastien Chabal 的法國橄欖球運動員,因為其比賽時的勇猛表現(xiàn)和他那標(biāo)志性的胡須和長發(fā),被人起了個綽號叫“穴居人”,可見當(dāng)時 Shabal 的團(tuán)隊對于他們研發(fā)的算法的期望是很高的。
Shabal 函數(shù)是加密哈希函數(shù)的一種,由法國代理商(ANR)組織和研究的一個項目,其團(tuán)隊成員均為業(yè)界有一定影響力的人物。Shabal 在名字上與常用的另一種加密哈希函數(shù) SHA-256 相似,但實則完全不同。SHA-256 全稱為(Secure Hash Algorithm),即安全哈希算法,是美國國家安全局(NSA)設(shè)計,美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布的一系列密碼散列函數(shù)的一個變體。而 Shabal-256 是 Shabal 函數(shù)的一個變體,作為標(biāo)準(zhǔn)哈希函數(shù)的競爭者之一被提交給 NIST,雖然最后 Shabal 并沒有被選中,但是因為其優(yōu)秀的性能和特點,也越來越廣泛地被大家所認(rèn)知。
Shabal 算法
Shabal算法是一種很慢的算法,允許輸入任意長度的有序位序列,甚至是一個空序列。也適應(yīng)任何長度的字節(jié)流,但是由于考慮到安全性,適用長度最好小于 2^7 位。輸入長度可以是任何整數(shù)值和8的倍數(shù)。假如給定一個bit序列,按其左右順序索引編號,即第一位的索引為0。使用左和右來描述有序的位序列:序列中的第一位稱為最左位,最后一位稱為最右位。
Shabal的使用的數(shù)據(jù)(數(shù)據(jù)的預(yù)處理):首先輸入序列,即以默認(rèn)方式添加額外的長度不等于0并且是32的倍數(shù)的bit數(shù)加入序列,然后將序列分成8位組,此時一個組即為一個byte(字節(jié))。第一個字節(jié)由最左邊的八位組成,接下來的八位為第二個字節(jié),依此類推。由于輸入的序列長度是32的倍數(shù),所以這個過程中會產(chǎn)生整數(shù)個字節(jié),并且字節(jié)數(shù)是4的倍數(shù)。每個字節(jié)的值都在0和255之間(包括255)。
此時字節(jié)值可以看做是以 2 為基底從 8 位的序列中派生出來的,此時最左邊的字節(jié)是最重要的(其代表了數(shù)的正負(fù))。如果一個八位的位組被表示為 b0,b1,b2.。.b7,那么這個字節(jié)的值等于
在 byte 字節(jié)產(chǎn)生時,會給最左邊的位自動設(shè)置為 1(即表示為一個正數(shù))。所以當(dāng)所給這個字節(jié)輸入一個 8 位的數(shù)時,其數(shù)的最大值是 128,因為最左邊的位數(shù)不表示數(shù)的大小,而表示的是數(shù)的正負(fù)。
Shabal 算法的優(yōu)點和缺點:
優(yōu)點:
1. 設(shè)計簡單:Shabal 在設(shè)計的一個目標(biāo)就是保持簡單的同時保證其安全性。
2. 安全性:Shabal 的結(jié)構(gòu)式不可微的,并且有足夠良好的次原象攻擊抗性(這一點是可以被證明的),并且這一點也是 Shabal 算法與其他的哈希算法相比的主要優(yōu)勢之一。
3. 性能相對較好:Shabal 中沒有使用其他加密算法中非常流行的 S-Box ,因為它的性能成本非常高,對于硬件和軟件都是如此。雖然使用它能夠抵抗各種各樣的攻擊,但是在這里并沒有采用它,所以 Shabal 能夠擁有相對較好的性能
缺點:
1. 速度較慢
上圖表示了在不同的平臺中不同算法的表現(xiàn)。Shabal 的表現(xiàn)處于中下游水準(zhǔn),所以Shabal是一個相對來說較慢的算法。
2.數(shù)據(jù)量相對較大:
上圖表示了不同算法的數(shù)據(jù)量,Shabal 算法也處于一個比較尷尬的位置,相對于其他算法來說,Shabal的數(shù)據(jù)量是比較大的。