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 dãy bit từ thanh ghi dịch phản hồi tuyến tính (LFSR)

    Thanh ghi dịch phản hồi tuyến tính (LFSR — Linear Feedback Shift Register) kiểu Fibonacci độ dài LLL bit là một trong những thành phần cơ bản nhất của mã dòng (stream cipher).

    Trạng thái của thanh ghi được biểu diễn bằng LLL bit, đánh số vị trí 1,2,…,L1, 2, \ldots, L1,2,…,L từ trái sang phải trong chuỗi seed cho trước (vị trí 1 là bit "đầu ra", vị trí LLL là bit "cuối" của thanh ghi).

    Đa thức phản hồi được cho bởi một tập hợp kkk vị trí tap (mỗi tap là một chỉ số từ 111 đến LLL).

    Tại mỗi bước dịch:

    1. Bit đầu ra của bước này chính là bit đang ở vị trí 1 của trạng thái hiện tại.
    2. Bit phản hồi mới fff = XOR (cộng modulo 2) của các bit tại tất cả vị trí tap, tính trên trạng thái hiện tại (trước khi dịch).
    3. Trạng thái mới nhận được bằng cách dịch mọi bit sang trái một vị trí (bit vị trí 2 trở thành bit vị trí 1, v.v.) và chèn bit phản hồi fff vào vị trí cuối cùng (LLL).

    Cho seed ban đầu, danh sách tap và số bit cần sinh mmm, hãy in ra mmm bit đầu ra liên tiếp.

    Ví dụ: Với L=4L=4L=4, seed = 1000, tap = {4,1}\{4, 1\}{4,1}, m=6m = 6m=6:

    • Bước 1: trạng thái 1000 → đầu ra 1, f=s4⊕s1=0⊕1=1f = s_4 \oplus s_1 = 0 \oplus 1 = 1f=s4​⊕s1​=0⊕1=1 → trạng thái mới 0001
    • Bước 2: trạng thái 0001 → đầu ra 0, f=1⊕0=1f = 1 \oplus 0 = 1f=1⊕0=1 → trạng thái mới 0011
    • ... tiếp tục cho đến khi đủ 6 bit đầu ra: 100011.
    • Định dạng đầu vào:
      • Dòng 1: hai số nguyên LLL và mmm (1≤L≤201 \le L \le 201≤L≤20, 0≤m≤10000 \le m \le 10000≤m≤1000) — độ dài thanh ghi và số bit cần sinh.
      • Dòng 2: chuỗi seed gồm đúng LLL ký tự 0/1 (trạng thái ban đầu, vị trí 1 → vị trí LLL).
      • Dòng 3: số nguyên kkk (1≤k≤L1 \le k \le L1≤k≤L) — số lượng vị trí tap.
      • Dòng 4: kkk số nguyên phân biệt trong đoạn [1,L][1, L][1,L] — các vị trí tap.
    • Định dạng đầu ra:

      In ra đúng một dòng gồm mmm ký tự 0/1 là mmm bit đầu ra liên tiếp (không có khoảng trắng). Nếu m=0m = 0m=0, in ra dòng trống.

    Ví dụ:

    Đầu vào:

    3 0
    101
    1
    3
    

    Đầu ra:

    
    

    Đầu vào:

    4 6
    1000
    2
    4 1
    

    Đầu ra:

    100011
    

    Đang tải editor...