Giải mã mật mã Caesar Python bằng khóa

Mật mã Caesar là một loại mật mã thay thế, trong đó mỗi chữ cái trong văn bản thuần túy được thay thế bằng một chữ cái khác ở một số vị trí cố định từ chữ cái hiện tại trong bảng chữ cái

Ví dụ: nếu chúng ta dịch chuyển mỗi chữ cái sang bên phải ba vị trí, mỗi chữ cái trong văn bản thuần túy của chúng ta sẽ được thay thế bằng một chữ cái ở ba vị trí bên phải của chữ cái trong văn bản thuần túy.
Chúng ta hãy xem hoạt động này – hãy mã hóa văn bản “HELLO WORLD” bằng cách dịch chuyển sang phải 3.

 

Vì vậy, chữ H sẽ được thay thế bằng K, E sẽ được thay thế bằng H, v.v. Tin nhắn được mã hóa cuối cùng cho HELLO WORLD sẽ là KHOOR ZRUOG. Điều vô nghĩa đó không có ý nghĩa, phải không?

Lưu ý rằng các chữ cái trên cạnh i. e. , X, Y, Z quấn quanh và lần lượt được thay thế bởi A, B, C trong trường hợp dịch chuyển phải. Tương tự, các chữ cái ở đầu – A, B, C, v.v. sẽ được quấn xung quanh trong trường hợp thay đổi trái

 Quy tắc mã hóa Mật mã Caesar có thể được biểu diễn bằng toán học dưới dạng

c = [x + n] % 26

Trong đó c là ký tự được mã hóa, x là ký tự thực và n là số vị trí chúng tôi muốn dịch chuyển ký tự x theo. Chúng tôi đang dùng mod với 26 vì có 26 chữ cái trong bảng chữ cái tiếng Anh

Mật mã Caesar trong Python

Trước khi đi sâu vào việc xác định các hàm cho quy trình mã hóa và giải mã của Mật mã Caesar trong Python, trước tiên chúng ta sẽ xem xét hai hàm quan trọng mà chúng ta sẽ sử dụng rộng rãi trong quá trình này – chr[] và ord[].
Điều quan trọng là phải nhận ra rằng bảng chữ cái như chúng ta biết, được lưu trữ khác nhau trong bộ nhớ của máy tính. Máy tính không tự hiểu bất kỳ bảng chữ cái tiếng Anh nào của chúng tôi hoặc các ký tự khác.

Mỗi ký tự này được thể hiện trong bộ nhớ máy tính bằng một số gọi là mã ASCII [hoặc phần mở rộng của nó – Unicode] của ký tự, là một số 8 bit và mã hóa hầu hết tất cả các ký tự, chữ số của ngôn ngữ tiếng Anh, .
Ví dụ: chữ hoa 'A' được biểu thị bằng số 65, 'B' bằng 66, v.v. Tương tự, biểu diễn các ký tự chữ thường bắt đầu bằng số 97.

Do nhu cầu kết hợp nhiều ký hiệu và ký tự của các ngôn ngữ khác phát sinh, 8 bit là không đủ nên tiêu chuẩn mới – Unicode – đã được thông qua, đại diện cho tất cả các ký tự được sử dụng trên thế giới bằng 16 bit.
ASCII là một tập hợp con của Unicode, vì vậy bảng mã ASCII của các ký tự vẫn giữ nguyên trong Unicode. Điều đó có nghĩa là 'A' sẽ vẫn được biểu thị bằng số 65 trong Unicode.
Lưu ý rằng các ký tự đặc biệt như dấu cách ” “, tab “\t”, dòng mới “\n”, v.v. cũng được thể hiện trong bộ nhớ bằng Unicode của chúng.

Chúng ta sẽ xem xét hai hàm tích hợp trong Python được sử dụng để tìm biểu diễn Unicode của một ký tự và ngược lại

Hàm ord[]

Bạn có thể sử dụng phương thức ord[] để chuyển đổi một ký tự thành biểu diễn số của nó trong Unicode. Nó chấp nhận một ký tự đơn và trả về số đại diện cho Unicode của nó. Hãy xem một ví dụ

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]

đầu ra

Hàm chr[]

Giống như cách chúng ta có thể chuyển đổi một ký tự thành số Unicode của nó bằng phương thức ord[], chúng ta thực hiện nghịch đảo i. e. , tìm ký tự được đại diện bởi một số bằng phương thức chr[].
Phương thức chr[] chấp nhận một số đại diện cho Unicode của một ký tự và trả về ký tự thực tế tương ứng với mã số.
Trước tiên hãy xem xét một vài ví dụ.

character_65 = chr[65]

