暗号化済みAssetBundleをLoadFromStreamで復号しつつロードするテスト
当初こちらについての技術解説記事を別途用意する予定ではあったが、偶然にも全く同じ内容となる想定の記事がテラシュールブログさんより同日に先行して公開されたので具体的な概要については以下を参照。(投げ)
ちなみに雑な纏めではあるが、検証結果については以下のwikiページに纏めている。
一応簡単に概要を纏めておく。
- 発端はこちらのスライドにあるこちらのページの内容
- LoadFromStreamを使うとStreamからAssetBundleを読み込める
- ざっくりとした条件としては、シーク可能なStreamを与える必要がある。
- ランダムアクセス可能な暗号をStreamとして実装することで、暗号化されたAssetBundleをメモリに全展開すること無く読める
- 大半の暗号化用のStreamの実装はランダムアクセス不能なので注意
- AssetBundleのサイズが大きいと重くなるので、できるだけ小さくする
- アセットのサイズだけでなくAssetBundleのサイズにも比例してしまう
- LoadFromStreamを使うとStreamからAssetBundleを読み込める
上記の内容については以下のように判断した。
- シーク可能なStreamについて
- 恐らくは
Stream.CanSeek
がtrueを返す必要がある。
- 恐らくは
- ランダムアクセス可能な暗号について
- そもそもの前提としてどうしてこうなってるかと言うと、標準で実装されているCryptoStreamの
CanSeek
が必ずfalse返すのでLoadFromStreamで使えない。 - その為に自前で暗号化Streamを実装する必要が出てきた。
- そもそもの前提としてどうしてこうなってるかと言うと、標準で実装されているCryptoStreamの
Assets/SeekableAesAssetBundle/Samples
以下にサンプルを用意している。
- シーンは同ディレクトリの
Scenes/Sample.unity
を参照。 - スクリプトはSample.csを参照。
検証用のAssetBundleはサイズが大きいために敢えてコミットはしていない。
その為にサンプルを動かす際には自前でビルドする必要がある。
ビルド処理自体は既に用意しており、メニューバーにある以下の項目で実行できる。
- Samples/Build/Build AssetBundle(Uncompressed)
- Samples/Build/Build AssetBundle(LZMA)
- Samples/Build/Build AssetBundle(LZ4)
- 括弧内にある圧縮形式のAssetBundleをビルド。ビルドされるAssetBundle名は
sample
- ※この段階では暗号化はされていない。
- ビルドが完了するとStreamingAssets以下にAssetBundleが生成される
- 括弧内にある圧縮形式のAssetBundleをビルド。ビルドされるAssetBundle名は
- Samples/Encrypt/Encrypt AssetBundle(Uncompressed)
- Samples/Encrypt/Encrypt AssetBundle(LZMA)
- Samples/Encrypt/Encrypt AssetBundle(LZ4)
- 括弧内にある圧縮形式のAssetBundleを暗号化。
- 暗号化したAssetBundleは
encrypted_sample
と言う名前で元データと同じディレクトリ内に新規生成される。
- 検証結果
- 雑に纏めた検証結果
- LoadFromStreamについて
AssetBundle.LoadFromStream
について色々メモ
- 暗号化学び直し
- そもそもとして暗号化に関する知識が全然なかったので学び直すところから始めていた。こちらはその際のメモ。