在最(zui)框(kuang)架(jia),和哈(ha)(ha)(ha)希(xi)(xi)(xi)全(quan)部一(yi)(yi)(yi)模一(yi)(yi)(yi)樣(yang),他們把(ba)(ba)數(shu)據(ju)信(xin)(xin)息(xi)信(xin)(xin)息(xi)對半分小的(de)(de)(de)數(shu)據(ju)信(xin)(xin)息(xi)信(xin)(xin)息(xi)塊,有此類地(di)哈(ha)(ha)(ha)希(xi)(xi)(xi)和它相匹配的(de)(de)(de)。并(bing)且往里(li)(li)走,并(bing)不會馬上去運(yun)算根(gen)哈(ha)(ha)(ha)希(xi)(xi)(xi),還(huan)把(ba)(ba)接壤的(de)(de)(de)這(zhe)(zhe)兩(liang)(liang)哈(ha)(ha)(ha)希(xi)(xi)(xi)并(bing)成連成一(yi)(yi)(yi)片(pian)個字節(jie)(jie)串,接下來運(yun)算另(ling)一(yi)(yi)(yi)名(ming)(ming)字節(jie)(jie)串的(de)(de)(de)哈(ha)(ha)(ha)希(xi)(xi)(xi),那么每這(zhe)(zhe)兩(liang)(liang)哈(ha)(ha)(ha)希(xi)(xi)(xi)就(jiu)娶媳婦生子(zi),獲取(qu)了(le)(le)了(le)(le)個”子(zi)哈(ha)(ha)(ha)希(xi)(xi)(xi)“。若是最(zui)框(kuang)架(jia)的(de)(de)(de)哈(ha)(ha)(ha)希(xi)(xi)(xi)總量是單數(shu),那到(dao)結尾(wei)決不會現身另(ling)一(yi)(yi)(yi)名(ming)(ming)單身哈(ha)(ha)(ha)希(xi)(xi)(xi),這(zhe)(zhe)類現狀(zhuang)就(jiu)馬上對它進行哈(ha)(ha)(ha)希(xi)(xi)(xi)運(yun)算,所以(yi)說還(huan)能獲取(qu)它的(de)(de)(de)子(zi)哈(ha)(ha)(ha)希(xi)(xi)(xi)。是往里(li)(li)推(tui),我依(yi)然就(jiu)是模一(yi)(yi)(yi)樣(yang)的(de)(de)(de)方法,可以(yi)獲取(qu)數(shu)為比較少(shao)的(de)(de)(de)新兩(liang)(liang)級哈(ha)(ha)(ha)希(xi)(xi)(xi),終究決不會形連成一(yi)(yi)(yi)片(pian)棵倒掛現象的(de)(de)(de)樹,至樹根(gen)的(de)(de)(de)另(ling)一(yi)(yi)(yi)名(ming)(ming)座位,這(zhe)(zhe)那代(dai)就(jiu)剩余(yu)另(ling)一(yi)(yi)(yi)名(ming)(ming)根(gen)哈(ha)(ha)(ha)希(xi)(xi)(xi)了(le)(le),他們把(ba)(ba)它稱(cheng)作(zuo) Merkle Root。
Merkle Tree的(de)樹葉連接點的(de)value是參數報(bao)告資(zi)(zi)料(liao)(liao)并(bing)集(ji)的(de)單元(yuan)參數報(bao)告資(zi)(zi)料(liao)(liao)還(huan)有單元(yuan)參數報(bao)告資(zi)(zi)料(liao)(liao)HASH。
非樹葉(xie)頂點的(de)(de)value是(shi)跟(gen)據它現(xian)在其它的(de)(de)樹葉(xie)頂點值,再采用(yong)Hash貝葉(xie)斯計算的(de)(de)而測(ce)得的(de)(de)。
面(mian)對OSNMA策略(lve)而(er)言,選好幾(ji)個(ge)個(ge)16個(ge)胡(hu)特進(jin)(jin)程(cheng)(cheng)的個(ge)性化默克爾樹,16個(ge)胡(hu)特進(jin)(jin)程(cheng)(cheng)各是(shi)(shi)相應m0~m15,對mi開始次哈希,則到X(0,i),所以咧(lie)樹從底往下(xia)提(ti),第(di)0層(ceng)(ceng)的進(jin)(jin)程(cheng)(cheng)數量英文(wen)為(wei)(wei)16,第(di)六(liu)層(ceng)(ceng)的進(jin)(jin)程(cheng)(cheng)數為(wei)(wei)8,第(di)2層(ceng)(ceng)的進(jin)(jin)程(cheng)(cheng)數為(wei)(wei)4,3、層(ceng)(ceng)的進(jin)(jin)程(cheng)(cheng)數為(wei)(wei)2,第(di)六(liu)層(ceng)(ceng)進(jin)(jin)程(cheng)(cheng)數為(wei)(wei)1,也是(shi)(shi)根進(jin)(jin)程(cheng)(cheng)。往下(xia)提(ti)一點,進(jin)(jin)程(cheng)(cheng)數少(shao)半是(shi)(shi)這(zhe)是(shi)(shi)由于選的是(shi)(shi)一個(ge)個(ge)充分(fen)二叉(cha)樹。在這(zhe)其中mi的值是(shi)(shi)由公開密(mi)(mi)鑰分(fen)類+公開密(mi)(mi)鑰標碼+公開密(mi)(mi)鑰構(gou)成,這(zhe)也就綁定qq至osnma電(dian)一文(wen)使用的的進(jin)(jin)行(xing)加密(mi)(mi)算法流程(cheng)(cheng)圖的手機驗證(zheng)。
OSNMA中進行默克爾樹合作退(tui)回(hui)DSM-PKR華圖共秘(mi)鑰的(de)驗正(zheng),是借助hash不易逆和只需要播(bo)發六個分支(zhi)(zhi)配上公用秘(mi)鑰自已產(chan)生有一家分支(zhi)(zhi),構造幾個分支(zhi)(zhi)即刻來完成對根分支(zhi)(zhi)的(de)較(jiao)驗。現實情況舉有一家舉例說明就(jiu)很(hen)比(bi)較(jiao)容易搞清楚了(le)。
ICD中(zhong),MID是用(yong)做(zuo)標(biao)識在當下(xia)播發的(de)(de)(de)DSM-PKR中(zhong)的(de)(de)(de)通用(yong)秘鑰的(de)(de)(de)相對感情,舉例說(shuo)明MID=0的(de)(de)(de)之后,mi=公開(kai)密(mi)鑰類行+0+公開(kai)密(mi)鑰,另一個再播只發X(0,1),X(1,1),X(2,1),X(3,1)。檢驗環節是這類的(de)(de)(de),
第一個步mi對其進(jin)行sha-256獲得(de)X(0,0)
其二步將X(0,0)+X(0,1),其次對之(zhi)和的數據(ju)顯(xian)示實行(xing)(xing)sha-256運(yun)行(xing)(xing),得(de)出最終標識為X(1,0)
其次步將X(1,0)+X(1,1),而后對一(yi)起(qi)的大數據(ju)參與sha-256運營,應納(na)稅所(suo)得額結杲標記符(fu)號為X(2,0)
第(di)四點步將X(2,0)+X(2,1),第(di)二步對結(jie)合的數據表格實行(xing)sha-256操(cao)作步驟,得(de)到結(jie)果記號為X(3,0)
五步(bu)將X(3,0)+X(3,1),以后對(dui)累(lei)加的的數據開始sha-256進(jin)行,得出最終標記圖片(pian)為X(4,0)
X(4,0)就是(shi)根(gen)點位,與從(cong)服務使(shi)用(yong)的(de)根(gen)點位做出相對(dui)既(ji)可以(yi)要知道檢定可不可以(yi)是(shi)可以(yi)順利通過(guo)。
分(fen)(fen)別另外的(de)(de)的(de)(de)MID,只(zhi)需要將步(bu)湊中(zhong)的(de)(de)下表是(shi)以(yi)分(fen)(fen)別表格(ge)格(ge)式中(zhong)寫(xie)出的(de)(de)采取代替,工藝流程也是(shi)致的(de)(de)。
python實例
'''事實上動用的(de)(de)是,不(bu)需注重(zhong)那繁雜,直觀做(zuo)1個簡化版(ban)的(de)(de)merkleTree,就可(ke)以了(le)用來(lai)OSNMA的(de)(de)做(zuo)工作。為了(le)OSNMA的(de)(de)merkleTree的(de)(de)pcb電路(lu)板層數(shu)越(yue)多和時間數(shu)是固定住的(de)(de)
'''
class OSNMAMerkleTree:
def __init__(self,hashFun):
self.hashFun = hashFun
self.allNodes=dict()#大部分接點(dian)的數(shu)值便用三個(ge)(ge)數(shu)字9表現,首(shou)個(ge)(ge)表現層,最(zui)后一個(ge)(ge)個(ge)(ge)表現這1層的第(di)幾塊
self.leafm0_15=[]
self.InterNode=[[(0,1),(1,1),(2,1),(3,1)],#m0
[(0,0),(1,1),(2,1),(3,1)],#m1
[(0,3),(1,0),(2,1),(3,1)],#m2
[(0,2),(1,0),(2,1),(3,1)], [(0,5),(1,3),(2,0),(3,1)], [(0,4),(1,3),(2,0),(3,1)], [(0,7),(1,2),(2,0),(3,1)], [(0,6),(1,2),(2,0),(3,1)], [(0,9),(1,5),(2,3),(3,0)], [(0,8),(1,5),(2,3),(3,0)],[(0,11),(1,4),(2,3),(3,0)],#m10
[(0,10),(1,4),(2,3),(3,0)],#m11
[(0,13),(1,7),(2,2),(3,0)], [(0,12),(1,7),(2,2),(3,0)], [(0,15),(1,6),(2,2),(3,0)],[(0,14),(1,6),(2,2),(3,0)],#m15
] #只(zhi)需要(yao)的分支(zhi)表
def AddLayer(self,floorindex,nodeSize):
for i in range(nodeSize):
leftNodeValue=self.allNodes[(floorindex,index)] #要先(xian)拿到靠左邊子分(fen)支數劇
rightNodeValue=self.allNodes[(floorindex,index+1)]#有(you)左側子子域統計資料(liao)
blocktmp=leftNodeValue+rightNodeValueself.allNodes.update({(floorindex+1,indexkey):self.hashFun(blocktmp).digest()})#換算父頂點(dian)的數據(ju)統計
def GeneratorMerkleTree(self,data_blocks):
if not data_blocks:
return None
self.leafm0_15 = data_blocks
self.allNodes.clear()
floorindex=0 index =0for block in data_blocks:
self.allNodes.update({(floorindex,index):self.hashFun(block).digest()})
index+=1
self.AddLayer(0,8)
self.AddLayer(1,4)
self.AddLayer(2,2)
self.AddLayer(3,1)
#作(zuo)為(wei)相匹配的(de)的(de)進程
def GetNodeValue(self,floor,index):
return self.allNodes[(floor,index)]
#取得mi對應(ying)著的十個端點
def GetMiNodes(self,miIndex=0):
Nodes=[]for i in range(4):
tmp=self.InterNode[miIndex][i]
nodedata=self.GetNodeValue(tmp[0],tmp[1])
Nodes.append(nodedata)return Nodes
def verifyRoot(self,mid,ITNS,leaf):
node = self.hashFun(leaf).digest()
for it_node in ITNS:
if mid % 2 == 0:
node = self.hashFun(node + it_node).digest()
else:
node = self.hashFun(it_node + node).digest()
mid = mid // 2
return node==self.allNodes[(4,0)]
#index為MID,mi為葉片結點
def verifycalRoot(self,MID,mi):
x0i=self.hashFun(mi).digest()
for item in self.InterNode[MID]:
ifMID%2==0:
x0i=x0i+self.allNodes[item]
else:
x0i=self.allNodes[item]+x0i
MID =MID // 2
x0i=self.hashFun(x0i).digest()
return x0i
def showallnodes(self):
for i, v in self.allNodes.items():
print(i,v)
def getAllNodes(self):
return self.allNodes
def getleafi(self,i):
return self.leafm0_15[i]