character_100 = chr[100]

print["Unicode 65 represents", character_65]

print["Unicode 100 represents", character_100]

character_360 = chr[360]

print["Unicode 360 represents", character_360]

đầu ra

Lưu ý cách chữ cái tiếng Đức Ü [U sắc] cũng được biểu thị bằng số 360 trong Unicode

Chúng ta cũng có thể áp dụng thao tác xâu chuỗi [ord theo sau là chr] để lấy lại ký tự ban đầu

c = chr[ord["Ũ"]]

print[c]

đầu ra. Ũ

 

Mã hóa cho chữ in hoa

Bây giờ chúng ta đã hiểu hai phương pháp cơ bản mà chúng ta sẽ sử dụng, hãy triển khai kỹ thuật mã hóa cho các chữ in hoa trong Python. Chúng tôi sẽ chỉ mã hóa các ký tự in hoa trong văn bản và sẽ giữ nguyên các ký tự còn lại.
Trước tiên, hãy xem quy trình từng bước mã hóa các chữ in hoa.

  1. Xác định giá trị dịch chuyển i. e. , số lượng vị trí chúng tôi muốn chuyển từ mỗi ký tự
  2. Lặp lại từng ký tự của văn bản thuần túy
    1. Nếu ký tự là chữ hoa
      1. Tính vị trí/chỉ số của ký tự trong phạm vi 0-25
      2. Thực hiện sự dịch chuyển dương bằng cách sử dụng phép toán modulo
      3. Tìm ký tự ở vị trí mới
      4. Thay thế chữ in hoa hiện tại bằng ký tự mới này
    2. Khác, Nếu ký tự không phải là chữ hoa, hãy giữ nó không thay đổi

Bây giờ chúng ta hãy nhìn vào mã

shift = 3 # defining the shift count

text = "HELLO WORLD"

encryption = ""

for c in text:

    # check if character is an uppercase letter
    if c.isupper[]:

        # find the position in 0-25
        c_unicode = ord[c]

        c_index = ord[c] - ord["A"]

        # perform the shift
        new_index = [c_index + shift] % 26

        # convert to new character
        new_unicode = new_index + ord["A"]

        new_character = chr[new_unicode]

        # append to encrypted string
        encryption = encryption + new_character

    else:

        # since character is not uppercase, leave it as it is
        encryption += c
        
print["Plain text:",text]

print["Encrypted text:",encryption]

đầu ra

Như chúng ta có thể thấy, văn bản được mã hóa cho “HELLO WORLD” là “KHOOR ZRUOG” và nó khớp với văn bản mà chúng tôi đã truy cập theo cách thủ công trong phần Giới thiệu.
Ngoài ra, phương pháp này không mã hóa ký tự khoảng trắng và nó tiếp tục là khoảng trắng trong phiên bản được mã hóa.

 

Giải mã cho chữ in hoa

Bây giờ chúng ta đã tìm ra cách mã hóa cho các chữ in hoa của văn bản thuần túy bằng Ceaser Cipher, hãy xem cách chúng ta sẽ giải mã bản mã thành văn bản thuần túy

Trước đó, chúng ta đã xem xét công thức toán học của quá trình mã hóa. Bây giờ chúng ta hãy kiểm tra tương tự cho quá trình giải mã

x = [c - n] % 26

Ý nghĩa của các ký hiệu vẫn giống như trong công thức trước.
Nếu bất kỳ giá trị nào trở thành âm sau khi trừ, toán tử modulo sẽ xử lý việc đó và nó sẽ bao quanh giá trị đó.

Chúng ta hãy xem quá trình thực hiện từng bước của quá trình giải mã, điều này ít nhiều sẽ ngược lại với quá trình mã hóa

  • Xác định số ca
  • Lặp lại từng ký tự trong văn bản được mã hóa
    • Nếu ký tự là chữ in hoa
      1. Tính vị trí/chỉ số của ký tự trong phạm vi 0-25
      2. Thực hiện sự dịch chuyển âm bằng phép toán modulo
      3. Tìm ký tự ở vị trí mới
      4. Thay thế ký tự được mã hóa hiện tại bằng ký tự mới này [cũng sẽ là ký tự viết hoa]
      5. Ngược lại, nếu ký tự không viết hoa, hãy giữ nguyên

Viết code cho thủ tục trên

shift = 3 # defining the shift count

encrypted_text = "KHOOR ZRUOG"

plain_text = ""

for c in encrypted_text:

    # check if character is an uppercase letter
    if c.isupper[]:

        # find the position in 0-25
        c_unicode = ord[c]

        c_index = ord[c] - ord["A"]

        # perform the negative shift
        new_index = [c_index - shift] % 26

        # convert to new character
        new_unicode = new_index + ord["A"]

        new_character = chr[new_unicode]

        # append to plain string
        plain_text = plain_text + new_character

    else:

        # since character is not uppercase, leave it as it is
        plain_text += c

print["Encrypted text:",encrypted_text]

print["Decrypted text:",plain_text]

đầu ra

Lưu ý cách chúng tôi đã khôi phục thành công văn bản gốc “HELLO WORLD” từ dạng mã hóa của nó

 

Mã hóa số và dấu câu

Bây giờ chúng ta đã thấy cách chúng ta có thể mã hóa và giải mã các chữ in hoa của bảng chữ cái tiếng Anh bằng Mật mã Caesar, một câu hỏi quan trọng được đặt ra – Còn các ký tự khác thì sao?
Còn các ký tự khác thì sao?

Chà, thuật toán Mật mã Caesar ban đầu không được phép xử lý bất kỳ thứ gì khác ngoài 26 chữ cái của bảng chữ cái – dù là chữ hoa hay chữ thường.
Vì vậy, Mật mã Caesar điển hình sẽ không mã hóa dấu chấm câu hoặc số và sẽ chuyển đổi tất cả các chữ cái thành chữ thường hoặc chữ hoa và chỉ mã hóa các ký tự đó.

Nhưng chúng ta luôn có thể mở rộng giải pháp tốt hiện có và điều chỉnh chúng cho phù hợp với nhu cầu của mình – điều đó đúng với bất kỳ loại thử thách nào trong công nghệ phần mềm.
Vì vậy, chúng tôi sẽ cố gắng mã hóa các ký tự chữ hoa và chữ thường theo cách chúng tôi đã làm trong phần trước, bây giờ chúng tôi sẽ bỏ qua các dấu câu và sau đó chúng tôi cũng sẽ mã hóa các số trong văn bản.

Đối với các số, chúng tôi có thể thực hiện mã hóa theo một trong hai cách

  1. Dịch chuyển giá trị chữ số theo cùng một lượng khi bạn dịch chuyển các chữ cái trong bảng chữ cái, i. e. , để dịch chuyển 3 – chữ số 5 trở thành 8, 2 trở thành 5, 9 trở thành 2, v.v.
  2. Biến các số thành một phần của bảng chữ cái, tôi. e. , z hoặc Z sẽ được theo sau bởi 0,1,2. lên đến 9, và lần này bộ chia của chúng ta cho phép toán modulo sẽ là 36 thay vì 26

Chúng tôi sẽ triển khai giải pháp của mình bằng chiến lược đầu tiên. Ngoài ra, lần này, chúng tôi sẽ triển khai giải pháp của mình dưới dạng một hàm chấp nhận giá trị shift [đóng vai trò là khóa trong Mật mã Caesar] làm tham số.
Chúng ta sẽ triển khai 2 chức năng – cipher_encrypt[] và cipher_decrypt[]
Hãy bắt tay vào làm.

Giải pháp

# The Encryption Function
def cipher_encrypt[plain_text, key]:

    encrypted = ""

    for c in plain_text:

        if c.isupper[]: #check if it's an uppercase character

            c_index = ord[c] - ord['A']

            # shift the current character by key positions
            c_shifted = [c_index + key] % 26 + ord['A']

            c_new = chr[c_shifted]

            encrypted += c_new

        elif c.islower[]: #check if its a lowecase character

            # subtract the unicode of 'a' to get index in [0-25] range
            c_index = ord[c] - ord['a'] 

            c_shifted = [c_index + key] % 26 + ord['a']

            c_new = chr[c_shifted]

            encrypted += c_new

        elif c.isdigit[]:

            # if it's a number,shift its actual value 
            c_new = [int[c] + key] % 10

            encrypted += str[c_new]

        else:

            # if its neither alphabetical nor a number, just leave it like that
            encrypted += c

    return encrypted

# The Decryption Function
def cipher_decrypt[ciphertext, key]:

    decrypted = ""

    for c in ciphertext:

        if c.isupper[]: 

            c_index = ord[c] - ord['A']

            # shift the current character to left by key positions to get its original position
            c_og_pos = [c_index - key] % 26 + ord['A']

            c_og = chr[c_og_pos]

            decrypted += c_og

        elif c.islower[]: 

            c_index = ord[c] - ord['a'] 

            c_og_pos = [c_index - key] % 26 + ord['a']

            c_og = chr[c_og_pos]

            decrypted += c_og

        elif c.isdigit[]:

            # if it's a number,shift its actual value 
            c_og = [int[c] - key] % 10

            decrypted += str[c_og]

        else:

            # if its neither alphabetical nor a number, just leave it like that
            decrypted += c

    return decrypted

Bây giờ chúng ta đã xác định hai chức năng của mình, trước tiên hãy sử dụng chức năng mã hóa để mã hóa một tin nhắn bí mật mà một người bạn đang chia sẻ qua tin nhắn văn bản cho bạn của anh ấy

________số 8

đầu ra

Lưu ý cách mọi thứ trừ dấu chấm câu và dấu cách đã được mã hóa

Bây giờ chúng ta hãy xem một bản mã mà Đại tá Nick Fury đã gửi trên máy nhắn tin của anh ấy. ‘Sr xli gsyrx sj 7, 6, 5 – Ezirkivw Ewwiqfpi. ‘
Hóa ra đó là bản mã của Caesar và may mắn thay, chúng tôi đã có trong tay chìa khóa của bản mã này.
Hãy xem liệu chúng ta có thể khai quật được thông điệp ẩn không.

ciphertext = "Sr xli gsyrx sj 7, 6, 5 - Ezirkivw Ewwiqfpi!"

decrypted_msg = cipher_decrypt[ciphertext, 4]

print["The cipher text:\n", ciphertext]

print["The decrypted message is:\n",decrypted_msg]

đầu ra

Tốt lắm, Avengers

Sử dụng bảng tra cứu

Ở giai đoạn này, chúng tôi đã hiểu quy trình mã hóa và giải mã của Mật mã Caesar và đã triển khai tương tự trong Python

Bây giờ chúng ta sẽ xem xét cách làm cho nó hiệu quả hơn và linh hoạt hơn.
Cụ thể, chúng tôi sẽ tập trung vào cách chúng tôi có thể tránh tính toán lặp lại các vị trí đã dịch chuyển cho từng chữ cái trong văn bản trong quá trình mã hóa và giải mã, bằng cách xây dựng bảng tra cứu trước thời hạn.

Chúng tôi cũng sẽ xem xét cách chúng tôi có thể điều chỉnh bất kỳ tập hợp ký hiệu nào do người dùng xác định chứ không chỉ các chữ cái trong bảng chữ cái trong quy trình mã hóa của chúng tôi.
Chúng tôi cũng sẽ hợp nhất quy trình mã hóa và giải mã thành một chức năng và sẽ chấp nhận tham số mà người dùng muốn thực hiện trong hai quy trình.

Bảng tra cứu là gì?

Bảng tra cứu chỉ đơn giản là ánh xạ của các ký tự gốc và các ký tự mà chúng sẽ dịch sang dạng được mã hóa.
Cho đến giờ, chúng ta đã lặp lại từng chữ cái trong chuỗi và tính toán vị trí thay đổi của chúng.
Điều này không hiệu quả vì bộ ký tự của chúng tôi bị giới hạn và hầu hết chúng xuất hiện nhiều lần trong chuỗi.
Vì vậy, việc tính toán giá trị tương đương được mã hóa của chúng mỗi khi chúng xảy ra là không hiệu quả và sẽ trở nên tốn kém nếu chúng ta mã hóa một văn bản rất dài với hàng trăm nghìn ký tự trong đó.

Chúng ta có thể tránh điều này bằng cách tính toán vị trí thay đổi của từng ký tự trong bộ ký tự của chúng ta chỉ một lần trước khi bắt đầu quá trình mã hóa.
Vì vậy, nếu có 26 chữ hoa và 26 chữ thường, thì chúng ta chỉ cần 52 phép tính một lần và một khoảng trống trong bộ nhớ để lưu trữ ánh xạ này.
Sau đó, trong quá trình mã hóa và giải mã, tất cả những gì chúng ta phải làm là thực hiện 'tra cứu' trong bảng này – một thao tác nhanh hơn so với thực hiện thao tác modulo mỗi lần.

Tạo bảng tra cứu

Mô-đun chuỗi của Python cung cấp một cách dễ dàng không chỉ để tạo bảng tra cứu mà còn để dịch bất kỳ chuỗi mới nào dựa trên bảng này

Hãy lấy một ví dụ mà chúng ta muốn tạo một bảng gồm năm chữ cái viết thường đầu tiên và chỉ số của chúng trong bảng chữ cái.
Sau đó, chúng tôi sẽ sử dụng bảng này để dịch một chuỗi trong đó mỗi lần xuất hiện 'a', 'b', 'c', 'd' và 'e' được thay thế bằng '0 .

Chúng ta sẽ sử dụng hàm maketrans[] của mô-đun str để tạo bảng.
Phương thức này chấp nhận tham số đầu tiên của nó là một chuỗi ký tự cần dịch và một tham số chuỗi khác có cùng độ dài chứa các ký tự được ánh xạ cho mỗi ký tự trong chuỗi đầu tiên.

Hãy tạo một bảng cho một ví dụ đơn giản

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
0

Bảng là một từ điển Python có giá trị Unicode của các ký tự làm khóa và ánh xạ tương ứng của chúng làm giá trị.
Bây giờ chúng ta đã có sẵn bảng, chúng ta có thể dịch các chuỗi có độ dài bất kỳ bằng bảng này.
May mắn thay, bản dịch cũng được xử lý bởi một chức năng khác trong mô-đun str, được gọi là dịch.

Hãy sử dụng phương pháp này để chuyển đổi văn bản của chúng tôi bằng bảng của chúng tôi

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
1

đầu ra

Như bạn có thể thấy, mỗi trường hợp của năm chữ cái viết thường đầu tiên đã được thay thế bằng các chỉ số tương đối của chúng

Bây giờ chúng ta sẽ sử dụng kỹ thuật tương tự để tạo bảng tra cứu cho Mật mã Caesar, dựa trên khóa được cung cấp

Triển khai mã hóa

Hãy tạo một hàm caesar_cipher[] chấp nhận một chuỗi sẽ được mã hóa/giải mã, 'bộ ký tự' cho biết ký tự nào trong chuỗi sẽ được mã hóa [hàm này sẽ mặc định là chữ thường],
the key, and a boolean value showing if decryption has performed or otherwise[encryption].

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
2

Bây giờ đó là một chức năng mạnh mẽ ngoài kia

Toàn bộ thao tác dịch chuyển đã được rút gọn thành thao tác cắt.
Ngoài ra, chúng tôi đang sử dụng chuỗi. thuộc tính ascii_lowercase – đó là một chuỗi ký tự từ ‘a’ đến ‘z’.
Một tính năng quan trọng khác mà chúng tôi đã đạt được ở đây là cùng một chức năng đạt được cả mã hóa và giải mã; .
Thao tác cắt cùng với khóa mới này đảm bảo bộ ký tự đã được dịch trái – điều mà chúng tôi thực hiện trong quá trình giải mã bản mã Caesar dịch phải.

Hãy xác thực xem điều này có hiệu quả hay không bằng cách sử dụng một ví dụ trước đó.
Chúng tôi sẽ chỉ mã hóa chữ in hoa của văn bản và sẽ cung cấp thông số tương tự cho tham số 'ký tự'.
Chúng tôi sẽ mã hóa văn bản. "CHÀO THẾ GIỚI. Chào mừng đến với thế giới của mật mã. ”

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
3

đầu ra

Kiểm tra xem phần “KHOOR ZRUOG” khớp với mã hóa “HELLO WORLD” bằng khóa 3 như thế nào trong ví dụ đầu tiên của chúng tôi.
Ngoài ra, xin lưu ý rằng chúng tôi đang chỉ định bộ ký tự là chữ in hoa bằng chuỗi. ascii_uppercase

Chúng tôi có thể kiểm tra xem quá trình giải mã có hoạt động bình thường hay không bằng cách sử dụng cùng một văn bản được mã hóa mà chúng tôi nhận được trong kết quả trước đó.
Nếu chúng tôi có thể khôi phục lại văn bản gốc, điều đó có nghĩa là chức năng của chúng tôi hoạt động hoàn hảo.

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
4

đầu ra

Lưu ý cách chúng tôi đã đặt tham số 'giải mã' trong chức năng của mình thành True.
Vì chúng tôi đã khôi phục lại văn bản gốc nên đó là dấu hiệu cho thấy thuật toán mã hóa-giải mã của chúng tôi sử dụng bảng tra cứu đang hoạt động tốt.

Bây giờ, hãy xem liệu chúng ta có thể mở rộng bộ ký tự để bao gồm không chỉ các ký tự chữ thường/chữ hoa mà còn cả các chữ số và dấu chấm câu

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
5

đầu ra

Ở đây chúng tôi đã bao gồm tất cả các ký tự mà chúng tôi đã thảo luận cho đến nay [bao gồm cả ký tự khoảng trắng] trong bộ ký tự sẽ được mã hóa.
Kết quả là mọi thứ [kể cả khoảng trắng] trong văn bản thuần túy của chúng tôi đã được thay thế bằng một biểu tượng khác.
Sự khác biệt duy nhất ở đây là việc bao quanh không xảy ra riêng lẻ cho các ký tự chữ thường hoặc chữ hoa, mà nó xảy ra chung cho toàn bộ bộ ký tự.
Điều đó có nghĩa là 'Y' với sự thay đổi 3 sẽ không trở thành 'B', nhưng sẽ được mã hóa thành '1'.

 

chuyển dịch âm

Cho đến nay, chúng tôi đã thực hiện chuyển đổi 'tích cực' hoặc 'chuyển đổi phải' của các ký tự trong quy trình mã hóa. Và quá trình giải mã cho điều tương tự liên quan đến việc thực hiện dịch chuyển 'âm' hoặc 'dịch trái' của các ký tự.
Nhưng nếu chúng ta muốn thực hiện quá trình mã hóa với một sự dịch chuyển âm thì sao? . Thay đổi duy nhất chúng ta cần cho một phép dịch trái là làm cho dấu của khóa âm, phần còn lại của quá trình sẽ giữ nguyên và sẽ đạt được kết quả là một phép dịch trái trong quá trình mã hóa và một phép dịch phải trong quá trình giải mã.
Yes, it will, but only slightly. The only change we need for a left shift is to make the sign of the key negative, the rest of the process shall remain the same and will achieve the result of a left shift in encryption and a right shift in the decryption process.

Hãy để chúng tôi thử điều này bằng cách sửa đổi chức năng trước đó của chúng tôi bằng cách thêm một tham số khác – ‘shift_type’ vào chức năng của chúng tôi cipher_cipher_using_lookup[]

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
6

Hãy để chúng tôi kiểm tra phương pháp sửa đổi này trên một văn bản đơn giản

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
7

đầu ra

Lưu ý cách mỗi ký tự trong văn bản thuần túy của chúng ta đã được dịch chuyển sang trái ba vị trí.
Bây giờ hãy kiểm tra quá trình giải mã bằng cùng một chuỗi.

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
8

đầu ra

Vì vậy, chúng tôi có thể mã hóa và giải mã văn bản bằng bảng tra cứu và khóa phủ định

 

mã hóa tập tin

Trong phần này, chúng ta sẽ xem xét sử dụng Mật mã Caesar để mã hóa tệp.
Lưu ý rằng chúng tôi chỉ có thể mã hóa các tệp văn bản thuần túy chứ không phải các tệp nhị phân vì chúng tôi biết bộ ký tự cho các tệp văn bản thuần túy.
Vì vậy, bạn có thể mã hóa tệp bằng một trong hai phương pháp sau.

  1. Đọc toàn bộ tệp thành một chuỗi, mã hóa chuỗi và đổ nó vào một tệp khác
  2. Đọc lặp lại tệp một dòng tại một thời điểm, mã hóa dòng và ghi nó vào một tệp văn bản khác

Chúng ta sẽ sử dụng phương pháp thứ hai vì phương pháp đầu tiên chỉ khả thi đối với các tệp nhỏ có nội dung có thể dễ dàng phù hợp với bộ nhớ.
Vì vậy, hãy xác định một hàm chấp nhận tệp và mã hóa tệp đó bằng Mật mã Caesar với dịch chuyển sang phải là 3. Chúng tôi sẽ sử dụng bộ ký tự mặc định của các chữ cái viết thường.

c_unicode = ord["c"]

A_unicode = ord["A"]

print["Unicode of 'c' =", c_unicode]

print["Unicode of 'A' =", A_unicode]
9

Hàm chấp nhận tên tệp đầu vào, tên tệp đầu ra và các tham số mã hóa/giải mã mà chúng ta đã thấy trong phần trước

Hãy mã hóa một tập tin ‘milky_way. txt‘ [có đoạn giới thiệu trang ‘Milky Way’ trên Wikipedia].
Chúng tôi sẽ xuất tệp được mã hóa thành ‘milky_way_encrypted. txt‘.

Hãy mã hóa nó bằng chức năng chúng tôi đã xác định ở trên

character_65 = chr[65]

character_100 = chr[100]

print["Unicode 65 represents", character_65]

print["Unicode 100 represents", character_100]

character_360 = chr[360]

print["Unicode 360 represents", character_360]
0

đầu ra

Hãy kiểm tra xem tệp được mã hóa của bạn 'milky_way được mã hóa như thế nào. txt‘ trông giống như bây giờ

character_65 = chr[65]

character_100 = chr[100]

print["Unicode 65 represents", character_65]

print["Unicode 100 represents", character_100]

character_360 = chr[360]

print["Unicode 360 represents", character_360]
1

Vì vậy, chức năng của chúng tôi mã hóa chính xác tệp.
Để thực hành, bạn có thể thử chức năng giải mã bằng cách chuyển đường dẫn tệp được mã hóa làm đầu vào và đặt tham số 'giải mã' thành True.
Xem liệu bạn có thể khôi phục văn bản gốc không.

Đảm bảo rằng bạn không chuyển cùng một đường dẫn tệp cho cả đầu vào và đầu ra, điều này sẽ dẫn đến kết quả không mong muốn vì chương trình sẽ thực hiện đồng thời thao tác đọc và ghi trên cùng một tệp

 

Nhiều ca [Mật mã Vigenère]

Cho đến nay, chúng tôi đã sử dụng một giá trị dịch chuyển duy nhất [phím] để dịch chuyển tất cả các ký tự của chuỗi theo cùng một số. của các vị trí.
Chúng ta cũng có thể thử một biến thể của cách này, trong đó chúng ta sẽ không sử dụng một phím mà là một chuỗi các phím để thực hiện các chuyển đổi khác nhau ở các vị trí khác nhau trong văn bản.

Ví dụ: giả sử chúng ta sử dụng một chuỗi gồm 4 phím. [1,5,2,3] Với phương pháp này, ký tự đầu tiên của chúng ta trong văn bản sẽ bị dịch chuyển một vị trí, ký tự thứ hai sẽ bị dịch chuyển năm vị trí,
ký tự thứ 3 bị dịch chuyển .
Đây là phiên bản cải tiến của Mật mã Caesar và được gọi là Mật mã Vigenère.

Hãy để chúng tôi thực hiện Mật mã Vigenère

character_65 = chr[65]

character_100 = chr[100]

print["Unicode 65 represents", character_65]

print["Unicode 100 represents", character_100]

character_360 = chr[360]

print["Unicode 360 represents", character_360]
2

Hàm thực hiện cả mã hóa và giải mã, tùy thuộc vào giá trị của tham số boolean 'decrypt'.
Chúng tôi đang giữ tổng số chữ cái viết thường được mã hóa/giải mã bằng cách sử dụng biến i, chúng tôi sử dụng giá trị này với toán tử modulo để xác định khóa nào trong danh sách sẽ được sử dụng tiếp theo.
Lưu ý rằng chúng tôi đã thực hiện thao tác thay đổi rất nhỏ gọn; .

Hãy để chúng tôi kiểm tra chức năng này bằng một văn bản thuần túy khác

character_65 = chr[65]

character_100 = chr[100]

print["Unicode 65 represents", character_65]

print["Unicode 100 represents", character_100]

character_360 = chr[360]

print["Unicode 360 represents", character_360]
3

đầu ra

Ở đây, chúng tôi đang thực hiện mã hóa bằng các phím [1,2,3] và như mong đợi, ký tự đầu tiên 'w' đã được dịch chuyển một vị trí thành 'x',
the second character ‘e’ has been shifted by two positions to ‘g’; the third character ‘w’ is shifted by three positions to ‘z’.
Quá trình này lặp lại với các ký tự tiếp theo.
Hãy tiếp tục và thực hiện quá trình giải mã với cùng các khóa đó và xem liệu bạn có thể khôi phục lại câu lệnh ban đầu hay không.

 

Tại sao Mật mã Caesar lại yếu?

Việc hiểu và triển khai Mật mã Caesar đơn giản như vậy, nó giúp mọi người dễ dàng tìm ra cách giải mã mà không tốn nhiều công sức.
Mật mã Caesar là một kỹ thuật mật mã thay thế trong đó chúng ta thay thế từng ký tự trong văn bản bằng một số ký tự cố định.

Nếu ai đó xác định tính đều đặn và khuôn mẫu trong sự xuất hiện của một số ký tự nhất định trong bản mã, họ sẽ nhanh chóng xác định rằng Mật mã Caesar đã được sử dụng để mã hóa văn bản.
Sau khi bạn tin chắc rằng kỹ thuật Mật mã Caesar đã được sử dụng để mã hóa văn bản, thì việc khôi phục văn bản gốc mà không cần sở hữu khóa là một việc dễ dàng.
Thuật toán BruteForce đơn giản tìm ra văn bản gốc trong một khoảng thời gian giới hạn.

 

Tấn công vũ phu

Việc phá một bản mã được mã hóa bằng Mật mã Caesar chỉ là thử tất cả các khóa có thể.
Điều này khả thi vì chỉ có thể có một số khóa giới hạn có thể tạo ra một bản mã duy nhất.

Ví dụ, nếu bản mã có tất cả chữ thường được mã hóa, tất cả những gì chúng ta phải làm là chạy bước giải mã với các giá trị khóa từ 0 đến 25.
Ngay cả khi người dùng đã cung cấp khóa lớn hơn 25, nó sẽ tạo ra một bản mã giống với một trong những bản mã được tạo bằng cách sử dụng các khóa từ 0 đến 25.

