前提・実現したいこと
C#でzip圧縮を行ったプロジェクトをaes暗号化したいと考えています。
AesManaged クラスを用いた暗号化関数を作成し、zip圧縮後に呼び出してaes暗号化したいと考えております。
暗号化にあたり参考にさせていただいた記事は主に下記です。
リンク
試したこと
現在扱っているデータがJsonであり、Jsonデータをzip化まではできております。
その後、aes暗号化を記述した関数を呼び出す際に
System.IO.IOException: '別のプロセスで使用されているため、プロセスはファイル 'C:~' にアクセスできません。
と表示され、暗号化ができていない状態です。
(暗号化部分の入力ファイルパスと出力ファイルパスは、SaveFileDialogで保存した際のパスにしています)
他のプロセスが読み書きロックしているようなのですが、現状どの部分が干渉しているかが分かりかねる状態です。
zip化した後のaes暗号化手順に問題がないかご教授いただけますと幸いです。
該当のソースコード
↓暗号化関数
C#
//aes暗号化 /// <summary> /// 共有キー /// </summary> private const string AES_KEY = "-AESKEY-"; /// <summary> /// バッファサイズ /// </summary> private const int BUFFER_SIZE = 1024 * 4; /// <summary> /// 共有キービットサイズ /// </summary> private const int KEY_SIZE = 128; /// <summary> /// 暗号操作のビットサイズ /// </summary> private const int BLOCK_SIZE = 128; /// <summary> /// 暗号化 /// </summary> /// <param name="src">入力ファイルパス</param> /// <param name="dst">出力ファイルパス</param> static public void Encode(string src, string dst) { //aes暗号化 using (AesManaged aes = new AesManaged()) { //AESインスタンスのパラメータ設定 aes.KeySize = KEY_SIZE; aes.BlockSize = BLOCK_SIZE; aes.Mode = CipherMode.CBC; aes.Key = Encoding.UTF8.GetBytes(AES_KEY); //初期ベクターの生成 aes.GenerateIV(); //暗号化オブジェクトの生成 ICryptoTransform ct = aes.CreateEncryptor(aes.Key, aes.IV); //出力ファイルストリーム using (FileStream outFs = new FileStream(dst, FileMode.Create, FileAccess.Write)) { //初期ベクター書き込み outFs.Write(aes.IV, 0, aes.IV.Length); //暗号変換のストリーム(暗号化) using (CryptoStream cs = new CryptoStream(outFs, ct , CryptoStreamMode.Write)) { //Deflateアルゴリズムを使用したストリーム(圧縮) using (DeflateStream ds = new DeflateStream(cs, CompressionMode.Compress)) { //入力ファイルストリーム using (FileStream inFs = new FileStream(src, FileMode.Open, FileAccess.Read)) { byte[] buf = new byte[BUFFER_SIZE]; for(int size = inFs.Read(buf, 0, buf.Length); size>0; size = inFs.Read(buf, 0, buf.Length)) { //出力ファイルへの書き込み ds.Write(buf, 0, size); } } } } } } }
↓複合化関数
C#
/// <summary> /// 複合化 /// </summary> /// <param name="src">入力ファイルパス</param> /// <param name="dst">出力ファイルパス</param> static public void Decode(string src, string dst) { // 高度暗号化標準(AES) using (AesManaged aes = new AesManaged()) { // AESインスタンスのパラメータ設定 aes.KeySize = KEY_SIZE; aes.BlockSize = BLOCK_SIZE; aes.Mode = CipherMode.CBC; aes.Key = Encoding.UTF8.GetBytes(AES_KEY); // 入力ファイルストリーム using (FileStream inFs = new FileStream(src, FileMode.Open, FileAccess.Read)) { // 初期化ベクター(IV)読込 byte[] iv = new byte[aes.IV.Length]; inFs.Read(iv, 0, iv.Length); aes.IV = iv; // 複合化オブジェクト生成 ICryptoTransform ct = aes.CreateDecryptor(aes.Key, aes.IV); // 暗号変換のストリーム(複合化) using (CryptoStream cs = new CryptoStream(inFs, ct, CryptoStreamMode.Read)) { // Deflateアルゴリズムを使用したストリーム(圧縮解除) using (DeflateStream ds = new DeflateStream(cs, CompressionMode.Decompress)) { // 出力ファイルストリーム using (FileStream outFs = new FileStream(dst, FileMode.Create, FileAccess.Write)) { // 複合化した結果を書き込む byte[] buf = new byte[BUFFER_SIZE]; for (int size = ds.Read(buf, 0, buf.Length); size > 0; size = ds.Read(buf, 0, buf.Length)) { outFs.Write(buf, 0, size); } } } } } } }
↓zip化、暗号化関数呼び出し
C#
private void AesSaveAsButton_Click(object sender, RoutedEventArgs e) { var dialog = new SaveFileDialog(); dialog.Filter = "zip|*.zip"; if (dialog.ShowDialog() == true) { var filename = System.IO.Path.GetFileName(dialog.FileName); var entryName = filename.Replace("zip", "json"); var json = JsonConvert.SerializeObject(_data, Formatting.Indented); // JSON 文字列からエンコーディング UTF-8 でバイト列を作成 var bytes = Encoding.UTF8.GetBytes(json); using (var ms = new MemoryStream()) { // メモリストリーム上にZipArchiveを作成する using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true)) { var entry = zipArchive.CreateEntry(entryName); using (var es = entry.Open()) { // エントリにバイナリを書き込む es.Write(bytes, 0, bytes.Length); } } // MemoryStream からバイト列を取得してファイルを作成 byte[] zipBytes = ms.ToArray(); File.WriteAllBytes(dialog.FileName, zipBytes); //暗号化関数の呼び出し Encode(dialog.FileName, C:~(pass)"); } }
↓複合化関数呼び出し
C#
//AES複合化 private void AesOpenAsButton_Click(object sender, RoutedEventArgs e) { var dialog = new OpenFileDialog(); if (dialog.ShowDialog().Value) { Decode(dialog.FileName, "C:~(pass)"); var file = dialog.FileName; try { var reader = new StreamReader(file); var json = File.ReadAllText(dialog.FileName); reader.Close(); _data = JsonConvert.DeserializeObject<ObservableCollection<ManagementUnitData>>(json); } catch (Exception error) { if (error.Message != null) Debug.WriteLine(error.Message); } if (_data != null) { DataContext = _data; } } }
doing
出力先を別のパスに指定した結果、ファイルというものが生成。
こちらがaes暗号化されたものである可能性のため、複合化を行って検証予定。
メモ帳で開く限り、何かしらのデータは入っているようです。
こちらの取り扱い方を捜査中
まだ回答がついていません
会員登録して回答してみよう