Puncte:0

Concatenare în Merkle Trees

drapel in

Luați în considerare un simplu Merkle Tree cu frunze alice +100 și bob +50. Folosind algoritmul hash SHA256, rezumatul șirurilor respective sunt:

# alice +100
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac

# bob +50
7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1

Fiind o funcție hash, SHA-256 este deterministă, deci nu contează în ce limbaj de programare implementăm acest lucru. Pentru a fi complet, acest lucru se poate face prin intermediul crypto-js bibliotecă:

const hash256 = (șir) => {
  const val = 
  require('crypto').createHash('sha256').update(string).digest('hex');
  return val;
}

# aplica
hash256('alice +100')
# rezultate:
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac

Când cineva se referă la Implementarea Merkle Tree, vedeți următoarea descriere:

Un arbore hash este un arbore de hash-uri în care frunzele sunt hash-uri ale blocurilor de date într-un fișier sau un set de fișiere, de exemplu. Nodurile mai sus în copac sunt hashe-urile copiilor lor. De exemplu, în imaginea de mai sus hash 0 este rezultatul hashingului concatenării hash 0-0 și hash 0-1. Adică hash 0 = hash( hash(0-0) + hash(0-1) ) unde + denotă concatenare.

introduceți descrierea imaginii aici

Am văzut abstracții de bibliotecă de nivel superior care implementează această concatenare în cazul Buffer.concat(), dar aș dori să știu exact cum s-ar implementa acest lucru din punct de vedere pur matematic.

S-ar presupune (incorect):

alice_hash = hash256('alice +100')
bob_hash = hash256('bob +50')
# gresit
hash256(alice_hash + bob_hash)
# greșit și: adăugarea prefixului 0x
hash256(
  '0xdc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac'
  + 
  „0x7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1” 
)

Deci, fără nicio abstracție, cum ar face cineva concatenează cele două hashuri pentru a obține nodul părinte rezultat?

Pentru oricine încearcă să ajute, valoarea corectă a hash(hash(alice) + hash(bob)) ar trebui să fie edf9a9a0e56b58fc9caccb97d85c628d5b9dc50cb94dfc41e83026d37704400f. Am încercat să adaug/eliminăm 0x prefix, adăugând un caracter spațiu între ele și niciuna dintre aceste încercări nu a fost fructuoasă.Am citit, de asemenea, lucrări pe care pot pune mâna, dar nu am ajuns niciodată mai departe decât „le concatena pentru a obține valoarea pentru nodul părinte” cu foarte puține referințe de implementare.

kelalaka avatar
drapel in
Atât răspunsul, cât și tu și sursa ta ați uitat să utilizați corect Arborele Merkle 0s 1s. [Vezi în acest răspuns](https://crypto.stackexchange.com/a/71313/18298)
Morrolan avatar
drapel ng
Pentru a detalia ceea ce a vrut să transmită @kelalaka - implementările adecvate ale arborilor Merkle vor adăuga, de obicei, un identificator al *unde în arbore* a fost elementul hashing la datele care au fost analizate. Acest lucru ajută la prevenirea anumitor tipuri de atacuri. Există diferite moduri de a face acest lucru. Unul este văzut în răspunsul legat, altul în [RFC 6962](https://www.rfc-editor.org/rfc/rfc6962.html#section-2.1) unde pur și simplu diferențiază între nodurile frunză și non-frunză.
onlyphantom avatar
drapel in
Înțeleg și apreciez cu adevărat feedbackul și linkurile de aici.Am omis celelalte detalii pentru a mă concentra pe partea de „concatenare”. Dar după răspunsul tău @Morrolan, am putut să-l dau seama și să îl implementez corect în python. Rezultatul a fost să vedem șirul hexazecimal doar ca o reprezentare. Efectuați în schimb + pe șirul binar. Multumesc pentru raspuns!
Puncte:1
drapel ng

Problema la îndemână provine din amestecarea reprezentării șirului hexazecimal („hexdigest”) a unei valori hash cu valoarea sa binară reală.

Amintiți-vă mai întâi că o funcție hash ia un șir de biți de lungime arbitrară (în scopuri practice) ca intrare și emite un șir de biți de lungime fixă. Adică funcționează binar valorile.

Ca atare, valoarea hash reală a șirului de intrare (codificat ASCII). alice +100 este o secvență de 32 de octeți. dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac este acea secvență de octeți reprezentată ca „hexdigest”, unde fiecare două caractere hexazecimale codifică un octet.

Pentru operația de concatenare, trebuie să concatenați secvențele de octeți, mai degrabă decât hexdigesturile lor.

Un exemplu în Ruby:

necesită „digerare”

m1 = 'alice +100'
m2 = 'bob +50'

d1 = Digest::SHA256.new
d2 = Digest::SHA256.new

d1 << m1
d2 << m2

pune „Alice hexdigest: #{ d1.hexdigest }”
pune „Bob hexdigest: #{ d2.hexdigest }”

d3 = Digest::SHA256.new
d3 << d1.digest
d3 << d2.digest                                                                                                                                                

pune „Concatenation hexdigest: #{ d3.hexdigest }”

Ar ceda, atunci când este executat:

Alice hexdigest: dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac
Bob hexdigest: 7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1
Concatenare hexdigest: edf9a9a0e56b58fc9caccb97d85c628d5b9dc50cb94dfc41e83026d37704400f

În exemplul dvs., când calculați hash-ul concatenării celor două șiruri hexdigest, limbajul dvs. de programare concatenează aceste două șiruri, le codifică într-o secvență binară (folosind orice codificare de caractere la care este implicit) și hashează acea secvență de intrare.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.