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õ P (chữ in hoa A-Z, không khoảng trắng) và khóa mồi K (chữ in hoa A-Z, độ dài không vượt quá ∣P∣ + 50). Dòng khóa được định nghĩa là chuỗi nối K với P:
keystream=K0K1…K∣K∣−1P0P1P2…
sau đó lấy ∣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)mod26(0≤i<∣P∣)
(Nếu ∣K∣≥∣P∣ thì chỉ cần dùng ∣P∣ ký tự đầu của K làm dòng khóa, không cần dùng đến bản rõ.)
Ví dụ: P= ATTACKATDAWN, 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.
Dòng 1: chuỗi bản rõ P (1≤∣P∣≤5000), chỉ gồm chữ in hoa A-Z. Dòng 2: chuỗi khóa mồi K (1≤∣K∣≤5050), chỉ gồm chữ in hoa A-Z.
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 P.
Ví dụ:
Đầu vào:
ATTACKATDAWN
LEMON
Đầu ra:
LXFOPKTMDCGN
Đầu vào:
A
Z
Đầu ra:
Z
Đang tải editor...