Cây băm Merkle là thành phần cốt lõi của nhiều sơ đồ chữ ký hậu lượng tử dựa trên hàm băm (như XMSS, SPHINCS+): thay vì phải công khai hàng nghìn khoá công khai một lần, người ký chỉ cần công bố một gốc Merkle (Merkle root) duy nhất.
Cho danh sách m giá trị lá ℓ1,…,ℓm (chuỗi ký tự). Băm lá: hi=SHA256(ℓi) (mã hoá UTF-8, kết quả hex thường). Xây cây theo tầng: ở mỗi tầng, nếu số nút đang có là lẻ, nhân đôi nút cuối cùng để số nút thành chẵn; sau đó ghép từng cặp (h2k−1,h2k) theo đúng thứ tự và băm chuỗi hex nối liền: parent=SHA256(hex(h2k−1)∥hex(h2k)). Lặp lại cho đến khi chỉ còn một nút — đó là gốc Merkle. Quy ước: nếu m=0, gốc là SHA256(∅) (băm chuỗi rỗng); nếu m=1, gốc chính là h1.
Ví dụ
Input:
3
tx1
tx2
tx3
Output:
fbf8b59f1ad5a1723f350e130dd75701c2b5c11a44b5ffc4e6ed48b2e1c34d8f
Dòng đầu tiên chứa số nguyên m (m≥0). m dòng tiếp theo, mỗi dòng là một chuỗi lá ℓi (không chứa khoảng trắng).
In ra đúng một dòng — gốc Merkle dạng hex thường (64 ký tự).
Ví dụ:
Đầu vào:
0
Đầu ra:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Đầu vào:
1
leafA
Đầu ra:
07df6218d7def32ea2a026c2e79dd9ee65c2293e9489b502d1f0cd1671d6a7dd
Đang tải editor...