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] Phá mã Vigenère hoàn chỉnh khi biết độ dài khóa

    Cho bản mã Vigenère CCC (chỉ gồm chữ in hoa A…ZA \ldots ZA…Z, không có ký tự khác) và độ dài khóa mmm đã biết (chẳng hạn suy ra từ phương pháp Kasiski hoặc từ IC trung bình). Hãy khôi phục khóa và bản rõ bằng phân tích tần suất từng cột, tương tự việc phá nhiều mã Caesar độc lập.

    Với mỗi cột j=0,1,…,m−1j = 0, 1, \ldots, m-1j=0,1,…,m−1 (nhóm con gồm các ký tự CCC tại vị trí j,j+m,j+2m,…j, j+m, j+2m, \ldotsj,j+m,j+2m,…, đánh số từ 0), thử mọi khóa dịch k=0,…,25k = 0, \ldots, 25k=0,…,25: giải mã cột bằng cách dịch ngược kkk vị trí, rồi tính thống kê chi-bình phương so với bảng tần suất chuẩn tiếng Anh (công thức và bảng giống hệt bài toán phá mã Caesar):

    χ2(k)=∑i=AZ(Oi−Ei)2Ei,Ei=pi×L\chi^2(k) = \sum_{i=A}^{Z} \frac{(O_i - E_i)^2}{E_i}, \quad E_i = p_i \times Lχ2(k)=∑i=AZ​Ei​(Oi​−Ei​)2​,Ei​=pi​×L

    với LLL là độ dài cột, pip_ipi​ là tần suất chuẩn (bảng bên dưới). Chọn kjk_jkj​ là khóa dịch có χ2\chi^2χ2 nhỏ nhất cho cột jjj (nếu có nhiều khóa cùng nhỏ nhất, chọn khóa nhỏ nhất). Ký tự thứ jjj của khóa Vigenère là chữ cái ứng với số kjk_jkj​ (A tương ứng 0, ..., Z tương ứng 25).

    Ghép các kjk_jkj​ lại được khóa K=k0k1…km−1K = k_0 k_1 \ldots k_{m-1}K=k0​k1​…km−1​ (độ dài mmm). Dùng khóa này giải mã toàn bộ CCC: ký tự bản rõ tại vị trí iii (đánh số từ 0) là kết quả dịch ngược CiC_iCi​ đi k(i mod m)k_{(i \bmod m)}k(imodm)​ vị trí.

    Bảng tần suất chuẩn của các chữ cái tiếng Anh (%):

    Chữ Tần suất (%) Chữ Tần suất (%)
    A 8.167 N 6.749
    B 1.492 O 7.507
    C 2.782 P 1.929
    D 4.253 Q 0.095
    E 12.702 R 5.987
    F 2.228 S 6.327
    G 2.015 T 9.056
    H 6.094 U 2.758
    I 6.966 V 0.978
    J 0.153 W 2.360
    K 0.772 X 0.150
    L 4.025 Y 1.974
    M 2.406 Z 0.074

    Ví dụ: với m=1m=1m=1, thuật toán trên tương đương với phá mã Caesar. Bản mã KHOOR với m=1m=1m=1 cho khóa K=K = K= O (tương ứng k0=14k_0=14k0​=14) và bản rõ WTAAD (đây là kết quả của thuật toán thống kê, không nhất thiết trùng với bản rõ "đúng" theo trực giác khi văn bản quá ngắn để thống kê chính xác).

    • Định dạng đầu vào:
      • Dòng 1: bản mã CCC (chuỗi in hoa A…ZA \ldots ZA…Z, độ dài từ 1 đến 3000).
      • Dòng 2: số nguyên mmm (1≤m≤201 \le m \le 201≤m≤20, m≤m \lem≤ độ dài của CCC).
    • Định dạng đầu ra:

      In ra 2 dòng:

      • Dòng 1: khóa KKK tìm được (chuỗi mmm chữ in hoa).
      • Dòng 2: bản rõ giải mã toàn bộ CCC bằng khóa KKK (chuỗi in hoa cùng độ dài với CCC).

    Ví dụ:

    Đầu vào:

    KHOOR
    1

    Đầu ra:

    O
    WTAAD
    

    Đầu vào:

    ABCDE
    5

    Đầu ra:

    WXYZA
    EEEEE
    

    Đang tải editor...