Mã Caesar

Giới thiệu

Hệ thống mật mã cổ điển (các loại mật mã được phát minh và ứng dụng trong thời kỳ tiền máy tính) có rất nhiều. Nhưng tựu chung lại có thể chia thành 2 dạng lớn: mật mã chuyển vị và mật mã thay thế.

Mật mã chuyển vị là loại mật mã mà các kí tự trong bản rõ sẽ được hoán vị theo một cách thức nào đó để tạo nên bản mã. Ví dụ điển hình là cách mã hóa mà người ta dùng một mảnh vải dài quấn hình xoắn ốc quanh một thanh hình trụ, người tạo mã sẽ viết thông tin lên vải theo chiều dọc của thanh hình trụ rồi trải mảnh vải ra đọc theo chiều dài mảnh vải sẽ được bản mã. Cách mã hóa này thường xuất hiện ở những trò chơi đi tìm mật thư trong nhà trường. Hệ thống mã hóa này yếu và ít biến thể nên tôi sẽ không trình bày ở đây.

Mật mã thay thế là loại mật mã mà mỗi kí tự trong bản rõ được thay bằng một kí tự trong bản mã theo một quy tắc nhất định. Thể loại này có nhiều biến thể, và trong các bài tiếp theo chúng ta sẽ đi qua một số loại mã thay thế phổ biến nhất: mã Caesar, mã Affine, mã thay thế đơn giản, mã Vigenere, … Đầu tiên và đơn giản nhất là mã Caesar.

Hệ mã Caesar, hay mã chuyển dịch (Shift cipher) là hệ mật mã thay thế đơn giản nhất và được biết đến từ rất sớm. Mã Caesar được đặt tên theo vị hoàng đế J. Caesar thời đế quốc La Mã.

Ở đây tôi dùng bảng chữ cái Tiếng Anh có 26 chữ cái A -> Z để minh họa.

Mã Caesar thực hiện chuyển dịch từng ký tự trong bản rõ lên k bước để tạo ra bản mã.

Để giải mã, ta thực hiện ngược lại bằng cách chuyển dịch từng kí tự của bản mã lùi về k bước.

Sơ đồ hệ mật mã chuyển dịch được định nghĩa như sau:

S = (P, C, K, E, D)

Trong đó P = C = K = Z26, các hàm lập mã và giải mã được cho bởi:

E(p, k) = (p + k) mod 26

D(c, k) = (c - k) mod 26

Ví dụ: Với bản rõ HENGAPNHAUVAOCHIEUTHUBAY, chuyển dãy ký tự đó thành dãy số tương ứng ta được:

x = 7 4 13 6 0 15 13 7 0 20 21 0 14 2 7 8 4 20 19 7 20 1 0 24

Nếu dùng thuật toán lập mật mã với k = 14, ta được bản mã là:

y = 21 18 1 20 14 3 1 21 14 8 9 14 2 16 21 22 18 8 7 21 8 15 14 12

Chuyển thành dạng ký tự thông thường ta được bản mật mã là: VSBUODBVOIJOCQVWSIHVIPOM.


Thám mã

Thám mã đối với mã Caesar khá đơn giả, khóa k cần giữ bí mật chỉ có 26 khả năng xảy ra nên ta dễ dàng dùng thuật toán Brute-force để tìm ra bản rõ ban đầu.


Code

def caesar_cipher(message, mode, key):
    
    LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    message = message.upper()
    translated = ''
    
    for symbol in message:
        if symbol in LETTERS:
            num = LETTERS.find(symbol)
            if mode.upper() == 'ENCRYPT':
                num = (num + key) % 26
            elif mode.upper() == 'DECRYPT':
                num = (num - key) % 26
            translated = translated + LETTERS[num]
        else:
            translated = translated + symbol

    return translated

message = 'HENGAPNHAUVAOCHIEUTHUBAY'
cipher = caesar_cipher(message, 'ENCRYPT', 13)
print('Plain text:  ' + message)
print('Cipher text: ' + cipher)

Ở đây tôi viết hàm caesar_cipher(message, mode, key). Hàm này làm cả 2 chức năng mã hóa và giải mã tùy vào mode = 'ENCRYPT' hay mode = 'DECRYPT'.

Kết quả:

Để thám mã 1 bản mã cho trước, tôi viết hàm caesar_crack(cipher), hàm này sẽ in ra tất cả các plain text có thể với key chạy từ 0 -> 25.

def caesar_crack(cipher):
    for key in range(0, 26):
        message = caesar_cipher(cipher, 'DECRYPT', key)
        print('key = {0:<4}   {1}'.format(str(key), message))
        

cipher = 'UBZANLGEBVQRCDHN'
print('nnCipher text:', cipher)
print('Available Message: n')
caesar_crack(cipher)

Kết quả:

Nhìn vào kết quả ta sẽ thấy key = 13 và message = HOMNAYTROIDEPQUA chính là bản rõ cần tìm.


Lời kết

Như vậy chúng ta đã hiểu và biết cách mã hóa, thám mã đối với hệ mã chuyển dịch Caesar.

Nguồn: https://drx.home.blog/2018/07/20/series-mat-ma-02-ma-caesar/

Đọc thêm: https://gravity-falls.fandom.com/vi/wiki/C%C3%A1c_c%C3%A1ch_gi%E1%BA%A3i_m%C3%A3_k%C3%AD_t%E1%BB%B1

Design a site like this with WordPress.com
Get started