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ã HOTP

    Sinh mã HOTP (HMAC-based One-Time Password, RFC 4226)

    HOTP sinh mã OTP từ một khoá bí mật (secret, dạng ASCII) và một bộ đếm (counter). Thuật toán:

    1. Chuyển counter thành 8 byte big-endian.
    2. Tính HS = HMAC-SHA1(key=secret_bytes, msg=counter_bytes) (20 byte).
    3. Dynamic truncation: lấy offset = HS[19] & 0x0f. Lấy 4 byte HS[offset..offset+3], ghép thành số 31 bit (xoá bit cao nhất): bin_code = ((HS[offset] & 0x7f) << 24) | (HS[offset+1] << 16) | (HS[offset+2] << 8) | HS[offset+3].
    4. otp = bin_code % 10^digits, in ra với đệm 0 phía trước cho đủ digits chữ số.

    Khái niệm: HOTP là nền tảng của ứng dụng xác thực 2 lớp (2FA).

    Ví dụ: secret = 12345678901234567890, counter = 0, digits = 6 → 755224 (vector kiểm thử RFC 4226).

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

      Dòng 1: secret (chuỗi ASCII, không chứa khoảng trắng). Dòng 2: số nguyên counter. Dòng 3: số nguyên digits (số chữ số của OTP).

    • Ràng buộc đầu vào:

      1 ≤ độ dài secret ≤ 100; 0 ≤ counter ≤ 2^53; 4 ≤ digits ≤ 8.

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

      In mã HOTP gồm đúng digits chữ số (có đệm 0 nếu cần).

    Ví dụ:

    Đầu vào:

    12345678901234567890
    0
    6

    Đầu ra:

    755224

    Giải thích:

    Vector kiểm thử RFC 4226: counter=0 cho OTP 755224.

    Đang tải editor...