Mật mã Caesar

Giới thiệu về Caesar

Gāius Iūlius Caesār (phát âm trong tiếng Latin: [ɡaː.i.ʊs ˈjuː.li.ʊs ˈkae̯.sar]; cách phiên âm "Xê-da" bắt nguồn từ tiếng Pháp César) (12 tháng 7 hoặc 13 tháng 7 năm 100 TCN – 15 tháng 3 năm 44 TCN) là một nhà lãnh đạo quân sự, nhà chính trị và tác giả văn xuôi latin lớn của La Mã cổ đại. Ông đóng vai trò then chốt trong sự chuyển đổi Cộng hòa La Mã thành Đế chế La Mã.

Tượng bán thân Caesar tại bảo tàng Vatican, Italia

Tượng bán thân Caesar tại bảo tàng Vatican, Italia

Sinh ra trong nhà Julia, một trong những dòng dõi quý tộc lớn ở Rome, Caesar được tiếp xúc và bắt đầu tham gia đời sống chính trị từ rất sớm. Năm 60 TCN, ông cùng với Crassus và Pompeirus (Pompey) thành lập Tam chế thứ nhất, một liên minh chính trị mang tính thống lĩnh Rôma trong suốt nhiều năm. Phương cách xây dựng quyền lực của Caesar dựa trên các phương thức dân túy đã đụng chạm và dẫn tới sự chống đối của giai cấp quý tộc lãnh đạo ở Rôma, mà đứng đầu là Cato Trẻ với sự ủng hộ thường xuyên của Cicero.

Những cuộc chinh chiến thành công tại xứ Gallia của Caesar mở cho La Mã con đường tiếp cận Đại Tây Dương. Julius Caesar được ghi nhận là vị tướng La Mã đầu tiên xây dựng thành công cầu sông Rhein năm 55 TCN và trở thành tướng La Mã đầu tiên vượt qua eo biển Manche và tiến hành cuộc xâm lăng vào xứ Britannia.

Các thành công quân sự lớn lao của Caesar đã mang lại cho ông quyền lực quân sự tối thượng; đe dọa đến chỗ đứng của Pompey, người đã ngả về phe của Viện Nguyên lão sau khi Crassus mất trong trận Carrhae năm 53 TCN. Sau khi chiến cuộc xứ Gaule đến hồi kết, Caesar được lệnh phải từ bỏ quyền chỉ huy quân sự và trở về Roma. Caesar bất tuân lệnh này và thay vào đó ông rời khỏi khu vực tài phán của mình, vượt sông Rubicon tiến vào Roma với một binh đoàn La Mã vào năm 49 TCN. Kết quả là nội chiến nổ ra ở La Mã, với chiến thắng sau cùng thuộc về Caesar.

Mật mã Caesar

Một trong những vấn đề quan trọng trong quân sự là làm thế nào để truyền thông điệp đến nhiều cánh quân trong quân đội mà không bị đối phương nhòm ngó, lấy được thông tin quân sự quan trọng. Và lịch sử của chiến tranh cũng đi cũng với lịch sử của quá trình mã hoá và giải mã thông điệp. Cho đến tận ngày nay, quân đội nào cũng có một bộ phận quan trọng chịu trách nhiệm về quá trình mã hoá và giải mã thông điệp. Ở Việt Nam, bộ phận chịu trách nhiệm về quá trình mã hoá và giải mã là bộ phận Cơ yếu tồn tại trong tất cả các đơn vị quân đội.

Tất nhiên bài viết này không phải về lịch sử, cũng không phải về con người "Xê-da" huyền thoại của đế chế La Mã mà là về mật mã mang tên ông. Như ta đã biết "Xê-da" là một nhà lãnh đạo quân sự rất nổi tiếng trong lịch sử, và mật mã Caesar cũng được ông đưa ra trong quá trình lãnh đạo quân đội khi đi chinh chiến. Mật mã Caesar được coi là một trong những phương thức mã hoá thông điệp đầu tiên được ghi nhận.

