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

news2025/2/26 7:16:38

前言

在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加密后的测试文件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Node.js】-闲聊:前端框架发展史

前端框架的发展史是一个不断演进和创新的过程&#xff0c;旨在提高开发效率、优化用户体验&#xff0c;并推动前端技术的不断发展。以下是前端框架发展的主要阶段和关键里程碑&#xff1a; 早期阶段&#xff1a; 在这个阶段&#xff0c;前端主要由HTML、CSS和JavaScript等基础技…

机器学习周报第32周

目录 摘要Abstract一、文献阅读1.论文标题2.论文摘要3.论文背景4.论文方案4.1 多视角自注意力网络4.2 距离感知4.3 方向信息4.4 短语模式 二、self-attention 摘要 本周学习了多视角自注意力网络&#xff0c;在统一的框架下联合学习输入句子的不同语言学方面。具体来说&#x…

HTML5:七天学会基础动画网页10

继续介绍3D转换: 3D转换:rotate3d 方法与说明 rrotateX(angle)otate3d(x,y,z,angle[角度]) 3D转换&#xff0c;正常取值0/1&#xff0c;0代表当前轴线不进行旋转&#xff0c;1反之&#xff0c;例:rotate3d(1,1,1,30deg)&#xff0c;代表三个轴线都要旋转30度 rotate3d(0…

时间序列-AR MA ARIMA

一、AR模型(自回归) AR探索趋势和周期性 预测依赖于过去的观测值和模型中的参数。模型的阶数 p pp 决定了需要考虑多少个过去时间点的观测值。 求AR模型的阶数 p和参数 ϕ i \phi_i ϕi​ &#xff0c;常常会使用统计方法如最小二乘法、信息准则&#xff08;如AIC、BIC&#xf…

【脚本玩漆黑的魅影】全自动丢球

文章目录 原理全部代码 原理 启动后截图。 丢球以后再截图。 如果两图一致&#xff0c;说明没成功&#xff0c;读档重来。 如果两图不一致&#xff0c;说明成功了。 while True:press(A)time.sleep(2)if is_same_img(ImageGrab.grab(), data_img):press(save2)else:break全部…

Linux系统——web服务拓展练习

目录 一、实验环境搭建 1. Centos 7-5——Client 2. Centos 7-1——网关服务器 3. Centos 7-2——Web1 4. Centos 7-3——Web2 5. Centos 7-4——Nginx 二、在Nginx服务器上搭建LNMP服务&#xff0c;并且能够对外提供Discuz论坛服务&#xff1b;在Web1、Web2服务器上搭建…

深度学习图像算法工程师--面试准备(2)

深度学习面试准备 深度学习图像算法工程师–面试准备&#xff08;1&#xff09; 深度学习图像算法工程师–面试准备&#xff08;2&#xff09; 文章目录 深度学习面试准备前言一、Batch Normalization(批归一化)1.1 具体步骤1.2 BN一般用在网络的哪个部分 二、Layer Normaliza…

基于 EfficientNetV2 实现判别MNIST 手写模型分类

pytorch深度学习项目实战100例 的学习记录 我的环境&#xff1a; 白票大王&#xff1a; google colab 用其他的话&#xff0c;其实实现也行&#xff0c;但是让小白来重环境来开始安装的话&#xff0c;浪费时间 论文速读 EfficientNetV2是由 Google Research&#xff0c;Br…

C语言笔记:文件的操作各种文件函数讲解

突然发现自己的C语言文件部分还没有学&#xff0c;赶紧来补一下~~ 1.文件分类 文本文件磁盘文件&#xff08;二进制文件&#xff09;C语言特殊文件标识&#xff1a;stdin&#xff08;标准输入&#xff1a;通指键盘输入&#xff09;&#xff0c;stdout&#xff08;标准输出&am…

了解 HTTPS 中间人攻击:保护你的网络安全

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C语言指针从入门到基础详解(非常详细)

1.内存和地址 我们知道电脑中的CPU在处理数据的时候需要在内存中读取数据处理后的数据也会放在内存中。把内存划分为一个个的内存单元每个单元的大小是一个字节。每个字节都有它对应的编号也就是它的地址&#xff0c;以便CPU可以快速的找到一个内存空间。C语言中我们把地址叫做…

深入浅出计算机网络 day.1 概论① 信息时代的计算机网络

我想&#xff0c; 我不会暗下来的&#xff0c; 生命是周而复始的橙黄橘绿时 —— 24.3.9 内容概述 计算机网络的各类应用 计算机网络带来的负面问题 我国互联网发展情况 一、计算机网络的各类应用 1.信息浏览和发布 2.通信和交流 3.休闲和娱乐 4.资源共享…

Canal安装使用

一 Canal介绍 canal是阿里巴巴旗下的一款开源项目&#xff0c;纯Java开发。基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费&#xff0c;目前主要支持了MySQL&#xff08;也支持mariaDB&#xff09;。 背景 早期&#xff0c;阿里巴巴B2B公司因为存在杭州和美国…

MyBatis3源码深度解析(七)JDBC单连接事务

文章目录 前言2.7 JDBC单连接事务2.7.1 事务的开启与提交2.7.2 事务隔离级别2.7.2.1 并发访问问题&#xff08;1&#xff09;脏读&#xff08;2&#xff09;不可重复读&#xff08;3&#xff09;幻读 2.7.2.2 事务隔离级别&#xff08;1&#xff09;TRANSACTION_NONE&#xff1…

JVM内存问题排错最佳实践

写在文章开头 上一篇的文章中分享了一个入门级别的调优实践,收到很多读者的好评,所以笔者今天再次分享一个进阶一点的案例,希望对近期在面试的读者对于JVM这一块的实践经验有所帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,…

光伏数字化管理平台:驱动绿色能源革命的智能化引擎

随着全球对可再生能源需求的不断增长&#xff0c;光伏产业已经成为推动绿色能源革命的重要力量。在这个背景下&#xff0c;光伏数字化管理平台应运而生&#xff0c;以其强大的数据处理、实时监控和智能优化功能&#xff0c;为光伏电站的运营管理和维护带来了革命性的变革。 光伏…

有源电桥电路

有源电桥电路 有源电桥由A3运放的正向输入端与负向输入端电压相等且为零可知&#xff1a;G点&#xff08;待测阻抗Zx与被测阻抗Rs的连接点&#xff09;电平一直为零&#xff0c;也就是平衡点虚地点&#xff0c;Ux与Us也就变成参照虚地点的绝对相量电压。并且根据运放的虚断原理…

7-16 计算符号函数的值

对于任一整数n&#xff0c;符号函数sign(n)的定义如下&#xff1a; 请编写程序计算该函数对任一输入整数的值。 输入格式: 输入在一行中给出整数n。 输出格式: 在一行中按照格式“sign(n) 函数值”输出该整数n对应的函数值。 输入样例1: 10输出样例1: sign(10) 1输入样…

unity学习(54)——选择角色界面--解析赋值服务器返回的信息1

1.decode这种照猫画虎的工作 把逆向出来UserHandler.cs中的内容&#xff0c;融到自建客户端的MessageManager.cs中&#xff1a; 2.此时登录账号&#xff0c;马上显示当前账号下已有三名角色&#xff1a; 此时返回数据包中的command的值是1&#xff1a; 3.当注册玩家数超过三名…

springboot255基于spring boot的疫情信息管理系统

疫情信息管理系统的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定疫情信息管理系统…