import os import tkinter as tk from tkinter import filedialog, messagebox import docx import openpyxl

定义流密码加密函数

def stream_cipher_encrypt(plaintext, key): # 初始化密钥流生成器 keystream = generate_keystream(key, len(plaintext)) # 对明文与密钥流进行异或运算,得到密文 ciphertext = [chr(ord(p) ^ k) for p, k in zip(plaintext, keystream)] # 返回密文 return ''.join(ciphertext)

定义流密码解密函数

def stream_cipher_decrypt(ciphertext, key): # 初始化密钥流生成器 keystream = generate_keystream(key, len(ciphertext)) # 对密文与密钥流进行异或运算,得到明文 plaintext = [chr(ord(c) ^ k) for c, k in zip(ciphertext, keystream)] # 返回明文 return ''.join(plaintext)

定义密钥流生成函数

def generate_keystream(key, length): # 初始化状态向量 S = list(range(256)) j = 0 # 密钥调度算法 for i in range(256): j = (j + S[i] + ord(key[i % len(key)])) % 256 S[i], S[j] = S[j], S[i] # 生成密钥流 keystream = [] i = j = 0 for _ in range(length): i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] keystream.append(S[(S[i] + S[j]) % 256]) # 返回密钥流 return keystream

创建主窗口

def create_new_window2(): # 定义加密文件函数 def encrypt_file(input_file_path, output_file_path, key): try: with open(input_file_path, 'rb') as input_file: with open(output_file_path, 'wb') as output_file: while True: byte = input_file.read(1) if not byte: break encrypted_byte = ord(byte) ^ int(key) output_file.write(bytes([encrypted_byte])) # 根据输出文件的扩展名选择保存方式 file_extension = os.path.splitext(output_file_path)[1] if file_extension == '.docx': # 如果是 .docx 文件,则使用 python-docx 库保存 doc = docx.Document(output_file_path) doc.save(output_file_path) elif file_extension == '.xlsx': # 如果是 .xlsx 文件,则使用 openpyxl 库保存 wb = openpyxl.load_workbook(output_file_path) wb.save(output_file_path) return True except Exception as e: messagebox.showerror('Error', str(e)) return False

# 定义解密文件函数
def decrypt_file(input_file_path, output_file_path, key):
    try:
        with open(input_file_path, 'rb') as input_file:
            with open(output_file_path, 'wb') as output_file:
                while True:
                    byte = input_file.read(1)
                    if not byte:
                        break
                    decrypted_byte = ord(byte) ^ int(key)
                    output_file.write(bytes([decrypted_byte]))
        # 根据输出文件的扩展名选择保存方式
        file_extension = os.path.splitext(output_file_path)[1]
        if file_extension == '.docx':
            # 如果是 .docx 文件,则使用 python-docx 库保存
            doc = docx.Document(output_file_path)
            doc.save(output_file_path)
        elif file_extension == '.xlsx':
            # 如果是 .xlsx 文件,则使用 openpyxl 库保存
            wb = openpyxl.load_workbook(output_file_path)
            wb.save(output_file_path)
        return True
    except Exception as e:
        messagebox.showerror('Error', str(e))
        return False

# 定义加密操作函数
def on_encrypt():
    input_file_path = e_input.get()
    output_file_path = e_output.get()
    key = e_key.get()
    # 检查是否填写完整的输入、输出路径和密钥
    if not input_file_path or not output_file_path or not key:
        messagebox.showwarning('Warning', '请填写完整的输入、输出路径和密钥!')
        return
    # 调用 encrypt_file 函数进行文件加密操作
    if encrypt_file(input_file_path, output_file_path, key):
        messagebox.showinfo('Success', '文件加密成功!')

# 定义解密操作函数
def on_decrypt():
    input_file_path = e_input.get()
    output_file_path = e_output.get()
    key = e_key.get()
    # 检查是否填写完整的输入、输出路径和密钥
    if not input_file_path or not output_file_path or not key:
        messagebox.showwarning('Warning', '请填写完整的输入、输出路径和密钥!')
        return
    # 调用 decrypt_file 函数进行文件解密操作
    if decrypt_file(input_file_path, output_file_path, key):
        messagebox.showinfo('Success', '文件解密成功!')

# 定义选择输入文件路径函数
def on_select_input():
    # 弹出选择文件对话框并获取选择的文件路径
    file_path = filedialog.askopenfilename()
    if file_path:
        # 将选择的文件路径设置到输入路径文本框中
        e_input.delete(0, tk.END)
        e_input.insert(0, file_path)

# 定义选择输出文件路径函数
def on_select_output():
    # 获取输入的文件路径
    input_file_path = e_input.get()
    if not input_file_path:
        return
    # 根据输入路径的文件扩展名生成默认的输出文件路径,并弹出保存文件对话框获取输出文件路径
    file_extension = os.path.splitext(input_file_path)[1]
    file_path = filedialog.asksaveasfilename(defaultextension=file_extension)
    if file_path:
        # 将选择的文件路径设置到输出路径文本框中
        e_output.delete(0, tk.END)
        e_output.insert(0, file_path)

# 创建窗口并设置标题
window = tk.Toplevel()
window.title('文件加密工具')

# 创建输入路径文本框和选择输入路径按钮
l_input = tk.Label(window, text='输入路径:')
l_input.grid(row=0, column=0, padx=5, pady=5)
e_input = tk.Entry(window)
e_input.grid(row=0, column=1, padx=5, pady=5, sticky=tk.EW)
b_input = tk.Button(window, text='选择文件', command=on_select_input)
b_input.grid(row=0, column=2, padx=5, pady=5)

# 创建输出路径文本框和选择输出路径按钮
l_output = tk.Label(window, text='输出路径:')
l_output.grid(row=1, column=0, padx=5, pady=5)
e_output = tk.Entry(window)
e_output.grid(row=1, column=1, padx=5, pady=5, sticky=tk.EW)
b_output = tk.Button(window, text='选择文件', command=on_select_output)
b_output.grid(row=1, column=2, padx=5, pady=5)

# 创建密钥文本框
l_key = tk.Label(window, text='密钥:')
l_key.grid(row=2, column=0, padx=5, pady=5)
e_key = tk.Entry(window)
e_key.grid(row=2, column=1, padx=5, pady=5, sticky=tk.EW)

# 创建加密和解密按钮
b_encrypt = tk.Button(window, text='加密', command=on_encrypt)
b_encrypt.grid(row=3, column=0, padx=5, pady=5, sticky=tk.EW)
b_decrypt = tk.Button(window, text='解密', command=on_decrypt)
b_decrypt.grid(row=3, column=1, padx=5, pady=5, sticky=tk.EW)

# 运行主循环
window.mainloop()
Python 文件加密解密工具:使用流密码实现文件安全保护

原文地址: https://www.cveoy.top/t/topic/oUWA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录