[Crypto] 02 – Mã Caesar

Giới thiệu

Hệ thống mật mã cổ xưa ( những loại mật mã được ý tưởng 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 hoàn toàn có thể chia thành 2 dạng lớn : mật mã chuyển vị và mật mã sửa chữa thay thế .
Mật mã chuyển vị là loại mật mã mà những kí tự trong bản rõ sẽ được hoán vị theo một phương pháp nào đó để tạo nên bản mã. Ví dụ nổi bật 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òn 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òn 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 Open ở những game show đ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 diễn ở đâ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.

Bạn đang đọc: [Crypto] 02 – Mã Caesar

Hệ mã Caesar, hay mã chuyển dời ( Shift cipher ) là hệ mật mã thay thế sửa chữa đơn thuầ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 vần âm Tiếng Anh có 26 vần âm 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ời đượ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 = 13message = HOMNAYTROIDEPQUA chính là bản rõ cần tìm.

Lời kết

Như vậy tất cả chúng ta đã hiểu và biết cách mã hóa, thám mã so với hệ mã chuyển dời Caesar .
Tiếp theo tất cả chúng ta sẽ sang một hệ mật mã phổ cập khác : Mã Affine .

Dành cho đọc giả:

Trước khi sang bài tiếp theo, mời đọc giả đọc bài Kiểm tra một đoạn văn bản có phải Tiếng Anh hay không. Sau đó làm bài tập sau: Áp dụng hàm isEnglish() có trong module detectEnglish() để viết lại hàm caesar_crack() sao cho hàm trả về luôn kết quả bản rõ ban đầu mà không cần in ra tất cả các trường hợp.

Download mã nguồn CaesarCipher. py
< < Bài 1 – Tổng quan những loại mật mã Bài 3 – Mã Affine >>
Advertisement

Chia sẻ:

Thích bài này:

Thích

Đang tải ...

[Crypto] 02 – Mã Caesar

Bài viết liên quan
Hotline 24/7: O984.666.352
Alternate Text Gọi ngay