質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1807閲覧

【C#】zip圧縮を行ったプロジェクトをaes暗号化したい

gontya

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/06/07 03:10

編集2022/06/12 06:43

前提・実現したいこと

C#でzip圧縮を行ったプロジェクトをaes暗号化したいと考えています。

AesManaged クラスを用いた暗号化関数を作成し、zip圧縮後に呼び出してaes暗号化したいと考えております。
暗号化にあたり参考にさせていただいた記事は主に下記です。
リンク

試したこと

現在扱っているデータがJsonであり、Jsonデータをzip化まではできております。
その後、aes暗号化を記述した関数を呼び出す際に

System.IO.IOException: '別のプロセスで使用されているため、プロセスはファイル 'C:~' にアクセスできません。
と表示され、暗号化ができていない状態です。
(暗号化部分の入力ファイルパスと出力ファイルパスは、SaveFileDialogで保存した際のパスにしています)

他のプロセスが読み書きロックしているようなのですが、現状どの部分が干渉しているかが分かりかねる状態です。
zip化した後のaes暗号化手順に問題がないかご教授いただけますと幸いです。

該当のソースコード

↓暗号化関数

C#

1//aes暗号化 2 /// <summary> 3 /// 共有キー 4 /// </summary> 5 private const string AES_KEY = "-AESKEY-"; 6 7 /// <summary> 8 /// バッファサイズ 9 /// </summary> 10 private const int BUFFER_SIZE = 1024 * 4; 11 12 /// <summary> 13 /// 共有キービットサイズ 14 /// </summary> 15 private const int KEY_SIZE = 128; 16 17 /// <summary> 18 /// 暗号操作のビットサイズ 19 /// </summary> 20 private const int BLOCK_SIZE = 128; 21 22 /// <summary> 23 /// 暗号化 24 /// </summary> 25 /// <param name="src">入力ファイルパス</param> 26 /// <param name="dst">出力ファイルパス</param> 27 static public void Encode(string src, string dst) 28 { 29 //aes暗号化 30 using (AesManaged aes = new AesManaged()) 31 { 32 //AESインスタンスのパラメータ設定 33 aes.KeySize = KEY_SIZE; 34 aes.BlockSize = BLOCK_SIZE; 35 aes.Mode = CipherMode.CBC; 36 aes.Key = Encoding.UTF8.GetBytes(AES_KEY); 37 38 //初期ベクターの生成 39 aes.GenerateIV(); 40 41 //暗号化オブジェクトの生成 42 ICryptoTransform ct = aes.CreateEncryptor(aes.Key, aes.IV); 43 44 //出力ファイルストリーム 45 using (FileStream outFs = new FileStream(dst, FileMode.Create, FileAccess.Write)) 46 { 47 //初期ベクター書き込み 48 outFs.Write(aes.IV, 0, aes.IV.Length); 49 50 //暗号変換のストリーム(暗号化) 51 using (CryptoStream cs = new CryptoStream(outFs, ct , CryptoStreamMode.Write)) 52 { 53 //Deflateアルゴリズムを使用したストリーム(圧縮) 54 using (DeflateStream ds = new DeflateStream(cs, CompressionMode.Compress)) 55 { 56 //入力ファイルストリーム 57 using (FileStream inFs = new FileStream(src, FileMode.Open, FileAccess.Read)) 58 { 59 byte[] buf = new byte[BUFFER_SIZE]; 60 for(int size = inFs.Read(buf, 0, buf.Length); size>0; size = inFs.Read(buf, 0, buf.Length)) 61 { 62 //出力ファイルへの書き込み 63 ds.Write(buf, 0, size); 64 } 65 } 66 } 67 } 68 } 69 } 70 }

↓複合化関数

C#

