Cách mã hóa và giải mã tin nhắn bằng Base64 và Python

App GUI đơn giản này là một công cụ tiện ích. Phát triển nó sẽ giúp bạn rèn luyện kỹ năng Python.

Lập trình bằng Python

Mô đun Base64 của Python là một công cụ mạnh mẽ để mã hóa và giải mã tin nhắn. Bạn có thể dùng nó để gửi dữ liệu an toàn qua Internet. Nó là quy trình chuẩn cho web, app và các dịch vụ giao tiếp sử dụng loại hình mã hóa này để bảo vệ dữ liệu nhạy cảm khỏi các hacker xấu.

Mô đun Base64 có một cặp chức năng mà bạn có thể dùng để mã hóa và giải mã tin nhắn, tăng an toàn khi chuyển dữ liệu.

Mô đun Tkinter và Base64

Tkinter cho phép bạn tạo các ứng dụng desktop. Nó cung cấp một loạt widget như nút bấm, nhãn dán và hộp văn bản cho bạn dễ dàng phát triển app mà không mất nhiều công sức. Bạn có thể tạo các chương trình GUI ấn tượng với Tkinter. Bạn có thể xây dựng một máy tính đơn giản, app danh sách việc cần làm hoặc một game kiểm tra kỹ năng đánh máy. Để cài đặt Tkinter vào hệ thống, mở terminal và gõ:

pip install tkinter

BASE64 cung cấp các hàm để mã hóa dữ liệu nhị phân để ASCII giải mã chúng trở lại nhị phân. Nó hỗ trợ cả mã hóa chuẩn và URL an toàn. Điều đó khiến việc chuyển thông tin an toàn hơn. Để chuyển đổi một chuỗi thành ký tự Base64, lấy giá trị ASCII của từng ký tự và tính giá trị nhị phân 8-bit của nó. Chuyển đổi đoạn 6 bit này bằng cách nhóm lại các con số và chuyển đổi lại chúng vào các giá trị thập phân tương ứng. Cuối cùng, dùng bảng mã hóa Base64 để lấy giá trị Base64 cho từng số thập phân.

Cách mã hóa và giải mã tin nhắn trong Python

Bắt đầu bằng cách nhập cả hai mô đun. Khởi tạo phiên bản Tkinter và hiện cửa sổ root. Thiết lập tiêu đề, kích thước theo pixel và màu nền của cửa sổ.

from tkinter import *
import base64

root = Tk()
root.geometry('750x400')
root.configure(background='aqua')
root.title("Encode and Decode Messages Using Python")

Dùng widget Label để hiện thông tin hữu ích về ứng dụng này. Widget này chấp nhận một cửa sổ chính mà bạn muốn đặt nó, hiển thị nội dung, kiểu font, màu sắc và màu nền. Dùng pack() để sắp xếp widget trong một khối bố cục trước khi đặt nó vào widget chính. StringVar khiến việc kiểm soát giá trị của widget dễ dàng hơn, chẳng hạn như thông qua Label hoặc Entry.

Label(root, text='Python Message Encoder and Decoder', font='arial 25 bold', fg='white', bg="purple").pack()
Text = StringVar()
key = StringVar()
mode = StringVar()
Result = StringVar()

Xác định một hàm Encode() chấp nhận một khóa để mã hóa và giải mã cùng với tin nhắn. Xác định một danh sách trống và lặp lại cho tới hết độ dài của tin nhắn. Thiết lập chỉ mục của khóa làm mô đun hoạt động và lưu trữ giá trị của nó trong biến key_c. Dùng ord() để lấy giá trị Unicode của ký tự và dùng chr() để lấy ký tự đại diện cho giá trị được xác định.

Thêm giá trị này vào danh sách. Nối từng tành phần của danh sách với một chuỗi trống và dùng phương thức encode để trả về một phiên bản đã được mã hóa utf-8 của chuỗi này. Phương thức base64.urlsafe_b64encode() mã hóa trường nhập này và thay thế - bằng +_ bằng /.

def Encode(key, message):
    enc = []

    for i in range(len(message)):
        key_c = key[i % len(key)]
        enc.append(chr((ord(message[i]) + ord(key_c)) % 256))

    return base64.urlsafe_b64encode("".join(enc).encode()).decode()

