/// <summary> /// 暗号化ハッシュ取得 /// </summary> /// <param name="assetBundleNameWithVariant">バリアント付きアセットバンドル名</param> /// <returns>暗号化ハッシュ</returns> public int GetCryptoHash(string assetBundleNameWithVariant) { var result = 0; if (IsCrypto(assetBundleNameWithVariant)) { result = AssetBundleCrypto.GetFirstCryptoHash(); } return(result); }
/// <summary> /// 暗号化 /// </summary> /// <param name="source">元ファイル</param> /// <param name="dest">暗号化ファイル(元ファイルと同一は不可)</param> /// <param name="cryptoHash">暗号化ハッシュ</param> /// <param name="isNonDeterministic">非決定性暗号化</param> /// <remarks>非スレッドセーフ</remarks> public void Encrypt(string source, string dest, int cryptoHash, bool isNonDeterministic) { var sourceFullPath = Application.dataPath + "/../" + source; var destFullPath = Application.dataPath + "/../" + dest; byte[] iv; if (isNonDeterministic) { //非決定性暗号化 iv = CreateRandomIV(); } else { //決定性暗号化 iv = hashAlgorithm.GetHashFromFile(sourceFullPath).Take(AssetBundleCrypto.kIVSize).ToArray(); } using (var destStream = File.Open(destFullPath, FileMode.Create, FileAccess.Write)) { destStream.Write(iv, 0, iv.Length); using (var sourceStream = File.Open(sourceFullPath, FileMode.Open, FileAccess.Read)) { var fileSizeBytes = System.BitConverter.GetBytes((int)sourceStream.Length); destStream.Write(fileSizeBytes, 0, fileSizeBytes.Length); var buffer = cryptoBuffer; var key = AssetBundleCrypto.GetCryptoKey(cryptoHash); using (var encryptStream = AssetBundleCrypto.GetEncryptStream(destStream, key, iv)) { while (true) { var readed = sourceStream.Read(buffer, 0, buffer.Length); if (0 == readed) { break; } encryptStream.Write(buffer, 0, readed); } } } } }