1/// <summary> 2 /// 複合化 3 /// </summary> 4 /// <param name="src">入力ファイルパス</param> 5 /// <param name="dst">出力ファイルパス</param> 6 static public void Decode(string src, string dst) 7 { 8 // 高度暗号化標準(AES) 9 using (AesManaged aes = new AesManaged()) 10 { 11 // AESインスタンスのパラメータ設定 12 aes.KeySize = KEY_SIZE; 13 aes.BlockSize = BLOCK_SIZE; 14 aes.Mode = CipherMode.CBC; 15 aes.Key = Encoding.UTF8.GetBytes(AES_KEY); 16 17 // 入力ファイルストリーム 18 using (FileStream inFs = new FileStream(src, FileMode.Open, FileAccess.Read)) 19 { 20 // 初期化ベクター(IV)読込 21 byte[] iv = new byte[aes.IV.Length]; 22 inFs.Read(iv, 0, iv.Length); 23 aes.IV = iv; 24 25 // 複合化オブジェクト生成 26 ICryptoTransform ct = aes.CreateDecryptor(aes.Key, aes.IV); 27 28 // 暗号変換のストリーム(複合化) 29 using (CryptoStream cs = new CryptoStream(inFs, ct, CryptoStreamMode.Read)) 30 { 31 // Deflateアルゴリズムを使用したストリーム(圧縮解除) 32 using (DeflateStream ds = new DeflateStream(cs, CompressionMode.Decompress)) 33 { 34 // 出力ファイルストリーム 35 using (FileStream outFs = new FileStream(dst, FileMode.Create, FileAccess.Write)) 36 { 37 // 複合化した結果を書き込む 38 byte[] buf = new byte[BUFFER_SIZE]; 39 for (int size = ds.Read(buf, 0, buf.Length); size > 0; size = ds.Read(buf, 0, buf.Length)) 40 { 41 outFs.Write(buf, 0, size); 42 } 43 } 44 } 45 } 46 } 47 } 48 }

↓zip化、暗号化関数呼び出し

C#

