Score:0

การต่อข้อมูลใน Merkle Trees

ธง in

พิจารณาต้นเมิร์กเคิลธรรมดาที่มีใบ อลิซ +100 และ บ๊อบ +50. การใช้อัลกอริธึมแฮช SHA256 การย่อยของสตริงที่เกี่ยวข้องคือ:

#อลิส+100
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac

#โบ+50
7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1

ในฐานะที่เป็นฟังก์ชันแฮช SHA-256 ถูกกำหนดขึ้น ดังนั้นจึงไม่สำคัญว่าเราจะใช้ภาษาโปรแกรมใด เพื่อความสมบูรณ์ สามารถทำได้ผ่าน crypto-js ห้องสมุด:

const hash256 = (สตริง) => {
  ค่าคงที่ = 
  ต้องการ('crypto').createHash('sha256').update(string).digest('hex');
  คืนค่า;
}

# นำมาใช้
hash256('อลิซ +100')
# ผล:
dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac

เมื่อมีผู้กล่าวถึง การใช้งาน Merkle Treeหนึ่งดูคำอธิบายต่อไปนี้:

ต้นไม้แฮชเป็นต้นไม้ของแฮชที่ใบไม้เป็นแฮชของบล็อกข้อมูลในไฟล์หรือชุดของไฟล์ ตัวอย่างเช่น โหนดที่อยู่ไกลขึ้นไปบนต้นไม้คือแฮชของโหนดย่อยตามลำดับ ตัวอย่างเช่น ในภาพด้านบนแฮช 0 คือผลลัพธ์ของการแฮชที่เชื่อมระหว่างแฮช 0-0 และแฮช 0-1 นั่นคือ แฮช 0 = แฮช( แฮช(0-0) + แฮช(0-1) ) โดยที่ + หมายถึงการต่อกัน

ป้อนคำอธิบายรูปภาพที่นี่

ฉันเคยเห็นนามธรรมของไลบรารีระดับที่สูงขึ้นซึ่งใช้การต่อข้อมูลนี้ในกรณีของ บัฟเฟอร์.concat()แต่ฉันอยากทราบว่าจะนำสิ่งนี้ไปใช้อย่างไรจากมุมมองทางคณิตศาสตร์ล้วน ๆ

ใครจะถือว่า (ไม่ถูกต้อง):

alice_hash = hash256('อลิซ +100')
bob_hash = hash256('บ๊อบ +50')
# ผิด
hash256(alice_hash + bob_hash)
# ผิดด้วย: เพิ่ม 0x-prefix
hash256(
  '0xdc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac'
  + 
  '0x7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1' 
)

ถ้าปราศจากนามธรรมแล้วจะเป็นอย่างไร เชื่อมแฮชทั้งสองเข้าด้วยกัน เพื่อรับโหนดพาเรนต์ที่เป็นผลลัพธ์?

สำหรับใครก็ตามที่พยายามช่วยเหลือ ค่าที่ถูกต้องของ hash(hash(alice) + hash(bob)) ควรเป็น edf9a9a0e56b58fc9caccb97d85c628d5b9dc50cb94dfc41e83026d37704400f. ฉันพยายามเพิ่ม / ลบไฟล์ 0x คำนำหน้า เพิ่มอักขระเว้นวรรคหนึ่งตัวระหว่างพวกเขา และความพยายามเหล่านี้ไม่ประสบผลสำเร็จเลยฉันยังอ่านเอกสารที่ฉันสามารถทำได้ แต่ไม่เคยไปไกลกว่า "เชื่อมเข้าด้วยกันเพื่อรับค่าสำหรับโหนดหลัก" โดยมีการอ้างอิงการใช้งานน้อยมาก

