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] Bộ tạo dòng khóa kiểu A5/1 với ba LFSR

    Bộ tạo dòng khóa kiểu A5/1 (dùng trong mã hóa GSM) kết hợp ba thanh ghi LFSR Fibonacci R1,R2,R3R_1, R_2, R_3R1​,R2​,R3​ (độ dài lần lượt L1,L2,L3L_1, L_2, L_3L1​,L2​,L3​) bằng cơ chế xung nhịp bất quy tắc điều khiển theo đa số (majority clocking).

    Mỗi thanh ghi RjR_jRj​ có: trạng thái LjL_jLj​ bit ở vị trí 1,…,Lj1,\ldots,L_j1,…,Lj​; danh sách tap riêng (bit phản hồi mới = XOR các bit tại vị trí tap của trạng thái hiện tại, dịch trái rồi chèn bit phản hồi vào vị trí cuối — giống định nghĩa LFSR ở các bài trước); và một vị trí clock tap riêng dùng để quyết định việc dịch.

    Tại mỗi bước sinh 1 bit dòng khóa, với trạng thái hiện tại (trước khi dịch bất kỳ thanh ghi nào):

    1. Bit dòng khóa ra = XOR bit ở vị trí 1 của cả ba thanh ghi.
    2. Với mỗi jjj, lấy bit clock cjc_jcj​ = bit tại vị trí clock tap của RjR_jRj​.
    3. Giá trị đa số mmm = giá trị (0 hoặc 1) xuất hiện ở ít nhất 2 trong 3 bit c1,c2,c3c_1, c_2, c_3c1​,c2​,c3​.
    4. Thanh ghi RjR_jRj​ chỉ được dịch (thực hiện đúng 1 bước LFSR như mô tả ở trên) nếu cj=mc_j = mcj​=m; ngược lại RjR_jRj​ giữ nguyên trạng thái ở bước này.

    Lặp lại nnn lần để sinh nnn bit dòng khóa liên tiếp.

    Ví dụ minh họa với ba thanh ghi độ dài 3, clock tap = vị trí 2 cho cả ba: R1R_1R1​: tap={3,1}=\{3,1\}={3,1}, seed=110; R2R_2R2​: tap={3,2}=\{3,2\}={3,2}, seed=011; R3R_3R3​: tap={3,1}=\{3,1\}={3,1}, seed=101. Ở bước 1: bit ra =1⊕0⊕1=0=1\oplus0\oplus1=0=1⊕0⊕1=0; các bit clock là (1,1,0)(1,1,0)(1,1,0) nên đa số m=1m=1m=1; chỉ R1,R2R_1, R_2R1​,R2​ được dịch. Với n=5n=5n=5, kết quả đầy đủ là 01110.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000) — số bit dòng khóa cần sinh.
      • Tiếp theo là 3 khối, mỗi khối ứng với một thanh ghi RjR_jRj​ (j=1,2,3j=1,2,3j=1,2,3), gồm 2 dòng:
        • Dòng thứ nhất: LjL_jLj​ (độ dài, 1≤Lj≤251 \le L_j \le 251≤Lj​≤25), vị trí clock tap (trong [1,Lj][1,L_j][1,Lj​]), số lượng tap kjk_jkj​ (1≤kj≤Lj1 \le k_j \le L_j1≤kj​≤Lj​), và kjk_jkj​ vị trí tap — tất cả cách nhau bởi khoảng trắng.
        • Dòng thứ hai: chuỗi seed gồm đúng LjL_jLj​ ký tự 0/1.
      • Thứ tự các khối trong input là R1,R2,R3R_1, R_2, R_3R1​,R2​,R3​.
    • Định dạng đầu ra:

      In ra một dòng gồm nnn ký tự 0/1 là dòng khóa sinh được. Nếu n=0n=0n=0, in ra dòng trống.

    Ví dụ:

    Đầu vào:

    5
    3 2 2 3 1
    110
    3 2 2 3 2
    011
    3 2 2 3 1
    101
    

    Đầu ra:

    01110
    

    Đầu vào:

    0
    3 2 2 3 1
    110
    3 2 2 3 2
    011
    3 2 2 3 1
    101
    

    Đầu ra:

    
    

    Đang tải editor...