huggingface spaces gradio

requirements.txt

gradio
cryptography

app.py

import gradio as gr
from cryptography.fernet import Fernet
import os

# AES 加密函数(Fernet 实现)
def encrypt_file_gr(file):
    file_path = file.name
    key = Fernet.generate_key()
    cipher = Fernet(key)
    with open(file_path, 'rb') as f:
        data = f.read()
    encrypted_data = cipher.encrypt(data)
    enc_path = file_path + '.enc'
    with open(enc_path, 'wb') as f:
        f.write(encrypted_data)
    return key.decode(), enc_path

# AES 解密函数,恢复原始文件名和格式
def decrypt_file_gr(file, key):
    file_path = file.name
    cipher = Fernet(key.encode())
    try:
        with open(file_path, 'rb') as f:
            encrypted_data = f.read()
        decrypted_data = cipher.decrypt(encrypted_data)
        # 去掉 .enc 后缀,恢复原始文件名
        if file_path.lower().endswith('.enc'):
            dec_path = file_path[:-4]
        else:
            dec_path = file_path + '.dec'
        with open(dec_path, 'wb') as f:
            f.write(decrypted_data)
        return dec_path
    except Exception:
        return None

# Gradio 界面设计
with gr.Blocks() as demo:
    gr.Markdown("# 文件加密解密工具")

    with gr.Tab("加密"):
        encrypt_in = gr.File(label="上传文件")
        encrypt_btn = gr.Button("加密文件 🔒")
        # 文本框显示密钥并提供复制按钮
        encrypt_key = gr.Textbox(label="生成的密钥", interactive=False, show_copy_button=True)
        encrypt_out = gr.File(label="下载加密文件 (.enc)")
        encrypt_btn.click(
            fn=encrypt_file_gr,
            inputs=encrypt_in,
            outputs=[encrypt_key, encrypt_out]
        )

    with gr.Tab("解密"):
        decrypt_in = gr.File(label="上传加密文件 (.enc)")
        decrypt_key_in = gr.Textbox(label="输入密钥")
        decrypt_btn = gr.Button("解密文件 🔓")
        decrypt_out = gr.File(label="下载解密文件(原始格式)")
        decrypt_btn.click(
            fn=decrypt_file_gr,
            inputs=[decrypt_in, decrypt_key_in],
            outputs=decrypt_out
        )

if __name__ == "__main__":
    demo.launch()
❤️ 转载文章请注明出处,谢谢!❤️