Unity3d C#实现文件(json、txt、xml等)加密、解密和加载(信息脱敏)功能实现(含源码工程)

前言

在Unity3d工程中经常有需要将一些文件放到本地项目中,诸如json、txt、csv和xml等文件需要放到StreamingAssets和Resources文件夹目录下,在程序发布后这些文件基本是对用户可见的状态,造成信息泄露,甚至有不法分子会利用这些信息进行一定的破坏行为。在这种背景下是很有必要将本地的一些文件进行加密处理再存储,然后加载后进行解密,这就能规避本地文件带来的风险。而本文就是围绕这个功能实现的一个插件,能快速的对文件进行加密和解密修改。只需要进行简单的配置,然后选中文件进行加密,即可实现该功能。 该项目的Unity3d版本为2020.3.28f1c1 Personal,注意如果版本差异太大可能会无法正确打开使用。

效果

加密配置:
在这里插入图片描述

加密前后对比:
在这里插入图片描述

自定义加密:
在这里插入图片描述

批量直接加密:
在这里插入图片描述

加密至StreamingAssets:
在这里插入图片描述

自定义解密:
在这里插入图片描述

批量解密:
在这里插入图片描述

实现

加密的核心功能实现采用的是加密转换的基本操作,根据加密的配置Key和Code进行加密操作,这些配置在保存/修改时会进行修改存储。而Unity3d工程中的新增菜单和窗口采用Unity编辑器拓展MenuItem和EditorWindow来实现。

配置实现

在顶部的菜单栏中新建一个菜单选项“Tools > 加密配置窗口”:

[MenuItem("Tools/加密配置窗口")]
public static void ShowRegisterWindow()
{
	EncoderConfigWind wind = (EncoderConfigWind)EditorWindow.GetWindow(typeof(EncoderConfigWind));
}

点击后打开编辑器窗口,这个窗口EncoderConfigWind是继承了Unity的编辑器窗口(EditorWindow)。

然后编写当渲染UI的时候调用OnGUI函数,绘制出配置窗口的明细:

private void OnGUI()
	{
		GUILayout.BeginVertical(new GUILayoutOption[0]);
		GUILayout.Space(10f);
		GUILayout.Label("加密文件配置", new GUILayoutOption[0]);
		GUILayout.Space(10f);
		GUILayout.Label("加密KEY", new GUILayoutOption[0]);
		this.TempKey = EditorGUILayout.TextArea(this.TempKey, new GUILayoutOption[] { GUILayout.MinHeight(50f) });
		GUILayout.Space(10f);
		GUILayout.Label("加密Code", new GUILayoutOption[0]);
		this.LegalIVCode = EditorGUILayout.TextArea(this.LegalIVCode, new GUILayoutOption[] { GUILayout.MinHeight(50f) });
		GUILayout.Space(10f);
		GUILayout.Label("加密文件后缀", new GUILayoutOption[0]);
		this.EncodeSuffix = EditorGUILayout.TextArea(this.EncodeSuffix, new GUILayoutOption[] { GUILayout.MinHeight(20f) });
		GUILayout.Space(10f);
		GUILayout.Label("解密文件后缀", new GUILayoutOption[0]);
		this.DecodeSuffix = EditorGUILayout.TextArea(this.DecodeSuffix, new GUILayoutOption[] { GUILayout.MinHeight(20f) });
		GUILayout.Space(10f);
		if (GUILayout.Button("保存配置", new GUILayoutOption[0]))
		{
			this.SaveConfigs(this.TempKey, this.LegalIVCode, this.EncodeSuffix, this.DecodeSuffix);
		}
		GUILayout.Space(10f);
		if (GUILayout.Button("获取帮助", new GUILayoutOption[0]))
		{
			Process.Start("https://blog.csdn.net/qq_33789001");
		}
		GUILayout.EndVertical();
	}

如上的代码能绘制出下面的窗口:

其主要的作用就是在打开配置窗口后绘制出窗体,在窗体中提供Key、Code、默认加密/解密文件的后缀等输入框,点击保存配置按钮后会将这些输入信息进行保存,通过File.WriteAllBytes()函数写入到Resources下的配置文件中去,示例代码如下:

File.WriteAllBytes(path+ "/Key.txt", keybytes);

加密实现

