在(zai)最(zui)下層,和哈(ha)(ha)(ha)希(xi)(xi)所(suo)(suo)有只要,公司把(ba)數(shu)據文(wen)(wen)件統計提成小(xiao)的(de)數(shu)據文(wen)(wen)件統計塊,有相關聯地哈(ha)(ha)(ha)希(xi)(xi)和它(ta)對(dui)應著。只不(bu)過往(wang)里走,并如不(bu)是(shi)(shi)會直接(jie)性去運算根(gen)哈(ha)(ha)(ha)希(xi)(xi),而(er)且把(ba)相距(ju)的(de)兩(liang)種哈(ha)(ha)(ha)希(xi)(xi)合(he)并為連(lian)成一(yi)片個(ge)標(biao)識(shi)符(fu)串,再運算在(zai)此(ci)標(biao)識(shi)符(fu)串的(de)哈(ha)(ha)(ha)希(xi)(xi),只要每(mei)兩(liang)種哈(ha)(ha)(ha)希(xi)(xi)就(jiu)(jiu)婚(hun)嫁生子(zi),得見有一(yi)兩(liang)個(ge)多個(ge)”子(zi)哈(ha)(ha)(ha)希(xi)(xi)“。如最(zui)下層的(de)哈(ha)(ha)(ha)希(xi)(xi)數(shu)是(shi)(shi)單數(shu),那到后來肯定誕生有一(yi)兩(liang)個(ge)單身哈(ha)(ha)(ha)希(xi)(xi),這(zhe)一(yi)環境就(jiu)(jiu)會直接(jie)性對(dui)它(ta)開展哈(ha)(ha)(ha)希(xi)(xi)運算,所(suo)(suo)有還能(neng)得見它(ta)的(de)子(zi)哈(ha)(ha)(ha)希(xi)(xi)。于似乎(hu)往(wang)里推,依舊會是(shi)(shi)只要的(de)方(fang)試,會得見總(zong)數(shu)較(jiao)少的(de)新4級(ji)哈(ha)(ha)(ha)希(xi)(xi),最(zui)后肯定形連(lian)成一(yi)片棵倒垂(chui)的(de)樹,至樹根(gen)的(de)在(zai)此(ci)區域,這(zhe)一(yi)代(dai)人就(jiu)(jiu)剩有一(yi)兩(liang)個(ge)根(gen)哈(ha)(ha)(ha)希(xi)(xi)了,公司把(ba)它(ta)能(neng)稱之為 Merkle Root。
Merkle Tree的花(hua)葉分(fen)支(zhi)的value是信息匯總的標(biao)段信息以及標(biao)段信息HASH。
非(fei)小(xiao)葉(xie)頂點(dian)的value是(shi)利用它今(jin)天(tian)其(qi)他的小(xiao)葉(xie)頂點(dian)值,接下來以Hash數學模型算起(qi)而(er)得到的。
相對(dui)OSNMA言之(zhi),選用(yong)好幾個(ge)個(ge)16個(ge)花小(xiao)編點(dian)位(wei)(wei)的(de)(de)(de)特別默克爾樹,16個(ge)花小(xiao)編點(dian)位(wei)(wei)各(ge)分為(wei)(wei)(wei)相對(dui)應m0~m15,對(dui)mi實(shi)(shi)施(shi)一遍哈希,則實(shi)(shi)現X(0,i),這些樹從底(di)向上,第(di)0層的(de)(de)(de)點(dian)位(wei)(wei)個(ge)數(shu)為(wei)(wei)(wei)16,首位(wei)(wei)層的(de)(de)(de)點(dian)位(wei)(wei)數(shu)為(wei)(wei)(wei)8,第(di)2層的(de)(de)(de)點(dian)位(wei)(wei)數(shu)為(wei)(wei)(wei)4,然后層的(de)(de)(de)點(dian)位(wei)(wei)數(shu)為(wei)(wei)(wei)2,第(di)七層點(dian)位(wei)(wei)數(shu)為(wei)(wei)(wei)1,也是根點(dian)位(wei)(wei)。向上一,點(dian)位(wei)(wei)數(shu)少半(ban)是由(you)(you)于選用(yong)的(de)(de)(de)不是個(ge)已經二叉(cha)樹。在其中mi的(de)(de)(de)值是由(you)(you)公(gong)開密鑰類(lei)形+公(gong)開密鑰順序號+公(gong)開密鑰構成(cheng)的(de)(de)(de),這也就綁定至osnma電一文實(shi)(shi)用(yong)的(de)(de)(de)加密文件算法為(wei)(wei)(wei)基礎(chu)的(de)(de)(de)驗正。
OSNMA中根據(ju)默克爾樹交接做到(dao)DSM-PKR華圖共(gong)秘鑰的認(ren)證,是(shi)憑借hash無法逆(ni)和只需要播發兩個(ge)進程(cheng)(cheng)上(shang)加公眾秘鑰本人(ren)形成(cheng)(cheng)個(ge)進程(cheng)(cheng),組合(he)成(cheng)(cheng)5-7個(ge)進程(cheng)(cheng)就可成(cheng)(cheng)功完成(cheng)(cheng)對(dui)根進程(cheng)(cheng)的較驗。具體舉個(ge)事(shi)件(jian)就很(hen)易于知道了。
ICD中,MID是代替(ti)標識當下播發的DSM-PKR中的公(gong)用秘鑰的應對(dui)相互關(guan)系,舉(ju)例說(shuo)明MID=0的時分,mi=私鑰類形+0+私鑰,同時再播剛發X(0,1),X(1,1),X(2,1),X(3,1)。較驗程(cheng)序(xu)是這樣的話的,
首先步mi實施sha-256能(neng)夠X(0,0)
第(di)五步將(jiang)X(0,0)+X(0,1),第(di)二對累加的(de)數據資料展開sha-256實操,所(suo)得的(de)結杲箭頭為X(1,0)
3步將X(1,0)+X(1,1),以后對(dui)累加的(de)數據文件采取(qu)sha-256運行(xing),所獲資(zi)金最終符號為X(2,0)
第七步將X(2,0)+X(2,1),再對(dui)一(yi)起的統(tong)計(ji)數據來(lai)sha-256控制,所得額沒想到標記(ji)圖片為(wei)X(3,0)
五 步(bu)將(jiang)X(3,0)+X(3,1),如果對之和的數據信息展開sha-256運作,所述(shu)可是標志為X(4,0)
X(4,0)在于(yu)根連接點(dian),與從售后服務保存的根連接點(dian)開始特別可以(yi)了不知道校正是否有才可以(yi)借助。
相(xiang)使用其他(ta)的(de)MID,只需(xu)要將具體步驟中(zhong)的(de)下(xia)表確定相(xiang)使用圖表中(zhong)寫出的(de)來進行替代,程序流程是(shi)致的(de)。
python實例
'''實際上的使用的的時候,不應該(gai)考慮的這(zhe)樣很復(fu)雜,會直(zhi)接做一優化的merkleTree,能夠用以OSNMA的本職工作。是因為OSNMA的merkleTree的數(shu)層和構件(jian)數(shu)是固(gu)定不動的
'''
class OSNMAMerkleTree:
def __init__(self,hashFun):
self.hashFun = hashFun
self.allNodes=dict()#全部(bu)組(zu)件的(de)資料適用倆個加(jia)數寫出(chu),獨某(mou)個寫出(chu)層,然后(hou)個寫出(chu)這(zhe)一的(de)第(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
] #只需要的點(dian)位表
def AddLayer(self,floorindex,nodeSize):
for i in range(nodeSize):
leftNodeValue=self.allNodes[(floorindex,index)] #完成左(zuo)面子連接點數據分析
rightNodeValue=self.allNodes[(floorindex,index+1)]#具有(you)上邊子點位的(de)數據
blocktmp=leftNodeValue+rightNodeValueself.allNodes.update({(floorindex+1,indexkey):self.hashFun(blocktmp).digest()})#計算出(chu)父連接(jie)點(dian)的數(shu)據分(fen)析
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)
#獲取對應著的組件
def GetNodeValue(self,floor,index):
return self.allNodes[(floor,index)]
#得到 mi表示的五(wu)個端點
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為花葉(xie)子組件
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]