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 thuật toán HOTP

    HOTP (HMAC-based One-Time Password, RFC 4226) là thuật toán sinh mã xác thực 6 chữ số dùng trong xác thực hai yếu tố (2FA), dựa trên một khóa bí mật KKK và một bộ đếm CCC.

    Thuật toán tính mã OTP như sau:

    1. Biểu diễn CCC thành 8 byte big-endian (số nguyên không âm 64-bit);
    2. Tính HS=HMAC-SHA1(K,C)HS = \text{HMAC-SHA1}(K, C)HS=HMAC-SHA1(K,C), kết quả 20 byte, đánh số byte từ HS[0]HS[0]HS[0] đến HS[19]HS[19]HS[19];
    3. Cắt động (dynamic truncation): offset=HS[19] & 0xf\textit{offset} = HS[19] \ \& \ \texttt{0xf}offset=HS[19] & 0xf; bin_code=(HS[offset] & 0x7f)≪24 ∣ HS[offset+1]≪16 ∣ HS[offset+2]≪8 ∣ HS[offset+3]\textit{bin\_code} = (HS[\textit{offset}] \ \& \ \texttt{0x7f}) \ll 24 \ | \ HS[\textit{offset}+1] \ll 16 \ | \ HS[\textit{offset}+2] \ll 8 \ | \ HS[\textit{offset}+3]bin_code=(HS[offset] & 0x7f)≪24 ∣ HS[offset+1]≪16 ∣ HS[offset+2]≪8 ∣ HS[offset+3];
    4. OTP=bin_code mod 106\text{OTP} = \textit{bin\_code} \bmod 10^6OTP=bin_codemod106.

    Khóa KKK là chuỗi bytes UTF-8 của chuỗi bí mật cho trước (không cần giải mã Base32).

    Ví dụ: với K=K = K= 12345678901234567890 và C=0C = 0C=0, mã OTP sinh ra là 755224.

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

      Hai dòng: dòng 1 là chuỗi bí mật KKK (chuỗi ASCII, có thể rỗng); dòng 2 là số nguyên không âm CCC (0≤C<2630 \le C < 2^{63}0≤C<263).

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

      In ra mã OTP gồm đúng 6 chữ số, có thêm số 0 ở đầu nếu cần (ví dụ 009154).

    Ví dụ:

    Đầu vào:

    12345678901234567890
    0
    

    Đầu ra:

    755224
    

    Đầu vào:

    12345678901234567890
    1
    

    Đầu ra:

    287082
    

    Đang tải editor...