Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [An toàn thông tin] Tính gốc cây Merkle từ danh sách lá

    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 mmm giá trị lá ℓ1,…,ℓm\ell_1, \dots, \ell_mℓ1​,…,ℓm​ (chuỗi ký tự). Băm lá: hi=SHA256(ℓi)h_i = \text{SHA256}(\ell_i)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)(h_{2k-1}, h_{2k})(h2k−1​,h2k​) theo đúng thứ tự và băm chuỗi hex nối liền: parent=SHA256(hex(h2k−1) ∥ hex(h2k))\text{parent} = \text{SHA256}(\text{hex}(h_{2k-1}) \,\Vert\, \text{hex}(h_{2k}))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=0m = 0m=0, gốc là SHA256(∅)\text{SHA256}(\varnothing)SHA256(∅) (băm chuỗi rỗng); nếu m=1m = 1m=1, gốc chính là h1h_1h1​.

    Ví dụ

    Input:

    3
    tx1
    tx2
    tx3
    

    Output:

    fbf8b59f1ad5a1723f350e130dd75701c2b5c11a44b5ffc4e6ed48b2e1c34d8f
    
    • Định dạng đầu vào:

      Dòng đầu tiên chứa số nguyên mmm (m≥0m \ge 0m≥0). mmm dòng tiếp theo, mỗi dòng là một chuỗi lá ℓi\ell_iℓi​ (không chứa khoảng trắng).

    • Định dạng đầu ra:

      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...