在(zai)(zai)最(zui)(zui)低層,和哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)下拉列表類(lei)似(si),你們把(ba)信(xin)息分紅小的(de)信(xin)息塊,有相(xiang)對(dui)地哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)和它(ta)表示。同時往前(qian)走,并(bing)就(jiu)不是(shi)立(li)即去運算根(gen)哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi),是(shi)把(ba)相(xiang)臨的(de)兩哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)統一成小個(ge)(ge)字(zi)段(duan)串(chuan),而后運算在(zai)(zai)這種字(zi)段(duan)串(chuan)的(de)哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi),也許每兩哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)就(jiu)接(jie)婚生子,收(shou)獲(huo)(huo)(huo)了一堆個(ge)(ge)”子哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)“。要是(shi)最(zui)(zui)低層的(de)哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)人數是(shi)單數,那到最(zui)(zui)后的(de)一定(ding)出顯兩個(ge)(ge)單身哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi),在(zai)(zai)這種前(qian)提(ti)就(jiu)立(li)即對(dui)它(ta)展開哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)運算,因為能夠收(shou)獲(huo)(huo)(huo)了它(ta)的(de)子哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)。之(zhi)后往前(qian)推,我依(yi)然(ran)是(shi)類(lei)似(si)的(de)玩法,會(hui)收(shou)獲(huo)(huo)(huo)了狀況比較少的(de)新4級哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi),結果一定(ding)轉變成小棵下跌情況的(de)樹,到樹根(gen)的(de)在(zai)(zai)這種位址,這第二代就(jiu)其余兩個(ge)(ge)根(gen)哈(ha)(ha)(ha)(ha)(ha)(ha)(ha)希(xi)(xi)(xi)(xi)(xi)了,你們把(ba)它(ta)是(shi)指 Merkle Root。
Merkle Tree的(de)胡特(te)進程的(de)value是(shi)數(shu)(shu)值資料(liao)源偏序的(de)單位數(shu)(shu)值資料(liao)源甚至單位數(shu)(shu)值資料(liao)源HASH。
非花葉接(jie)點的(de)(de)value是(shi)會確定它下部因此(ci)的(de)(de)花葉接(jie)點值,其次確定Hash算法(fa)(fa)為(wei)基(ji)礎計算方法(fa)(fa)而獲得(de)的(de)(de)。
談談OSNMA來(lai)說一,選定一堆個16個樹(shu)小(xiao)編網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)的(de)個性化默克爾樹(shu),16個樹(shu)小(xiao)編網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)分開(kai)相匹配(pei)m0~m15,對mi完成(cheng)次(ci)哈(ha)希,則得以(yi)X(0,i),因此樹(shu)從底(di)向下,第0層(ceng)的(de)網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)樹(shu)木為(wei)16,第3層(ceng)的(de)網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)數(shu)為(wei)8,第2層(ceng)的(de)網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)數(shu)為(wei)4,再者層(ceng)的(de)網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)數(shu)為(wei)2,第三層(ceng)網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)數(shu)為(wei)1,也(ye)是根網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)。向下一半,網(wang)(wang)絡(luo)結(jie)點(dian)(dian)(dian)數(shu)少半是擔心選定的(de)不(bu)是個徹底(di)二叉樹(shu)。在當中mi的(de)值是由公(gong)匙(chi)類(lei)形+公(gong)匙(chi)序號+公(gong)匙(chi)構(gou)成(cheng),這也(ye)就關系來(lai)了osnma電(dian)上(shang)面的(de)介紹(shao)中運(yun)用的(de)加(jia)密文(wen)件梯度(du)下降法的(de)核(he)驗(yan)。
OSNMA中(zhong)借助(zhu)默(mo)克(ke)爾樹(shu)無縫對(dui)接接收DSM-PKR華圖共(gong)秘(mi)鑰(yao)的手機(ji)驗(yan)證,是可以通過hash不(bu)宜逆和只需要(yao)播發四種端點(dian)加在公共(gong)性秘(mi)鑰(yao)自家(jia)產生一(yi)位(wei)端點(dian),構成的五個端點(dian)就行(xing)實(shi)現對(dui)根端點(dian)的驗(yan)校。現實(shi)舉一(yi)位(wei)事列就很輕易知道了(le)。
ICD中,MID是可以提示所選(xuan)播發(fa)的DSM-PKR中的共公秘鑰的相匹(pi)配的社會(hui)關系(xi),舉例(li)說明(ming)MID=0的之時 ,mi=私鑰多種類型(xing)+0+私鑰,另再播發(fa)布X(0,1),X(1,1),X(2,1),X(3,1)。驗校步驟流程是那(nei)樣的,
獨一步驟mi通過sha-256得以X(0,0)
第五(wu)步將X(0,0)+X(0,1),接著對一(yi)起(qi)的的數據展開(kai)sha-256操(cao)作(zuo)方(fang)法,應納稅(shui)所得(de)額導(dao)致標簽為X(1,0)
第(di)四步(bu)將X(1,0)+X(1,1),以后(hou)對結合的資料(liao)實施sha-256操作步(bu)驟,所得到(dao)導致記(ji)號(hao)為X(2,0)
4.步將X(2,0)+X(2,1),第二步對一起的(de)數據表格做好sha-256操作(zuo)的(de),所得(de)稅效果標出(chu)為X(3,0)
五 步將(jiang)X(3,0)+X(3,1),以后對求和的統計資料做好sha-256實際操作,得到(dao)的沒想到(dao)標簽(qian)為(wei)X(4,0)
X(4,0)也(ye)是根進程,與從安全服(fu)務使用的根進程去較(jiao)既能知(zhi)曉校檢需(xu)不需(xu)要都(dou)可以借助。
相對一些的(de)MID,只需(xu)要將步奏中的(de)下表安裝相對表格中中選(xuan)出的(de)實行替代(dai),注意事項(xiang)是一個致的(de)。
python實例
'''現(xian)實用到的(de)(de)是(shi)(shi),不要(yao)有確定這(zhe)樣(yang)縝密,簡單(dan)做兩個簡化(hua)版的(de)(de)merkleTree,就好使用在OSNMA的(de)(de)工(gong)作任務。因OSNMA的(de)(de)merkleTree的(de)(de)建(jian)筑(zhu)高度(du)和接點數是(shi)(shi)調整的(de)(de)
'''
class OSNMAMerkleTree:
def __init__(self,hashFun):
self.hashFun = hashFun
self.allNodes=dict()#很多(duo)時間的數(shu)據庫(ku)食用倆個(ge)數(shu)碼(ma)表達(da)出來(lai),第一名個(ge)表達(da)出來(lai)層,其次個(ge)表達(da)出來(lai)這(zhe)的一層的第好多(duo)個(ge)
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
] #只需要的構件表
def AddLayer(self,floorindex,nodeSize):
for i in range(nodeSize):
leftNodeValue=self.allNodes[(floorindex,index)] #獲得正(zheng)中間子端點(dian)統計(ji)資(zi)料
rightNodeValue=self.allNodes[(floorindex,index+1)]#認定(ding)左面子子域資(zi)料(liao)
blocktmp=leftNodeValue+rightNodeValueself.allNodes.update({(floorindex+1,indexkey):self.hashFun(blocktmp).digest()})#計算(suan)出來父接點(dian)的數(shu)據信(xin)息(xi)
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)
#有(you)表示的構件
def GetNodeValue(self,floor,index):
return self.allNodes[(floor,index)]
#刷出mi應對(dui)的七個(ge)接點(dian)
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為樹葉子(zi)網絡節點
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]