Mật mã Caesar rất đơn giản sử dụng 25 chìa khoá mã (trong ví dụ tôi đưa ra là thông điệp sử dụng Tiếng Anh mà Tiếng Anh có tất cả 26 ký tự). Mỗi chìa khoá mã là một số nguyên k bắt đầu từ 1 đến 25, tương ứng với việc dịch chuyển k ký tự trong Tiếng Anh và vượt quá dải ký tự (Z) sẽ quay lại từ đầu (ký tự A). Quy ước quá trình mã hoá hoàn toàn sử dụng ký tự chữ hoa (không sử dụng ký tự thường trong thông điệp) và không sử dụng dấu cách (' ')

Ví dụ:
  • Thông điệp: HELLO
  • Chìa khoá mã là 1
  • Thông điệp được mã hoá là: IFMMP

Rõ ràng là với việc gửi thông điệp đi là IFMMP thì không ai có thể hiểu được thông điệp là gì, chỉ có người biết được chìa khoá mã là 1 thì mới có thể giải mã và đọc được thông điệp là HELLO.

Sử dụng Mật mã Caesar trong Ngôn ngữ lập trình Java

Dựa vào cơ chế vừa nêu trên của Mật mã Caesar, chúng ta viết một lớp tên là CaesarCode và thực hiện phương thức mã hoá encrypt() như sau:

public static String encrypt(String msg, int key) {
    char arr[] = new char[msg.length()];
    for (int i = 0; i < msg.length(); i++) {
        int e = (int) msg.charAt(i) + key;
        e = e > (int) 'Z' ? e - 26 : e;
        arr[i] = (char) e;
    }
    return new String(arr);
}

Thực hiện cơ chế giải mã dựa vào phương thức decrypt() như sau:

public static String decrypt(String msg, int key) {
    char arr[] = new char[msg.length()];
    for (int i = 0; i < msg.length(); i++) {
        int e = (int) msg.charAt(i) - key;
        e = e < (int) 'A' ? e + 26 : e;
        arr[i] = (char) e;
    }
    return new String(arr);
}

Chúng ta có thể viết hàm main() để kiểm tra cơ chế mã hoá và giải mã của mật mã Caesar như sau:

public static void main(String[] args) {
    int key = 25;
    String originalMessage = "HELLOCAESARCODE";
    String encryptedMessage = CaesarCode.encrypt(originalMessage, key);
    String decryptedMessage = CaesarCode.decrypt(encryptedMessage, key);

    System.out.println("Original Message: " + originalMessage);
    System.out.println("Encrypted Message: " + encryptedMessage);
    System.out.println("Decrypted Message: " + decryptedMessage);
}

Tất nhiên, với số lượng chìa khoá mã giới hạn là 25 như vậy thì thật chẳng khó khăn gì với một người bình thường mà chưa muốn nói gì đến việc sử dụng máy tính đặc biệt là lập trình. Ta có thể viết chương trình để phá mật mã Caesar như sau:

public static void main(String[] args) {
    for (int i = 1; i < 26; i++) {
        System.out.println("Key=" + i + " -> " + CaesarCode.decrypt(encryptedMessage, i));
    }
}

Xem chi tiết mã nguồn tham khảo tại đây.

Hoặc có thể chạy thử chương trình sau:

Sử dụng Mật mã Caesar trong C

Đánh giá Mật mã Caesar

Mặc dù mật mã Caesar rất đơn giản, rất dễ dàng phá được nếu biết được cơ chế mã hoá. Tuy nhiên với thời kỳ của "Xê-da" thì việc này thực sự khó khăn và hầu như không thể vì không biết được đến cơ chế mã hoá đó.

Về cơ bản, một mật mã mạnh hay yếu (quá trình mã hoá có dễ dàng giải mã được hay không) phụ thuộc vào 2 yếu tố là cơ chế mã hoá và số lượng các khoá. Chúng ta có thể hình dung đơn giản việc đó như ví dụ ở trên, sau này khi tiếp cận với các cơ chế mã hoá phức tạp hơn rất nhiều thì chúng vẫn giữ những nguyên tắc cơ bản tương tự như Mật mã Caesar.