1private void AesSaveAsButton_Click(object sender, RoutedEventArgs e) 2 { 3 var dialog = new SaveFileDialog(); 4 dialog.Filter = "zip|*.zip"; 5 if (dialog.ShowDialog() == true) 6 { 7 var filename = System.IO.Path.GetFileName(dialog.FileName); 8 var entryName = filename.Replace("zip", "json"); 9 10 var json = JsonConvert.SerializeObject(_data, Formatting.Indented); 11 12 // JSON 文字列からエンコーディング UTF-8 でバイト列を作成 13 var bytes = Encoding.UTF8.GetBytes(json); 14 15 using (var ms = new MemoryStream()) 16 { 17 // メモリストリーム上にZipArchiveを作成する 18 using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true)) 19 { 20 var entry = zipArchive.CreateEntry(entryName); 21 using (var es = entry.Open()) 22 { 23 // エントリにバイナリを書き込む 24 es.Write(bytes, 0, bytes.Length); 25 } 26 } 27 28 // MemoryStream からバイト列を取得してファイルを作成 29 byte[] zipBytes = ms.ToArray(); 30 File.WriteAllBytes(dialog.FileName, zipBytes); 31 32           //暗号化関数の呼び出し 33 Encode(dialog.FileName, C:~(pass)"); 34 } 35 }

↓複合化関数呼び出し

C#

1//AES複合化 2 private void AesOpenAsButton_Click(object sender, RoutedEventArgs e) 3 { 4 var dialog = new OpenFileDialog(); 5 6 if (dialog.ShowDialog().Value) 7 { 8 Decode(dialog.FileName, "C:~(pass)"); 9 var file = dialog.FileName; 10 11 try 12 { 13 var reader = new StreamReader(file); 14 var json = File.ReadAllText(dialog.FileName); 15 reader.Close(); 16 _data = JsonConvert.DeserializeObject<ObservableCollection<ManagementUnitData>>(json); 17 } 18 catch (Exception error) 19 { 20 if (error.Message != null) 21 Debug.WriteLine(error.Message); 22 } 23 24 if (_data != null) 25 { 26 DataContext = _data; 27 } 28 } 29 }

doing
出力先を別のパスに指定した結果、ファイルというものが生成。
こちらがaes暗号化されたものである可能性のため、複合化を行って検証予定。
イメージ説明
メモ帳で開く限り、何かしらのデータは入っているようです。
こちらの取り扱い方を捜査中
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/07 23:21

質問者さん、無言ですが、回答したのでそれに対するフィードバックをタイムリーに返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くと他の閲覧者の型からも期待に近い回答が出てくるかも。とにかく無言は NG です。
gontya

2022/06/08 14:08

申し訳ございません。 確認対応する時間がなく遅くなりました。 まだしっかりと試せてはいないのですが、出力先のファイルパスをドキュメントの中に出力した場合 ”ファイル”という種類のものが生成されました。 可能性としてこちらがaes暗号化されて出力されたものの可能性があるため、こちらを複合化して開けるかどうか試したいと考えている状況です。 ファイルという出力されたもののスクショを念のため本文の方に添付させていただきました。
退会済みユーザー

退会済みユーザー

2022/06/08 21:35

私の回答を見てファイルパスを変えて試しているのだと思いますが、であれば私の回答のコメント欄に書いていただくようお願いします。
退会済みユーザー

退会済みユーザー

2022/06/14 05:54

質問者さん、2022/06/12 15:45 以来無言ですが、回答のコメント欄で追加情報を提供したのでそれに対するフィードバックを返してください。質問のコードの private const string AES_KEY = "-AESKEY-"; を直せば Encode して Decode すると元の zip ファイルに戻ります。確認してクローズしてください。
guest

回答1

0

ベストアンサー

Encode(dialog.FileName, dialog.FileName);

入力と出力のファイルパスが同じというところに問題がありそうです。

投稿2022/06/07 03:52

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gontya

2022/06/12 06:45

お返事大変遅くなってしまい申し訳ございません。 入力と出力ファイルパスを別物に差し替えて実行したところ、確かにエラーは消えたため干渉理由は >Encode(dialog.FileName, dialog.FileName); この部分のようです。ご教授いただきありがとうございます。 ただその後、追記させていただきましたtestという"ファイル"の取り扱い方に悩んでおります。 こちらは暗号化を行った際に作成されるもので、 本文に追記させていただきましたように、メモ帳で開く限り何かしらのデータが入っているようです。 ただこちらの複合化がうまくいっていないのか、元のjsonデータに戻すことに苦戦しております。 複合化を試しているコードも本文の方に追記させていただきました。 おそらく、複合化関数の呼び出し時に問題がある気がしており現在そちらを調査しているところです。 ご回答いただいたのに大変お待たせしてしまっているので、現状共有になります。
退会済みユーザー

退会済みユーザー

2022/06/12 06:51

暗号化復号化のコードは何かの記事を参考にしたのだと思いますが、ネットに公開されているものであればその URL を教えてください。
退会済みユーザー

退会済みユーザー

2022/06/13 02:07

参考にした記事は最初の質問に書いてありましたね。 https://pg-nyoro.com/program/2018/02/18/%E3%80%90c%E3%80%91%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%83%BB%E8%A4%87%E5%90%88%E5%8C%96%E3%82%92%E8%A1%8C%E3%81%86%E3%80%82%E3%80%90aes%E6%9A%97%E5%8F%B7/ しかし質問者さんのコードでは、 private const string AES_KEY = "-AESKEY-"; と変更していて、長さが足りないのでエラーになるはず。ホントに暗号化ができてファイルが生成されたのか疑わしいのですが? 確認願います。
退会済みユーザー

退会済みユーザー

2022/06/13 02:20

参考にしている記事の通り、 private const string AES_KEY = "-SENJU MURAMASA-"; とすれば、 aes.Key = Encoding.UTF8.GetBytes(AES_KEY); で aes.Key に代入されるのは 16 バイトになるので、エラーは出なくなり、Encode メソッドでファイルは生成されました。 Decode メソッドで復号化もできました。復号化した結果生成されるファイルは元の zip ファイルとなります。 ただし、Encode の結果として生成されるファイルが、期待通り正しく AES 暗号化されているのかまでは調べてませんが。
退会済みユーザー

退会済みユーザー

2022/06/14 05:56

質問者さん、2022/06/12 15:45 以来無言ですが、いつまでも放置しておかないで上のコメントを確認してクローズしてください。
gontya

2022/06/14 14:48

AES_KEYは今回伏せるために"-AESKEY-"としておりますが、本来は "-SENJU MURAMASA-"よりも長いKEYで試しております。 そのため、キーが短いことによるエラーは起きていません。 Decodeで復元が試せないでいるため、そちらをが問題なく動作次第クローズさせていただけたらと思います。 現状、暗号化ファイルをDecodeメソッドで開いても特にエラーがvisualstudio上で表示されず何も起きないといった状況のため他の手法を用いて試してみます。
退会済みユーザー

退会済みユーザー

2022/06/15 01:00

> AES_KEYは今回伏せるために"-AESKEY-"としておりますが、本来は "-SENJU MURAMASA-"よりも長いKEYで試しております。そのため、キーが短いことによるエラーは起きていません。 それを質問欄を編集して追記願います。 > Decodeで復元が試せないでいるため、そちらをが問題なく動作次第クローズさせていただけたらと思います。 すぐにでも試せますよね。自分が何もない状態からあなたのコードをコピペして試せたのだから。タイムリーに結果を返してもらえないとフォローしきれません。今は定期的にこのスレッドを見に行っていますが、それももう面倒なのです。 > 現状、暗号化ファイルをDecodeメソッドで開いても特にエラーがvisualstudio上で表示されず何も起きないといった状況のため他の手法を用いて試してみます。 Decode(string src, string dst) メソッドで dst に指定したパスに復号したファイルが生成されるので、それを見ればわかるはず。dist のファイル名を例えば decrypted.zip とかにしてエクスプローラーで見ればわかります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問