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] Mã hóa Vigenère tự sinh khóa (Autokey)

    Mật mã Vigenère cổ điển có nhược điểm là khóa lặp lại theo chu kỳ ngắn, dễ bị thám mã bằng phương pháp Kasiski hay phân tích tần suất. Để khắc phục, có một biến thể gọi là tự sinh khóa (autokey): thay vì lặp lại khóa ban đầu (gọi là khóa mồi — primer), ta nối khóa mồi với chính bản rõ để tạo thành dòng khóa (keystream) dài bằng bản rõ.

    Cho bản rõ PPP (chữ in hoa A-Z, không khoảng trắng) và khóa mồi KKK (chữ in hoa A-Z, độ dài không vượt quá ∣P∣|P|∣P∣ + 50). Dòng khóa được định nghĩa là chuỗi nối KKK với PPP:

    keystream=K0K1…K∣K∣−1 P0P1P2…\text{keystream} = K_0 K_1 \dots K_{|K|-1}\, P_0 P_1 P_2 \dotskeystream=K0​K1​…K∣K∣−1​P0​P1​P2​…

    sau đó lấy ∣P∣|P|∣P∣ ký tự đầu tiên của dòng khóa này để mã hóa theo công thức Vigenère chuẩn:

    Ci=(Pi+keystreami) mod 26(0≤i<∣P∣)C_i = (P_i + \text{keystream}_i) \bmod 26 \quad (0 \le i < |P|)Ci​=(Pi​+keystreami​)mod26(0≤i<∣P∣)

    (Nếu ∣K∣≥∣P∣|K| \ge |P|∣K∣≥∣P∣ thì chỉ cần dùng ∣P∣|P|∣P∣ ký tự đầu của KKK làm dòng khóa, không cần dùng đến bản rõ.)

    Ví dụ: P=P=P= ATTACKATDAWN, K=K=K= LEMON. Dòng khóa là LEMON nối với ATTACKATDAWN, lấy 12 ký tự đầu: LEMONATTACKA. Mã hóa theo công thức trên cho kết quả LXFOPKTMDCGN.

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

      Dòng 1: chuỗi bản rõ PPP (1≤∣P∣≤50001 \le |P| \le 50001≤∣P∣≤5000), chỉ gồm chữ in hoa A-Z. Dòng 2: chuỗi khóa mồi KKK (1≤∣K∣≤50501 \le |K| \le 50501≤∣K∣≤5050), chỉ gồm chữ in hoa A-Z.

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

      Một dòng duy nhất: chuỗi bản mã, chỉ gồm chữ in hoa A-Z, có cùng độ dài với PPP.

    Ví dụ:

    Đầu vào:

    ATTACKATDAWN
    LEMON
    

    Đầu ra:

    LXFOPKTMDCGN
    

    Đầu vào:

    A
    Z
    

    Đầu ra:

    Z
    

    Đang tải editor...