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 thời gian (TOTP)

    TOTP (Time-based One-Time Password, RFC 6238) mở rộng thuật toán HOTP (xem mô tả HOTP ở bài "Sinh mã OTP theo bộ đếm") bằng cách thay bộ đếm CCC bởi giá trị tính từ thời gian:

    C=⌊T−T0X⌋C = \left\lfloor \dfrac{T - T_0}{X} \right\rfloorC=⌊XT−T0​​⌋

    trong đó TTT là thời điểm Unix hiện tại (số giây kể từ 1/1/1970), T0T_0T0​ là mốc thời gian bắt đầu (thường bằng 0), và XXX là độ dài một bước thời gian tính bằng giây (thường là 30). Sau khi tính được CCC, áp dụng đúng thuật toán HOTP (dùng HMAC-SHA1) để sinh mã ddd chữ số.

    Cho khoá bí mật KKK (hex), thời điểm TTT, mốc T0T_0T0​, bước thời gian XXX và số chữ số ddd, hãy tính mã TOTP.

    Ví dụ: với K=K=K= 3132333435363738393031323334353637383930, T=59T=59T=59, T0=0T_0=0T0​=0, X=30X=30X=30, d=8d=8d=8, ta có C=⌊59/30⌋=1C = \lfloor 59/30 \rfloor = 1C=⌊59/30⌋=1 và mã TOTP là 94287082.

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

      Gồm 5 dòng:

      • Dòng 1: chuỗi hex của khoá bí mật KKK (độ dài chẵn, từ 2 đến 128 ký tự hex).
      • Dòng 2: số nguyên TTT (0≤T≤4×1090 \le T \le 4 \times 10^{9}0≤T≤4×109).
      • Dòng 3: số nguyên T0T_0T0​ (0≤T0≤T0 \le T_0 \le T0≤T0​≤T).
      • Dòng 4: số nguyên XXX (1≤X≤3001 \le X \le 3001≤X≤300).
      • Dòng 5: 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ã TOTP.

    Ví dụ:

    Đầu vào:

    3132333435363738393031323334353637383930
    1111111109
    0
    30
    8
    

    Đầu ra:

    07081804
    

    Đầu vào:

    3132333435363738393031323334353637383930
    59
    0
    30
    8
    

    Đầu ra:

    94287082
    

    Đang tải editor...