kelalaka avatar
in flag
ทั้งคำตอบและคุณและแหล่งที่มาของคุณลืมใช้ Merkle Tree อย่างถูกต้อง 0 วินาที 1 วินาที [ดูคำตอบนี้](https://crypto.stackexchange.com/a/71313/18298)
Morrolan avatar
ng flag
หากต้องการอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่ @kelalaka สื่อถึง - การนำ Merkle tree ไปใช้อย่างเหมาะสมมักจะเพิ่มตัวระบุของ *ตำแหน่งใน tree* ซึ่งเป็นองค์ประกอบแฮชให้กับข้อมูลที่ถูกแฮช ซึ่งจะช่วยป้องกันการโจมตีบางประเภท มีหลายวิธีในการทำเช่นนี้ คำตอบหนึ่งเห็นได้ในคำตอบที่เชื่อมโยง อีกอันอยู่ใน [RFC 6962](https://www.rfc-editor.org/rfc/rfc6962.html#section-2.1) ซึ่งเพียงแค่แยกความแตกต่างระหว่างโหนดลีฟและโหนดที่ไม่ใช่ลีฟ
onlyphantom avatar
in flag
ฉันเข้าใจและขอขอบคุณสำหรับข้อเสนอแนะและลิงก์ที่นี่ฉันทิ้งรายละเอียดอื่นๆ ไว้เพื่อเน้นที่ส่วน "การต่อข้อมูล" แต่หลังจากคำตอบของคุณ @Morrolan ฉันสามารถคิดออกและนำไปใช้ได้อย่างถูกต้องใน python สิ่งที่ต้องทำคือการดูสตริงเลขฐานสิบหกเป็นเพียงการแสดง ดำเนินการ + ในสตริงไบนารีแทน ขอบคุณสำหรับคำตอบ!
Score:1
ธง ng

ปัญหาที่เกิดขึ้นจากการผสมการแสดงสตริงเลขฐานสิบหก ('hexdigest') ของค่าแฮชกับค่าไบนารีจริง

จำไว้ก่อนว่าฟังก์ชันแฮชใช้สตริงบิตที่มีความยาวตามอำเภอใจ (เพื่อวัตถุประสงค์ในทางปฏิบัติ) เป็นอินพุต และเอาต์พุตเป็นสตริงบิตที่มีความยาวคงที่ นั่นคือมันทำงานบน ไบนารี่ ค่า

ดังนั้น ค่าแฮชจริงของสตริงอินพุต (เข้ารหัส ASCII) อลิซ +100 เป็นลำดับของ 32 ไบต์ dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac คือลำดับไบต์ที่แสดงเป็น 'hexdigest' โดยที่อักขระเลขฐานสิบหกสองตัวเข้ารหัสหนึ่งไบต์

สำหรับการต่อข้อมูล คุณต้องเชื่อมลำดับไบต์เข้าด้วยกัน แทนที่จะเป็นเลขฐานสิบหก

ตัวอย่างหนึ่งใน Ruby:

ต้องการ 'สรุป'

m1 = 'อลิซ +100'
m2 = 'กลม +50'

d1 = ไดเจสต์::SHA256.new
d2 = ไดเจสต์::SHA256.new

d1 << m1
d2 << m2

ใส่ "Alice hexdigest: #{ d1.hexdigest }"
ใส่ "Bob hexdigest: #{ d2.hexdigest }"

d3 = ไดเจสต์::SHA256.new
d3 << d1.digest
d3 << d2.digest                                                                                                                                                

วาง "การต่อเลขฐานสิบหกการต่อข้อมูล: #{ d3.hexdigest }"

จะให้ผลเมื่อดำเนินการ:

เลขฐานสิบหกของอลิซ: dc2cac4a8aaeccc0199eeb77df68b22eaa6e319d3f2b425d078dbd73419e28ac
เลขฐานสิบหกของ Bob: 7e15e5bc1b84f458db7ced4df762ba70204f19e3a613738756f9b00653f0aee1
การต่อเลขฐานสิบหก: edf9a9a0e56b58fc9caccb97d85c628d5b9dc50cb94dfc41e83026d37704400f

ในตัวอย่างของคุณ เมื่อคุณคำนวณแฮชของการต่อสตริง hexdigest สองสตริง ภาษาโปรแกรมของคุณจะเชื่อมสตริงทั้งสองนี้เข้าด้วยกัน เข้ารหัสให้เป็นลำดับเลขฐานสอง (โดยใช้อักขระใดก็ตามที่เข้ารหัสเป็นค่าเริ่มต้น) และแฮชลำดับอินพุตนั้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา