Dịch chuyển mật mã Python Caesar

Hôm nay tôi muốn cho bạn xem đoạn script mã hóa nhỏ đã giúp tôi giải quyết Nested Easter Egg trong WebSec 101. Cửa hàng nước trái cây ⭐⭐⭐⭐ thử thách 2/3

Nó rất cơ bản triển khai python của mật mã dịch chuyển, còn được gọi là Mật mã Caesar, Mật mã Polybius hoặc ROT 13 [phụ thuộc vào giá trị dịch chuyển], đây là dạng mật mã thay thế nguyên thủy

Tôi đã định bắt đầu viết về những thứ liên quan đến mật mã, vì vậy chúng ta sẽ bắt đầu với việc “trở về cội nguồn”

Lịch sử và toán học đơn giản

Lịch sử của mật mã dài hơn bất kỳ ai có thể mong đợi - nó đã bắt đầu từ hàng ngàn năm trước. Lần sửa đổi cố ý đầu tiên của văn bản để che giấu một số thông tin xảy ra khoảng 4000 năm trước ở Ai Cập cổ đại. Người ta tin rằng người Ai Cập cổ đại đã sử dụng các biểu tượng khác thường để làm mờ ý nghĩa của các chữ khắc

Người Hy Lạp cổ đại hơn 2000 năm trước đã sử dụng Scytale– 'cỗ máy' mã hóa để tạo ra bản mã chuyển vị, và đối với người Hy Lạp, chúng ta mắc nợ thuật ngữ mật mã học - Cryptography, hoặc cryptology [từ tiếng Hy Lạp cổ đại. κρυπτός, La tinh hóa. kryptós “ẩn, bí mật”;

Mật mã Caesar là một trong những mật mã được biết đến nhiều nhất cho đến tận ngày nay – như tôi đã đề cập, nó được mô tả bởi nhà văn Hy Lạp Polyibus, nhưng lần sử dụng đầu tiên được ghi lại là bởi Julius Caesar

“Nếu anh ấy có điều gì bí mật muốn nói, anh ấy đã viết nó bằng mật mã, nghĩa là bằng cách thay đổi thứ tự các chữ cái trong bảng chữ cái để không thể đọc được một từ nào. Nếu bất cứ ai muốn giải mã những điều này và hiểu ý nghĩa của chúng, anh ta phải thay thế chữ cái thứ tư của bảng chữ cái, cụ thể là D, cho A, v.v. ”

Suetonius, Cuộc đời của Julius Caesar

Về cơ bản, để mã hóa thông điệp, Caesar đã thay thế chữ cái trong văn bản bằng một chữ cái ở ba vị trí bên phải

Mã hóa Caesar – có màu

Nếu chúng ta muốn mô tả nó bằng toán học hiện đại [hoặc cụ thể hơn. số học mô-đun], chúng tôi sẽ viết

26 là độ dài của bảng chữ cái Latinh và n=3 trong phiên bản Caesar của mật mã thay đổi này

Giải mã được thực hiện tương tự, nhưng theo một cách khác

Một phiên bản khác của Mật mã Caesar này là ROT 13 – xoay [dịch chuyển] chữ cái theo 13 thay vì od 3. Có thông tin cho rằng ROT13 đã được Netscape Communicator sử dụng vào những năm 1990 để lưu trữ mật khẩu của người dùng

Điều đáng chú ý là

def shift_cipher[text, shift, mode]:
3, vì Caesar đang thêm +3, ROT là +13

Trò đùa phổ biến trong cộng đồng mật mã học là ROT26 hoặc gấp đôi ROT 13 – lưu ý, chữ cái dịch chuyển đó

def shift_cipher[text, shift, mode]:
4 thực sự đang quay vòng… và không dịch chuyển. Vì vậy, ROT 13 là sự xâm nhập - đó là chức năng nghịch đảo của chính nó, cả mã hóa và giải mã

Đó là những mật mã Cộng/Thay thế rất đơn giản, nhưng cũng phải biết nền tảng 😊

Ghi chú. Việc phân tích mật mã của mật mã này không đáng kể – có một số kỹ thuật dựa trên phân tích tần số, nhưng cũng có những kỹ thuật brute force yêu cầu tới 25 lần đoán

Thực hiện

Tôi sẽ viết đoạn script đơn giản bằng python để triển khai hàm shift cipher. Để dễ tiếp cận, tôi sẽ chỉ tập trung vào bảng chữ cái viết thường

import string
alphabet = string.ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz'

Tôi muốn chức năng của mình lấy văn bản [cả văn bản gốc hoặc bản mã], giá trị dịch chuyển và chế độ [mã hóa –

def shift_cipher[text, shift, mode]:
5 hoặc giải mã –
def shift_cipher[text, shift, mode]:
6]

def shift_cipher[text, shift, mode]:

Sau đó, tôi sẽ hạ thấp văn bản của mình, thay đổi 'modulo truncate' [nếu ai đó sẽ thử e. g. thay đổi bằng 27 thay vì 1…] và khởi tạo đầu ra

def shift_cipher[text, shift, mode]:
    plain = text.lower[]
    shift %= len[alphabet]
    ciphertext = ''

Đối với mỗi chữ cái trong văn bản, tôi muốn tìm vị trí tương ứng [cho a -> 0, b->1 ,…] thêm shift và cắt bớt nó [modulo] với độ dài bảng chữ cái

Để tìm vị trí của chữ cái trong bảng chữ cái, tôi sẽ sử dụng hàm

def shift_cipher[text, shift, mode]:
7, trả về vị trí của một chữ cái nếu chuỗi. Nếu không tìm thấy chữ cái, nó trả về giá trị
def shift_cipher[text, shift, mode]:
8. Vì vậy, tôi sẽ kiểm tra xem giá trị có bằng
def shift_cipher[text, shift, mode]:
8 không [đối với tất cả các ký tự đặc biệt, chẳng hạn như dấu cách, dấu gạch chéo, v.v. ] và để nguyên, phần còn lại tôi sẽ thay đổi

    for letter in plain:
        position = alphabet.find[letter]
        
        if position == -1:
            ciphertext += letter
            continue
        
        if mode == 'enc':
            ciphertext += alphabet[[position+shift]%len[alphabet]]
        elif mode == 'dec':
            ciphertext += alphabet[[position-shift]%len[alphabet]

Toàn bộ chức năng ma thuật sau khi nối

def shift_cipher[text, shift, mode]:
    plain = text.lower[]
    shift %= len[alphabet]
    ciphertext = ''
    
    for letter in plain:
        position = alphabet.find[letter]
        
        if position == -1:
            ciphertext += letter
            continue
        
        if mode == 'enc':
            ciphertext += alphabet[[position+shift]%len[alphabet]]
        elif mode == 'dec':
            ciphertext += alphabet[[position-shift]%len[alphabet]]
             
    return ciphertext 

đập trứng

Chúng tôi sẽ thử với một ví dụ mã hóa đơn giản

>> print[f'head full of ciphers – 
{shift_cipher["head full of ciphers",3,"enc"]}']

head full of ciphers – khdg ixoo ri flskhuv

Và giải mã

>> print[f'khdg ixoo ri flskhuv – 
{shift_cipher ["khdg ixoo ri flskhuv",3,"dec"]}']

khdg ixoo ri flskhuv – head full of ciphers

Ngoài ra,

def shift_cipher[text, shift, mode]:
    plain = text.lower[]
    shift %= len[alphabet]
    ciphertext = ''
0 hay còn gọi là
def shift_cipher[text, shift, mode]:
    plain = text.lower[]
    shift %= len[alphabet]
    ciphertext = ''
1đã chọn

>> shift_cipher[shift_cipher['abcd',13,'enc'],13,'enc']
'abcd'

Nhưng chúng ta có một quả trứng để đập

Trong WebSec 101. Juice Shop ⭐⭐⭐⭐ thử thách 2/3 Tôi đã bị thử thách bởi mã hóa chuỗi Base64. Hãy gọi nó là

egg = 'L2d1ci9xcmlmL25lci9mYi9zaGFhbC9ndX\
JsL3V2cS9uYS9ybmZncmUvcnR0L2p2Z3V2YS9ndXIvcm5mZ3JlL3J0dA=='

Tôi đang lên kế hoạch để

  1. gán giá trị base64 cho biến
    def shift_cipher[text, shift, mode]:
        plain = text.lower[]
        shift %= len[alphabet]
        ciphertext = ''
    
    2
  2. giải mã chuỗi bằng bộ giải mã base64 –
    def shift_cipher[text, shift, mode]:
        plain = text.lower[]
        shift %= len[alphabet]
        ciphertext = ''
    
    3
  3. truyền byte thành chuỗi [byte đầu ra của bộ giải mã base64] với
    def shift_cipher[text, shift, mode]:
        plain = text.lower[]
        shift %= len[alphabet]
        ciphertext = ''
    
    4
  4. brute force tất cả các bản rõ có thể có với vòng lặp
    def shift_cipher[text, shift, mode]:
        plain = text.lower[]
        shift %= len[alphabet]
        ciphertext = ''
    
    5
    def shift_cipher[text, shift, mode]:
        plain = text.lower[]
        shift %= len[alphabet]
        ciphertext = ''
    
    6

Mã rất đơn giản

egg = 'L2d1ci9xcmlmL25lci9mYi9zaGFhbC9ndX\
JsL3V2cS9uYS9ybmZncmUvcnR0L2p2Z3V2YS9ndXIvcm5mZ3JlL3J0dA==' #step1
egg_decoded = base64.b64decode[egg] #step 2
egg_decoded = egg_decoded.decode["utf-8"] #step 3
print[f'step 1 - egg = {egg}']
print[f'step 2+3 - egg base64 decoded = {egg_decoded}']

for i in range[1,26]: #step4
    print[f'#{i} - {shift_cipher[egg_decoded,i,"dec"]}']

Và đầu ra giải câu đố

def shift_cipher[text, shift, mode]:
0

Một dòng có vẻ thú vị

def shift_cipher[text, shift, mode]:
1

Con người có thể đọc được và như chúng ta đã biết từ bài báo tương ứng, nó cũng giải quyết được thử thách Nested Easter Egg 😉

Phần kết luận

Thỉnh thoảng quay lại mật mã cổ điển và giải những câu đố kiểu này thực sự rất thú vị

Nếu bạn muốn xem cách giải quyết thử thách được đề cập từ đầu đến cuối trong 33 dòng, vui lòng xem bên dưới

def shift_cipher[text, shift, mode]:
2

Tôi thực sự tin rằng bài đăng này là một mở đầu khác cho chu kỳ rất thú vị trong lĩnh vực mật mã

Mã nguồn cho dự án này trên Github của tôi. HeadFullOfCiphers/CaesarCipher

Điều đó cho ngày hôm nay 😊 nếu bạn thích bài đăng này, có bất kỳ đề xuất, câu hỏi nào hoặc chỉ muốn liên hệ với tôi – đừng ngần ngại

Dịch chuyển trong mật mã Caesar là gì?

Julius Caesar nổi tiếng đã sử dụng loại mật mã này khi gửi tin nhắn cho các chỉ huy quân sự của mình. Mật mã thay đổi liên quan đến việc thay thế từng chữ cái trong tin nhắn bằng một chữ cái nằm ở một số vị trí cố định trong bảng chữ cái .

Mật mã Caesar có dịch chuyển sang trái hay phải không?

Khi mã hóa, một người tra cứu từng chữ cái của tin nhắn trong dòng "thuần túy" và viết ra chữ cái tương ứng trong dòng "mã hóa". Quá trình giải mã được thực hiện ngược lại, với dịch chuyển sang phải 3 .

Chủ Đề