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
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 để
- gán giá trị base64 cho biến
def shift_cipher[text, shift, mode]: plain = text.lower[] shift %= len[alphabet] ciphertext = ''
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 - 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 - 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 = ''
5def 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