Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 0f81a58

Browse files
committed
使用分段加密
1 parent d03c3e3 commit 0f81a58

File tree

10 files changed

+131
-64
lines changed

10 files changed

+131
-64
lines changed

Assets/UnityFS/BundleAssetProvider+Job.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ private void DownloadBundleFile(Manifest.BundleInfo bundleInfo, Action callback)
118118
var bundle = TryGetBundle(bundleInfo);
119119
if (bundle != null)
120120
{
121-
bundle.Load(Utils.Helpers.GetDecryptStream(stream, bundle.bundleInfo, _password));
121+
bundle.Load(Utils.Helpers.GetDecryptStream(stream, bundle.bundleInfo, _password,
122+
_manifestObject.chunkSize));
122123
}
123124
else
124125
{

Assets/UnityFS/BundleAssetProvider.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public partial class BundleAssetProvider : IAssetProvider
2727
private Dictionary<string, WeakReference> _fileSystems = new Dictionary<string, WeakReference>();
2828
private Dictionary<string, UBundle> _bundles = new Dictionary<string, UBundle>();
2929
private Func<string, string> _assetPathTransformer;
30-
private FileEntry _manifestFileEntry; // 清单自身信息
30+
private ManifestEntry _manifestFileEntry; // 清单自身信息
3131
private Manifest _manifestObject; // 当前清单
3232
private int _activeJobs = 0;
3333
private int _bytesPerSecond;
@@ -89,7 +89,7 @@ public void Open(ResourceManagerArgs args)
8989
{
9090
_password = args.password;
9191
Helpers.GetManifest(_localPathRoot, _worker, args.manifestChecksum, args.manifestSize, args.manifestRSize,
92-
_password, (manifest, fileEntry) =>
92+
_password, args.manifestChunkSize, (manifest, fileEntry) =>
9393
{
9494
_streamingAssets = new StreamingAssetsLoader();
9595
_streamingAssets.LoadEmbeddedManifest(streamingAssets =>
@@ -180,7 +180,7 @@ private string TransformAssetPath(string assetPath)
180180
return _assetPathTransformer != null ? _assetPathTransformer.Invoke(assetPath) : assetPath;
181181
}
182182

183-
private void SetManifest(Manifest manifest, FileEntry fileEntry)
183+
private void SetManifest(Manifest manifest, ManifestEntry fileEntry)
184184
{
185185
_manifestFileEntry = fileEntry;
186186
_manifestObject = manifest;
@@ -210,10 +210,10 @@ public void ValidateManifest(IList<string> urls, int retry, Action<EValidationRe
210210
{
211211
if (!string.IsNullOrEmpty(content))
212212
{
213-
var fileEntry = JsonUtility.FromJson<FileEntry>(content);
213+
var fileEntry = JsonUtility.FromJson<ManifestEntry>(content);
214214
if (fileEntry != null)
215215
{
216-
var eq = Helpers.IsFileEntryEquals(_manifestFileEntry, fileEntry);
216+
var eq = Helpers.IsManifestEntryEquals(_manifestFileEntry, fileEntry);
217217

218218
callback(eq ? EValidationResult.Latest : EValidationResult.Update);
219219
return true;
@@ -255,10 +255,10 @@ private IEnumerator _ValidateManifest(IList<string> urls, int retry, Action<EVal
255255
try
256256
{
257257
var handler = uwr.downloadHandler;
258-
var fileEntry = JsonUtility.FromJson<FileEntry>(handler.text);
258+
var fileEntry = JsonUtility.FromJson<ManifestEntry>(handler.text);
259259
if (fileEntry != null)
260260
{
261-
var eq = Helpers.IsFileEntryEquals(_manifestFileEntry, fileEntry);
261+
var eq = Helpers.IsManifestEntryEquals(_manifestFileEntry, fileEntry);
262262
callback(eq ? EValidationResult.Latest : EValidationResult.Update);
263263
yield break;
264264
}
@@ -298,11 +298,11 @@ private bool LoadBundleFile(UBundle bundle)
298298
try
299299
{
300300
var fullPath = Path.Combine(_localPathRoot, bundle.name);
301-
var fileStream = Utils.Helpers.GetBundleStream(fullPath, bundle.bundleInfo);
301+
var fileStream = Helpers.GetBundleStream(fullPath, bundle.bundleInfo);
302302
if (fileStream != null)
303303
{
304304
// Stream 生命周期转由 UAssetBundleBundle 管理
305-
bundle.Load(Utils.Helpers.GetDecryptStream(fileStream, bundle.bundleInfo, _password));
305+
bundle.Load(Helpers.GetDecryptStream(fileStream, bundle.bundleInfo, _password, _manifestObject.chunkSize));
306306
return true;
307307
}
308308
}

Assets/UnityFS/Editor/BundleBuilder.cs

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public static BundleBuilderData GetData()
5151

5252
public static void BuildPackages(BundleBuilderData data, string outputPath, PackagePlatform platform)
5353
{
54-
BuildSinglePlatformPackages(new PackageSharedBuildInfo() { data = data, outputPath = outputPath }, platform);
54+
BuildSinglePlatformPackages(new PackageSharedBuildInfo() {data = data, outputPath = outputPath}, platform);
5555
}
5656

5757
public static BuildTarget ToBuildTarget(PackagePlatform platform)
@@ -108,8 +108,10 @@ private static void _BuildPackages(PackageBuildInfo packageBuildInfo)
108108
rawFileManifest = BuildRawFiles(packageBuildInfo, rawFileBuilds);
109109
}
110110

111-
var embeddedManifest = BuildFinalPackages(packageBuildInfo, assetBundleManifest, zipArchiveManifest, fileListManifest, rawFileManifest);
112-
Cleanup(packageBuildInfo, assetBundleManifest, zipArchiveManifest, fileListManifest, rawFileManifest, embeddedManifest);
111+
var embeddedManifest = BuildFinalPackages(packageBuildInfo, assetBundleManifest, zipArchiveManifest,
112+
fileListManifest, rawFileManifest);
113+
Cleanup(packageBuildInfo, assetBundleManifest, zipArchiveManifest, fileListManifest, rawFileManifest,
114+
embeddedManifest);
113115
packageBuildInfo.DoAnalyze();
114116
packageBuildInfo.data.build++;
115117
packageBuildInfo.data.MarkAsDirty();
@@ -133,7 +135,7 @@ public static void BuildStreamingAssets(PackageBuildInfo buildInfo, FileListMani
133135
Path.Combine(buildInfo.streamingAssetsPath, bundleInfo.name), true);
134136

135137
//TODO: streamingassets copy
136-
if (fileListManifest != null)
138+
if (fileListManifest != null)
137139
{
138140
foreach (var entry in fileListManifest.fileEntrys)
139141
{
@@ -376,10 +378,12 @@ public static AssetBundleManifest BuildAssetBundles(PackageBuildInfo buildInfo,
376378
{
377379
options |= BuildAssetBundleOptions.DisableWriteTypeTree;
378380
}
381+
379382
if (buildInfo.data.lz4Compression)
380383
{
381384
options |= BuildAssetBundleOptions.ChunkBasedCompression;
382385
}
386+
383387
return BuildPipeline.BuildAssetBundles(buildInfo.assetBundlePath, assetBundleBuilds,
384388
options,
385389
buildInfo.buildTarget);
@@ -421,7 +425,7 @@ private static void BuildZipArchiveObject(ZipOutputStream zip, string assetPath,
421425
{
422426
var fi = new FileInfo(assetPath);
423427
var name = ZipEntry.CleanName(assetPath);
424-
var entry = new ZipEntry(name) { DateTime = fi.LastWriteTimeUtc, Size = fi.Length };
428+
var entry = new ZipEntry(name) {DateTime = fi.LastWriteTimeUtc, Size = fi.Length};
425429

426430
// entry.Comment = "";
427431
zip.PutNextEntry(entry);
@@ -661,7 +665,7 @@ public static FileEntry GenFileEntry(string entryName, string filePath)
661665
{
662666
name = entryName,
663667
checksum = checksum.hex,
664-
size = (int)fileInfo.Length,
668+
size = (int) fileInfo.Length,
665669
};
666670
}
667671
}
@@ -694,11 +698,8 @@ private static FileEntry EncryptData(PackageBuildInfo buildInfo, string name,
694698
{
695699
algo.Padding = PaddingMode.Zeros;
696700
var cryptor = algo.CreateEncryptor(key, iv);
697-
using (var cryptStream = new CryptoStream(fout, cryptor, CryptoStreamMode.Write))
698-
{
699-
cryptStream.Write(bytes, 0, bytes.Length);
700-
cryptStream.FlushFinalBlock();
701-
}
701+
702+
Utils.ChunkedStream.Encrypt(cryptor, buildInfo.data.chunkSize, bytes, fout);
702703
}
703704
}
704705

@@ -743,6 +744,7 @@ private static int GetPriority(PackageBuildInfo buildInfo, BundleBuilderData.Bun
743744
}
744745
}
745746
}
747+
746748
return priority;
747749
}
748750

@@ -755,8 +757,9 @@ public static EmbeddedManifest BuildFinalPackages(PackageBuildInfo buildInfo,
755757
{
756758
var data = buildInfo.data;
757759
var manifest = new Manifest();
760+
manifest.chunkSize = data.chunkSize;
758761
manifest.build = buildInfo.data.build;
759-
manifest.timestamp = (int)(DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds;
762+
manifest.timestamp = (int) (DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds;
760763
manifest.tag = buildInfo.sharedBuildInfo.tag;
761764
var embeddedManifest = new EmbeddedManifest();
762765
if (assetBundleManifest != null)
@@ -816,7 +819,7 @@ public static EmbeddedManifest BuildFinalPackages(PackageBuildInfo buildInfo,
816819

817820
bundle.comment = bundleInfo.note;
818821
bundle.tag = bundleInfo.tag;
819-
bundle.encrypted = false;
822+
bundle.encrypted = bundleSplit.encrypted;
820823
bundle.rsize = fileEntry.rsize;
821824
bundle.type = Manifest.BundleType.ZipArchive;
822825
bundle.name = fileEntry.name;
@@ -905,16 +908,25 @@ private static void WriteManifest(PackageBuildInfo buildInfo, Manifest manifest)
905908

906909
buildInfo.filelist.Add(Manifest.ManifestFileName);
907910
buildInfo.filelist.Add(Manifest.ManifestFileName + ".json");
908-
var fileEntry = EncryptData(buildInfo, Manifest.ManifestFileName, zData);
909-
// var manifestPath = Path.Combine(buildInfo.packagePath, Manifest.ManifestFileName);
910-
// File.WriteAllBytes(manifestPath, zData);
911-
// var fileEntry = GenFileEntry(Manifest.ManifestFileName, manifestPath);
911+
var fileEntry = AsManifestEntry(EncryptData(buildInfo, Manifest.ManifestFileName, zData),
912+
buildInfo.data.chunkSize);
912913
var fileEntryJson = JsonUtility.ToJson(fileEntry);
913914
Debug.LogFormat("write manifest: {0}", fileEntryJson);
914915
File.WriteAllBytes(manifestRawPath, bytes);
915916
File.WriteAllText(manifestChecksumPath, fileEntryJson);
916917
}
917918

919+
private static ManifestEntry AsManifestEntry(FileEntry entry, int chunkSize)
920+
{
921+
var manifestEntry = new ManifestEntry();
922+
manifestEntry.name = entry.name;
923+
manifestEntry.size = entry.size;
924+
manifestEntry.rsize = entry.rsize;
925+
manifestEntry.checksum = entry.checksum;
926+
manifestEntry.chunkSize = chunkSize;
927+
return manifestEntry;
928+
}
929+
918930
// write embedded manifest to streamingassets
919931
private static void WriteEmbeddedManifest(PackageBuildInfo buildInfo, EmbeddedManifest embeddedManifest)
920932
{

Assets/UnityFS/Editor/BundleBuilderData.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class BundleSplitRule
5353
public int id;
5454
public int build; // 版本 (打包次数)
5555
public string encryptionKey;
56+
public int chunkSize = 4096;
5657
public List<BundleInfo> bundles = new List<BundleInfo>();
5758
[SerializeField]
5859
private AssetAttributesMap assetAttributesMap = new AssetAttributesMap();

Assets/UnityFS/Editor/BundleBuilderWindow.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,12 @@ private void OnDrawSettings()
487487
{
488488
EditorGUI.BeginChangeCheck();
489489
_data.encryptionKey = EditorGUILayout.TextField("Password", _data.encryptionKey);
490+
_data.chunkSize = EditorGUILayout.IntField("Chunk Size", _data.chunkSize);
491+
var nChunkSize = Utils.ChunkedStream.GetChunkSize(_data.chunkSize);
492+
if (nChunkSize != _data.chunkSize)
493+
{
494+
EditorGUILayout.HelpBox("Chunk Size: " + nChunkSize, MessageType.Info);
495+
}
490496
if (EditorGUI.EndChangeCheck())
491497
{
492498
_data.MarkAsDirty();

Assets/UnityFS/Manifest.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public class BundleInfo
6565
public List<string> assets = new List<string>(); // asset path (virtual path)
6666
}
6767

68+
public int chunkSize;
6869
public int build; // 资源版本 (资源打包次数)
6970
public int timestamp; // epoch time
7071
public string tag;
@@ -80,6 +81,16 @@ public class FileEntry
8081
public string checksum;
8182
}
8283

84+
[Serializable]
85+
public class ManifestEntry
86+
{
87+
public string name;
88+
public int size;
89+
public int rsize;
90+
public string checksum;
91+
public int chunkSize;
92+
}
93+
8394
// for streamingassets reader
8495
[Serializable]
8596
public class EmbeddedManifest

Assets/UnityFS/ResourceManager.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class ResourceManagerArgs
1616
public string manifestChecksum;
1717
public int manifestSize;
1818
public int manifestRSize;
19+
public int manifestChunkSize;
1920
public Func<string, string> assetPathTransformer;
2021
public IList<string> urls;
2122
public Action oncomplete;

Assets/UnityFS/Utils/ChunkedStream.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,20 @@ public static int GetChunkSize(int chunkSize)
5252
return chunkSize - chunkSize % 512;
5353
}
5454

55+
public static ICryptoTransform CreateDecryptor(byte[] key, byte[] iv)
56+
{
57+
var algo = Rijndael.Create();
58+
algo.Padding = PaddingMode.Zeros;
59+
var decryptor = algo.CreateDecryptor(key, iv);
60+
return decryptor;
61+
}
62+
63+
public ChunkedStream(byte[] key, byte[] iv, Stream stream, long rsize, int chunkSize = 4096,
64+
bool leaveOpen = false)
65+
: this(CreateDecryptor(key, iv), stream, rsize, chunkSize, leaveOpen)
66+
{
67+
}
68+
5569
public ChunkedStream(ICryptoTransform transform, Stream stream, long rsize, int chunkSize = 4096,
5670
bool leaveOpen = false)
5771
{
@@ -72,6 +86,23 @@ public ChunkedStream(ICryptoTransform transform, Stream stream, long rsize, int
7286
_stream.Seek(0, SeekOrigin.Begin);
7387
}
7488

89+
public static void Encrypt(ICryptoTransform transform, int chunkSize, byte[] original, Stream outStream)
90+
{
91+
var chunk = new byte[GetChunkSize(chunkSize)];
92+
var chunkCount = original.Length / chunk.Length;
93+
for (var i = 0; i <= chunkCount; i++)
94+
{
95+
var chunkBegin = i * chunk.Length;
96+
var chunkRSize = Math.Min(original.Length - chunkBegin, chunk.Length);
97+
if (chunkRSize > 0)
98+
{
99+
var outBuffer = transform.TransformFinalBlock(original, chunkBegin, chunkRSize);
100+
101+
outStream.Write(outBuffer, 0, outBuffer.Length);
102+
}
103+
}
104+
}
105+
75106
protected override void Dispose(bool disposing)
76107
{
77108
try

0 commit comments

Comments
 (0)