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

#此函数可以检查输入框是否填写完整,然后调用encrypt_file函数进行加密操作
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", "文件加密成功!")

#此函数可以检查输入框是否填写完整,然后调用decrypt_file函数进行解密操作
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
def stream_cipher_encryptplaintext key # 初始化密钥流生成器 keystream = generate_keystreamkey lenplaintext # 对明文与密钥流进行异或运算得到密文 ciphertext = chrordp ^ k for p k in zipplaintext keystream # 返回密文

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

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