Xác định một hàm Decode() chấp nhận một khóa để mã hóa và giải mã cùng với tin nhắn. Xác định một danh sách trống và giải mã tin nhắn. Lặp lại tới hết độ dài của tin nhắn và đặt mô đun hoạt động là chỉ mục và lưu trữ giá trị của nó trong key_c. Thêm ký tự giải mã thông báo chuỗi Unicode như hình bên dưới. Trả về chuỗi được giải mã.

def Decode(key, message):
    dec = []
    message = base64.urlsafe_b64decode(message).decode()

    for i in range(len(message)):
        key_c = key[i % len(key)]
        dec.append(chr((256 + ord(message[i]) - ord(key_c)) % 256))

    return "".join(dec)

Định nghĩa một hàm Mode() nhận chế độ do người dùng nhập trong widget Entry và gọi hàm phù hợp theo lựa chọn. Trong trường hợp người dùng không nhập phản hồi hợp lệ, hiện một thông báo lỗi.

def Mode():
    if (mode.get() == 'E'):
        Result.set(Encode(key.get(), Text.get()))
    elif (mode.get() == 'D'):
        Result.set(Decode(key.get(), Text.get()))
    else:
        Result.set('Invalid Mode')

Xác định một hàm Exit() để tắt và kết thúc trình thông dịch đang chạy ở chế độ nền. Xác định một hàm Reset() để loại bỏ nội dung của trường Entry.

def Exit():
    root.destroy()

def Reset():
    Text.set("")
    key.set("")
    mode.set("")
    Result.set("")

Xác định widget Label và Entry cho Message, Key, Mode và Text. Xác định cửa sổ chính mà bạn muốn đặt chúng vào bên trong, bao gồm kiểu font, text và màu nền. Ngoài ra, hãy đặt tọa độ để xắp xếp chúng hợp lí.

Label(root, font='arial 17 bold', text='Message', fg='black', bg="aqua").place(x=60, y=100)
Entry(root, font='arial 15', textvariable=Text, bg='white').place(x=450, y=100)

Label(root, font='arial 17 bold', text='Key', fg='black', bg="aqua").place(x=60, y=130)
Entry(root, font='arial 15', textvariable=key, bg='white').place(x=450, y=130)

Label(root, font='arial 17 bold', text='Mode(E-Encode, D-Decode)', fg='black', bg="aqua").place(x=60, y=160)
Entry(root, font='arial 15', textvariable=mode, bg='white').place(x=450, y=160)

Label(root, font='arial 17 bold', text='Text', fg='black', bg="aqua").place(x=60, y=190)
Entry(root, font='arial 15 bold', textvariable=Result, bg='white').place(x=450, y=190)

Tương tự, định nghĩa 3 nút bấm để xem kết quả, reset các trường và tạm dừng chương trình. Các nút bấm có tham số đặc biệt được gọi là lệnh nhận một chức năng và triển khai nó khi click.

Button(root, font='arial 15 bold', text='Result', padx=2, bg='Light Gray', command=Mode).place(x=100, y=240)
Button(root, font='arial 15 bold', text='Reset', width=6, command=Reset, bg='Green', padx=2).place(x=300, y=240)
Button(root, font='arial 15 bold', text='Stop', width=6, command=Exit, bg='Red', padx=2, pady=2).place(x=500, y=240)

Hàm mainloop() gọi Python để chạy lặp sự kiện Tkinter và lắng nghe sự kiện (chẳng hạn như nhấn nút) cho tới khi bạn đóng cửa sổ.

root.mainloop()

Mã hóa/Giải mã thông báo khi hành động

Khi chạy chương trình này, nó hiện một cửa sổ tại nơi bạn phải nhập một thông báo, khóa và chế độ. Khi chọn chế độ Encoding kèm một key 2009, nội dung trong thông báo sẽ biến thành f8KRwpvCnlLChcKjwp5Sf8KW.

Python mã hóa thông báo

Tương tự, khi sao chép thông báo được mã hóa và dán nó trở lại trường nhập để giải mã, bạn sẽ có được thông báo gốc.

Giải mã thông báo

Trên đây là cách mã hóa và giải mã thông báo bằng Python. Hi vọng bài viết hữu ích với các bạn.

Thứ Ba, 21/02/2023 10:19
51 👨 1.847
0 Bình luận
Sắp xếp theo