加密的实现是通过选择Assets窗口中的文件来进行加密,所有菜单的选项都采用了[MenuItem(“Assets/***”)]的形式进行。为了满足大部分的应用场景提供了多种操作方式,单一自定义加密、批量直接加密和批量的加密到StreamAssets和Resources的方式等,所以写了一个枚举进行操作:

public enum EncodeType 
{ 
    direct = 1,
    custom = 2,
    steamingassets = 3,
    resources = 4,
    custompath = 5
}

在Assets窗口中新建了如下的菜单选项,并通过加密EncodeType 的枚举值不同的方式进行区分:

[MenuItem("Assets/加密文件/直接加密(批量)")]
    private static void DoEncodeFileDir()
    {
        DoEncodeFiles(EncodeType.direct);
    }

    [MenuItem("Assets/加密文件/选路径加密(批量)")]
    private static void DoEncodeFileSelPath()
    {
        DoEncodeFiles(EncodeType.custompath);
    }

    [MenuItem("Assets/加密文件/放入StreamAssets(批量)")]
    private static void DoEncodeFileSa()
    {
        DoEncodeFiles(EncodeType.steamingassets);
    }

    [MenuItem("Assets/加密文件/放入Resources(批量)")]
    private static void DoEncodeFileRes()
    {
        DoEncodeFiles(EncodeType.resources);
    }

    [MenuItem("Assets/加密文件/自定义加密(单一)")]
    private static void DoEncodeFileCustom()
    {
        DoEncodeFiles(EncodeType.custom);
    }

点击加密选项后,根据选项和选择的文件进行加密处理,样例代码如下:

    string[] strs = Selection.assetGUIDs;
    string path = AssetDatabase.GUIDToAssetPath(strs[0]);

    string suffix = (Resources.Load("EncodeFile/DeSuffix") as TextAsset).text;

    string buildPath = EditorUtility.SaveFilePanel("请选择解析保存的路径", GetPrePath(path), GetFileName(path), suffix);
    string spath = buildPath;

    if (!string.IsNullOrEmpty(path))
        {
            string text = File.ReadAllText(path);
            string decode = Decrypt(text);
            //Debug.Log(spath);
            File.WriteAllText(spath, decode);
            AssetDatabase.Refresh();//刷新
        }
        else
            Debug.LogError("请选择正确的文件进行解析!");

处理的流程是提取选中的文件路径,并读取加密的配置选项,再根据用户的自定义选择保存的目录、文件名称和文件后缀等加密后存储信息,将需要加密的文件进行读取内容,进行加密后,保存到对应的加密后存储位置中去。

解密实现

解密顾名思义就是加密的逆操作,其适用场景是对加密过的文件进行解密后,对文件进行浏览查看或者修改更新操作。对解密文件的操作类似于加密的操作窗口,都是在Assets窗口进行,以[MenuItem(“Assets/***”)]的形式进行,不过细分了入口的菜单:

[MenuItem("Assets/解密文件/直接解析(批量)")]
[MenuItem("Assets/解密文件/自定解析(单一)")]

这里就两种方式自定义解析(仅支持单一文件)和批量直接解析的方式。解析的样例代码如下:

            string[] strs = Selection.assetGUIDs;
          
            string path = AssetDatabase.GUIDToAssetPath(strs[0]);

            string suffix = (Resources.Load("EncodeFile/DeSuffix") as TextAsset).text;

            string buildPath = EditorUtility.SaveFilePanel("请选择解析保存的路径", GetPrePath(path), GetFileName(path), suffix);
            string spath = buildPath;

            if (!string.IsNullOrEmpty(path))
                {
                    string text = File.ReadAllText(path);
                    string decode = Decrypt(text);
                    //Debug.Log(spath);
                    File.WriteAllText(spath, decode);
                    AssetDatabase.Refresh();//刷新
                }
                else
                    Debug.LogError("请选择正确的文件进行解析!");

处理的流程和加密的流程类似,提取选中的文件路径,并读取加密的配置选项,再根据用户的自定义选择保存的目录、文件名称和文件后缀等解密后存储信息,将需要解密的文件进行读取内容,进行解密后,保存到对应的解密后存储位置中去。

加载解密测试

这个才是采用了两种方式进行,是读取Resources的方式和读取StreamingAssetsPath的方式。分别读取CSV、TXT和JSON、XML文件。测试过程尽量简单化,就是将文件读取、解密后,将解密的内容显示到Text上即可,其中需要注意的是如果文件存储到Resources下的话,文件最好是.txt、.json,否则可能读取不到内容。UI和测试脚本的配置如下:
在这里插入图片描述

读取Resources目录下的文件代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LoadResourcesFileTest : MonoBehaviour
{
    [Header("文件名")]
    public string FileName = "";

    [Header("显示内容的Text")]
    public Text showText;

    private void Awake()
    {
        Debug.LogWarning("Resources文件夹下的文件最好是.txt、.json,否则可能读取不到");
        if (!showText)
            showText = transform.GetComponent<Text>();
        RequestFile();
    }

    void RequestFile()
    {
        TextAsset ta = Resources.Load(FileName) as TextAsset;
        string EnCodeStr ="";
        if (ta)
            EnCodeStr = ta.text;
        Debug.Log("解析前:" + EnCodeStr);
        string orgString = Decoder.GetDecodeString(EnCodeStr);
        if (showText)
            showText.text = orgString;
        Debug.Log("解析后:" + orgString);
    }
}

读取StreamingAssetsPath的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class LoadSAFileTest : MonoBehaviour
{
    [Header("文件名")]
    public string FileName = "";

    [Header("显示内容的Text")]
    public Text showText;

    private void Awake()
    {
        if (!showText)
            showText = transform.GetComponent<Text>();
        string filePath = Application.streamingAssetsPath +"/"+ FileName;
        StartCoroutine(RequestFile(filePath));
    }

    IEnumerator RequestFile(string uri)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
        {
            // Request and wait for the desired page.
            yield return webRequest.SendWebRequest();

            if (webRequest.result == UnityWebRequest.Result.Success)
            {
                Debug.Log("解析前:"+webRequest.downloadHandler.text);
                string orgString = Decoder.GetDecodeString(webRequest.downloadHandler.text);
                if (showText)
                    showText.text = orgString;
                Debug.Log("解析后:" + orgString);
            }
            else
            {
                Debug.LogError("加载解密文件异常:" + webRequest.error);
            }
        }
    }
}

这里的xml读取效果如下:
在这里插入图片描述

源码工程

https://download.csdn.net/download/qq_33789001/88915590
无法下载需要稍等,可能审核未通过。

工程说明

工程包含了上述所有的功能和演示场景,包含了所有的编辑器扩展代码和测试功能源码,可以自由修改自定义功能,也可以通过 “Tools” > “加密配置窗口”进行简单的加密配置后快速使用加密功能。
\Assets\TestFiles为加密测试的原文件;
\Assets\Editor为编辑器拓展的源代码;
\Assets\Resources 为测试加载加密文件并解析的文件和配置存储文件;\Assets\Scenes包含测试加载加密后的CSV、TXT、JSON、XML文件的demo场景;
\Assets\Scripts 测试和解密代码;
\Assets\StreamingAssets加密后的测试文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/445513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1908_Arm Cortex-M3的实现

1908_Arm Cortex-M3的实现 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) 这是第一次看一份这样的手册&#xff0c;之前的MCU编程基本上就是专注于软件接口方面。而OS等方面的一些功能基本上都是用了现成的解决方案&#xff0c;因此也就没有过多的关注…

Linux centos6安装rz、sz命令

centos6传文件提示command not found # yum install lrzsz 提示错误 wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 下载离线包 https://www.ohse.de/uwe/software/lrzsz.html 下载最新版本 [rootnode1 ~]# tar -zxvf lrzsz-0.12.20.tar.gz …

pytorch_retinaface训练Resnet50_Final.pth过程+无图版安装Nvidia+CUDA驱动GPU

背景 当前处于人脸检测分支&#xff0c;项目就是retinaface官方的代码加上数据集目录结构&#xff0c;目的是训练出最后的模型文件Resnet50_Final.pth 代码 https://gitee.com/congminglst/pytorch_-retinaface.git 项目结构与设计 图片数据集采用widerface&#xff0c; 前…

Go编译报错 link: running gcc failed: exit status 1(已解决)

背景 在对一个开源的Go程序二次开发 重新编译时 &#xff0c; 报错截图如下 报错文字如下&#xff1a;关键信息 link: running gcc failed: exit status 1 $ go build -o orchestrator-didi -i go/cmd/orchestrator/main.go go build: -i flag is deprecated # command-li…

2024/3/10打卡借教室——二分+差分

题目 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。 教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。  面对海量租借教室的信息&#xff0c;我们自…

TOMCAT多实例及调优

目录 引言 一、JVM相关理论 &#xff08;一&#xff09;JVM组成 1.JVM组成部分 2.JVM运行时数据区 &#xff08;二&#xff09;垃圾回收 1.确定垃圾 2.垃圾收集算法 二、java内存调整相关参数 &#xff08;一&#xff09;JVM 内存常用相关参数 &#xff08;二&#…

《在“裸奔”时代下如何保护网络隐私》

引言 在信息时代的今天,网络已经成为我们生活中不可或缺的一部分。然而,随着网络的普及和技术的发展,网络安全和隐私保护问题也变得越来越严峻。特别是在这个所谓的“裸奔”时代,我们的个人信息和隐私正面临着前所未有的挑战。因此,保护网络隐私变得尤为重要。 网络安全…

通过Step Back提示增强LLM的推理能力

原文地址&#xff1a;enhancing-llms-reasoning-with-step-back-prompting 论文地址&#xff1a;https://arxiv.org/pdf/2310.06117.pdf 2023 年 11 月 6 日 Introduction 在大型语言模型不断发展的领域中&#xff0c;一个持续的挑战是它们处理复杂任务的能力&#xff0c;这…

el-table 插入输入框并进行校验

<template><div><el-form :model"list" ref"ruleForm"><el-table :data"list.tableData" style"width: 100%"><el-table-column prop"time" label"日期" width"180"><…

【微服务】SpringBoot整合Resilience4j使用详解

目录 一、前言 二、熔断器出现背景 2.1 几个核心概念 2.1.1 熔断 2.1.2 限流 2.1.3 降级 2.2 为什么会出现熔断器 2.3 断路器介绍 2.3.1 断路器原理 三、Resilience4j介绍 3.1 Resilience4j概述 3.1.1 Resilience4j是什么 3.1.2 Resilience4j功能特性 3.2 Resilie…

用关系运算符和表达式比较大小、_Bool类型、for循环

本文参考C Primer Plus第六章进行C语言学习 文章目录 用关系运算符和表达式比较大小 其他真值新的_Bool类型for循环总结 一.用关系运算符和表达式比较大小 虽然关系运算符也可以用来比较浮点数&#xff0c;但是&#xff0c;要注意的是&#xff1a;尽量只使用<和>。因为浮…

【Linux】gcc与make、makefile

文章目录 1 gcc/g1.1 预处理1.2 编译1.3 汇编1.4 链接1.4.1 静态链接1.4.2 动态链接 2 make和makefile2.1 依赖关系2.2 依赖方法2.3 伪目标 3 总结 1 gcc/g 当我们创建一个文件&#xff0c;并向里面写入代码&#xff0c;此时&#xff0c;我们该如何使我们的代码能够运行起来呢&…

Vivado Repository IP Catalog 释疑

Vivado软件自带了一个IP核仓库&#xff0c;可以在IP Catalog界面查看。 在IP目录界面&#xff0c;依次给出了每个IP核的Name(名称)&#xff0c;Interface(接口)&#xff0c;State(状态)&#xff0c;License(许可证)和VLNV&#xff08;标识符&#xff09;。 Interface表示IP核的…

C++指针(五)完结篇

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09;、C指针&#xff08;四&#xff09;万字图文详解&#xff01; 本篇博客是介…

c++0305习题

一、求下面表达式的值 1&#xff0e;0 2&#xff0e;-1 3&#xff0e;1 4&#xff0e;&#xff08;1&#xff09;1 &#xff08;2&#xff09;3.2 &#xff08;3&#xff09;0 &#xff08;4&#xff09;7.0 5.&#xff08;1&#xff09;0&#xff08;2&#xff09;300.005&a…

[力扣 Hot100]Day49 二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

服务器与文件内数据的 LENGTH_IN_CHAR 参数不匹配

导入数据库数据的时候出现这个 怎么解决&#xff1a;重建数据库实例 下面是达梦的工具 使用DM数据库配置助手 新建、删除实例 新建实例时的配置需要注意的选项 主要是字符集、大小写、和VARCHAR类型以字符为单位 出现【LENGTH_IN_CHAR 参数不匹配】勾选【VARCHAR类型以字…

NUC980开发板CAN开发笔记

一、内核开启CAN CAN 设置 NUC980 系列带有2个CAN(Controller Area Network), 可以分别独立设置。 请按以下的说明来使能CAN功能. 每个CAN可以单独的开关. CAN0有多组管脚可以选择, 需要一并设置。 使用者也可以设置CAN的唤醒功能。步骤如下&#xff1a; 进入 NUC980-linux-4.…

Linux系统安装及简单操作

目录 一、Linux系统安装 二、Linux系统启动 三、Linux系统本地登录 四、Linux系统操作方式 五、Linux的七种运行级别&#xff08;runlevel&#xff09; 六、shell 七、命令 一、Linux系统安装 场景1&#xff1a;直接通过光盘安装到硬件上&#xff08;方法和Windows安装…

1.初学docker

这是在centos7上的基本操作用法。 一、基本操作 # 安装yum源 yum install -y yum-utils # 配置yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装docker yum install -y docker-ce-cli containerd.io docker-buildx-plu…