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] Sinh mã OTP theo bộ đếm (HOTP)

    Thuật toán HOTP (HMAC-based One-Time Password, RFC 4226) sinh mã OTP dựa trên một khoá bí mật KKK và một bộ đếm (counter) CCC là số nguyên không âm, theo các bước sau:

    1. Biểu diễn CCC dưới dạng 8 byte big-endian (số nguyên không dấu 64-bit), gọi là DDD.
    2. Tính H=HMAC-SHA1(K,D)H = \text{HMAC-SHA1}(K, D)H=HMAC-SHA1(K,D) — một chuỗi 20 byte.
    3. Đặt offset = H[19] & 0x0F (lấy 4 bit thấp của byte cuối cùng làm chỉ số, 0≤offset≤150 \le \text{offset} \le 150≤offset≤15).
    4. Lấy 4 byte liên tiếp H[offset],H[offset+1],H[offset+2],H[offset+3]H[\text{offset}], H[\text{offset}+1], H[\text{offset}+2], H[\text{offset}+3]H[offset],H[offset+1],H[offset+2],H[offset+3], ép bit cao nhất của byte đầu tiên về 0 (AND với 0x7F) rồi ghép 4 byte đó thành một số nguyên 31-bit bin_code (big-endian, byte đầu là byte cao nhất).
    5. Mã OTP =bin_code mod 10d= \text{bin\_code} \bmod 10^d=bin_codemod10d, trong đó ddd là số chữ số yêu cầu (d=6d=6d=6 hoặc d=8d=8d=8), được viết dưới dạng chuỗi đúng ddd chữ số (đệm số 0 ở đầu nếu thiếu).

    Cho khoá bí mật KKK (dạng chuỗi hex, độ dài chẵn), bộ đếm CCC và số chữ số ddd, hãy tính mã OTP theo thuật toán trên.

    Ví dụ: với K=K=K= 3132333435363738393031323334353637383930 (là dạng hex của chuỗi ASCII "12345678901234567890"), C=0C=0C=0, d=6d=6d=6, mã OTP sinh ra là 755224.

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

      Gồm 3 dòng:

      • Dòng 1: chuỗi hex của khoá bí mật KKK (chữ thường hoặc hoa, độ dài chẵn, từ 2 đến 128 ký tự hex).
      • Dòng 2: số nguyên CCC (0≤C≤10120 \le C \le 10^{12}0≤C≤1012).
      • Dòng 3: số nguyên ddd, chỉ nhận giá trị 6 hoặc 8.
    • Định dạng đầu ra:

      Một dòng duy nhất: chuỗi gồm đúng ddd chữ số (đệm số 0 ở đầu nếu cần) là mã OTP.

    Ví dụ:

    Đầu vào:

    3132333435363738393031323334353637383930
    9
    6
    

    Đầu ra:

    520489
    

    Đầu vào:

    3132333435363738393031323334353637383930
    0
    6
    

    Đầu ra:

    755224
    

    Đang tải editor...