Hãy kiểm tra một bản mã có tất cả các ký tự chữ thường được mã hóa và xem liệu chúng ta có thể trích xuất một văn bản hợp lý từ nó bằng cách sử dụng một cuộc tấn công BruteForce hay không.
Văn bản chúng ta đang có là.

character_65 = chr[65]

character_100 = chr[100]

print["Unicode 65 represents", character_65]

print["Unicode 100 represents", character_100]

character_360 = chr[360]

print["Unicode 360 represents", character_360]
4

Trước tiên, hãy xác định chức năng giải mã chấp nhận bản mã và khóa, đồng thời giải mã tất cả các chữ cái viết thường của nó

character_65 = chr[65]

character_100 = chr[100]

print["Unicode 65 represents", character_65]

print["Unicode 100 represents", character_100]

character_360 = chr[360]

print["Unicode 360 represents", character_360]
5

Bây giờ chúng tôi có văn bản của mình, nhưng chúng tôi không biết phím i. e. , giá trị dịch chuyển. Hãy viết một cuộc tấn công Brute force, thử tất cả các khóa từ 0 đến 25 và hiển thị từng chuỗi được giải mã

character_65 = chr[65]

character_100 = chr[100]

print["Unicode 65 represents", character_65]

print["Unicode 100 represents", character_100]

character_360 = chr[360]

print["Unicode 360 represents", character_360]
6

đầu ra

Đầu ra liệt kê tất cả các chuỗi bạn có thể tạo từ quá trình giải mã.
Nếu bạn nhìn kỹ, chuỗi có khóa 14 là một câu lệnh tiếng Anh hợp lệ và do đó là lựa chọn chính xác.

Bây giờ bạn đã biết cách phá văn bản mã hóa Caesar Cipher.
Chúng ta có thể sử dụng các biến thể khác, mạnh hơn của Mật mã Caesar, chẳng hạn như sử dụng nhiều ca [mật mã Vigenère], nhưng ngay cả trong những trường hợp đó, những kẻ tấn công kiên quyết có thể dễ dàng tìm ra cách giải mã chính xác.
Vì vậy, thuật toán Mật mã Caesar tương đối yếu hơn nhiều so với các thuật toán mã hóa hiện đại.

Phần kết luận

Trong hướng dẫn này, chúng ta đã tìm hiểu Mật mã Caesar là gì, cách triển khai mã này trong Python dễ dàng như thế nào và cách triển khai mã này có thể được tối ưu hóa hơn nữa bằng cách sử dụng cái mà chúng tôi gọi là 'bảng tra cứu'.
Chúng tôi đã viết một hàm Python để triển khai thuật toán mã hóa/giải mã Caesar Cipher chung, thuật toán này lấy nhiều đầu vào của người dùng làm tham số mà không cần giả định nhiều.

Sau đó, chúng tôi đã xem xét cách chúng tôi có thể mã hóa tệp bằng Mật mã Caesar và sau đó là cách Mật mã Caesar có thể được tăng cường bằng cách sử dụng nhiều ca.
Cuối cùng, chúng tôi đã xem xét mức độ dễ bị tấn công của Mật mã Caesar trước các cuộc tấn công BruteForce.

  • Chia sẻ trên facebook
  • Tweet trên Twitter

Mokhtar Ebrahim

Mokhtar là người sáng lập LikeGeek. com. Anh ấy làm quản trị viên hệ thống Linux từ năm 2010. Ông chịu trách nhiệm duy trì, bảo mật và khắc phục sự cố máy chủ Linux cho nhiều khách hàng trên khắp thế giới. Anh ấy thích viết các tập lệnh shell và Python để tự động hóa công việc của mình

Làm cách nào để giải mã bản mã bằng Python?

Mật mã với Python - Mật mã ngược .
Mã hóa ngược sử dụng mô hình đảo ngược chuỗi văn bản thuần túy để chuyển thành văn bản mật mã
Quá trình mã hóa và giải mã giống nhau
Để giải mã bản mã, người dùng chỉ cần đảo ngược bản mã để lấy văn bản thuần túy

Làm thế nào mật mã Caesar có thể bị bẻ khóa?

Bởi vì chỉ có 25 khóa có thể, mật mã Caesar rất dễ bị tấn công "brute force", trong đó bộ giải mã chỉ cần thử từng tổ hợp chữ cái có thể có.

Bạn có thể brute force Caesar mật mã?

Tấn công Brute-Force . Đây không phải là một vụ hack phức tạp, nhưng thông qua nỗ lực tuyệt đối [mà máy tính sẽ làm thay chúng ta], mật mã Caesar có thể bị phá .

Chủ Đề