06-04-YooAsset源码-Unity加密解密服务

发布时间:2026/7/19 14:44:47
06-04-YooAsset源码-Unity加密解密服务 源码-加密解密机制篇章06-源码深度-文件系统与下载模块阅读时间约 20 分钟前置知识了解 IFileSystem一、引言本章将深入解析 YooAsset 加密解密机制的源码实现。加密解密是 YooAsset 资源保护的重要机制通过加密可以保护游戏资源不被非法获取和修改。深入理解加密解密机制有助于开发者保护游戏资产。YooAsset 提供了 AES 和 XOR 两种加密方式支持整体 Bundle 加密和单个资源加密。本章将从源码层面深入解析加密解密机制的实现。二、IDecryptionServices 接口2.1 IDecryptionServices 概述IDecryptionServices 是 YooAsset 加密解密服务的接口作用定义加密解密的统一接口支持开发者自定义加密方式与 Collector 集成配置加密选项2.2 接口定义public interface IDecryptionServices { /// summary /// 加密方法 /// /summary /// param namefileData文件数据/param /// returns加密后的数据/returns byte[] Encrypt(byte[] fileData); /// summary /// 解密方法 /// /summary /// param namefileData加密的文件数据/param /// returns解密后的数据/returns byte[] Decrypt(byte[] fileData); }Encrypt 方法详解Encrypt 方法用于加密文件数据接收原始数据返回加密数据。Decrypt 方法详解Decrypt 方法用于解密文件数据接收加密数据返回原始数据。2.3 接口实现public class DecryptionServices : IDecryptionServices { private byte[] _encryptionKey; public DecryptionServices(byte[] encryptionKey) { _encryptionKey encryptionKey; } public byte[] Encrypt(byte[] fileData) { // 使用 AES 加密 return AESHelper.Encrypt(fileData, _encryptionKey); } public byte[] Decrypt(byte[] fileData) { // 使用 AES 解密 return AESHelper.Decrypt(fileData, _encryptionKey); } }构造函数详解通过构造函数注入加密密钥。方法实现详解实现加密和解密方法调用 AES 加密库。2.4 接入方式var package YooAssets.CreatePackage(DefaultPackage); var initParameters new HostPlayModeParameters(); initParameters.AssetBundleDecryptionServices new DecryptionServices(encryptionKey); YooAssets.InitPackage(package);接入方式详解通过初始化参数注入解密服务。三、AES 加密3.1 AES 概述AESAdvanced Encryption Standard是高级加密标准特点对称加密算法安全性高性能较好标准化程度高YooAsset 中的应用Bundle 整体加密单个资源加密3.2 AES 实现public class AESHelper { public static byte[] Encrypt(byte[] data, byte[] key) { using (Aes aes Aes.Create()) { aes.Key key; aes.Mode CipherMode.CBC; aes.Padding PaddingMode.PKCS7; // 生成 IV aes.GenerateIV(); byte[] iv aes.IV; // 创建加密器 using (ICryptoTransform encryptor aes.CreateEncryptor(aes.Key, iv)) using (MemoryStream ms new MemoryStream()) { // 写入 IV ms.Write(iv, 0, iv.Length); using (CryptoStream cs new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); } return ms.ToArray(); } } } public static byte[] Decrypt(byte[] data, byte[] key) { using (Aes aes Aes.Create()) { aes.Key key; aes.Mode CipherMode.CBC; aes.Padding PaddingMode.PKCS7; // 读取 IV byte[] iv new byte[16]; Array.Copy(data, 0, iv, 0, 16); aes.IV iv; // 创建解密器 using (ICryptoTransform decryptor aes.CreateDecryptor(aes.Key, aes.IV)) using (MemoryStream ms new MemoryStream(data, 16, data.Length - 16)) using (CryptoStream cs new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) using (MemoryStream output new MemoryStream()) { cs.CopyTo(output); return output.ToArray(); } } } }AES.Create 详解使用 .NET 提供的 Aes 类创建 AES 实例。CBC 模式详解CBCCipher Block Chaining模式是常用的分组加密模式。PKCS7 填充详解PKCS7 是常用的填充方式。IV初始化向量详解IV 用于增加加密的随机性每次加密生成新的 IV。3.3 AES 性能优化public class AESHelper { public static byte[] EncryptOptimized(byte[] data, byte[] key) { using (Aes aes Aes.Create()) { aes.Key key; aes.GenerateIV(); // 使用 AES.CreateEncryptor 预创建加密器 using (ICryptoTransform encryptor aes.CreateEncryptor()) { return encryptor.TransformFinalBlock(data, 0, data.Length); } } } }预创建加密器详解预创建加密器可以减少加密过程中的开销。TransformFinalBlock 详解TransformFinalBlock 一次性完成加密避免多次写入。四、XOR 加密4.1 XOR 概述XOR异或是一种简单的加密方式特点简单、快速安全性较低适合临时加密适合小文件加密YooAsset 中的应用Bundle 整体加密单个文件加密4.2 XOR 实现public class XORHelper { public static byte[] Encrypt(byte[] data, byte[] key) { byte[] result new byte[data.Length]; for (int i 0; i data.Length; i) { result[i] (byte)(data[i] ^ key[i % key.Length]); } return result; } public static byte[] Decrypt(byte[] data, byte[] key) { return Encrypt(data, key); // XOR 解密与加密相同 } }XOR 原理详解XOR 加密通过将数据与密钥进行异或运算。XOR 解密详解XOR 加密是可逆的解密与加密相同。4.3 XOR 性能优化public class XORHelper { public static unsafe byte[] EncryptOptimized(byte[] data, byte[] key) { byte[] result new byte[data.Length]; int keyLength key.Length; fixed (byte* pData data, pKey key, pResult result) { for (int i 0; i data.Length; i) { pResult[i] (byte)(pData[i] ^ pKey[i % keyLength]); } } return result; } }unsafe 代码优化详解使用 unsafe 代码和指针可以提高性能。适用场景详解unsafe 代码适合性能要求高的场景但需要注意平台兼容性。4.4 XOR 安全性XOR 安全性较低容易被破解不适合保护重要资源适合临时加密增强安全性的方法使用更长的密钥多重 XOR结合其他加密方式五、加密策略5.1 整体加密 vs 单个资源加密整体加密详解对整个 Bundle 文件加密加密粒度大性能好但灵活性低。单个资源加密详解对 Bundle 中的每个资源单独加密加密粒度小灵活性高但性能差。YooAsset 推荐默认使用整体 Bundle 加密在安全和性能之间取得平衡。5.2 加密范围// 1. 所有 Bundle 都加密 parameters.EnableEncryption true; // 2. 指定 Bundle 加密 [AssetBundleEncryptRule(critical_bundle)] public bool ShouldEncrypt(string bundleName) { return true; }全量加密详解所有 Bundle 都加密安全性最高但性能开销最大。选择性加密详解只加密关键 Bundle平衡安全性和性能。5.3 加密密钥管理public class KeyManager { private byte[] _key; public KeyManager() { // 从安全存储加载密钥 _key LoadKeyFromSecureStorage(); } public byte[] GetKey() { return _key; } private byte[] LoadKeyFromSecureStorage() { // 从安全存储加载密钥 // 例如Keystore、Keychain 等 } }密钥管理的重要性密钥管理是加密安全的关键密钥不能明文存储在代码中。密钥管理方式iOSKeychainAndroidKeystore通用加密配置文件5.4 加密与性能加密对性能的影响增加打包时间增加运行时解密开销增加包体大小性能优化只加密关键资源使用硬件加速AES-NI缓存解密结果六、加密实战6.1 完整加密实现示例public class BundleEncryptionExample { public static void SetupEncryption() { // 1. 创建 Package var package YooAssets.CreatePackage(GamePackage); // 2. 配置加密服务 var initParameters new HostPlayModeParameters(); byte[] encryptionKey new byte[32]; // 256 位密钥 new System.Random().NextBytes(encryptionKey); initParameters.AssetBundleDecryptionServices new DecryptionServices(encryptionKey); // 3. 初始化 Package YooAssets.InitPackage(package); } } public class DecryptionServices : IDecryptionServices { private byte[] _key; public DecryptionServices(byte[] key) { _key key; } public byte[] Encrypt(byte[] fileData) { return AESHelper.Encrypt(fileData, _key); } public byte[] Decrypt(byte[] fileData) { return AESHelper.Decrypt(fileData, _key); } }完整流程详解创建 Package配置加密服务初始化 Package密钥生成详解使用随机数生成 32 字节256 位的密钥。6.2 加密配置[CreateAssetMenu(fileName PackageConfig, menuName YooAsset/Package Config)] public class PackageConfig : ScriptableObject { public bool EnableEncryption; public string EncryptionKey; public EEncryptionType EncryptionType EEncryptionType.AES; }配置参数详解EnableEncryption是否启用加密EncryptionKey加密密钥EncryptionType加密类型6.3 加密测试public class EncryptionTest { public static void TestEncryption() { byte[] original System.Text.Encoding.UTF8.GetBytes(Hello, YooAsset!); byte[] key new byte[32]; new System.Random().NextBytes(key); // 加密 byte[] encrypted AESHelper.Encrypt(original, key); // 解密 byte[] decrypted AESHelper.Decrypt(encrypted, key); // 验证 Debug.Assert(System.Text.Encoding.UTF8.GetString(decrypted) Hello, YooAsset!); } }测试目的详解验证加密和解密的正确性。测试步骤详解准备原始数据生成密钥加密解密验证七、总结本章深入解析了 YooAsset 加密解密机制的源码实现包括IDecryptionServices 接口接口定义、实现、接入方式AES 加密AES 概述、实现、性能优化XOR 加密XOR 概述、实现、性能优化、安全性加密策略整体加密 vs 单个资源加密、加密范围、密钥管理加密实战完整实现示例、配置、测试通过深入理解加密解密机制开发者可以保护游戏资源不被非法获取和修改。下一篇YooAsset 快速入门