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

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

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

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

解決済

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

gontya
gontya

総合スコア3

C#

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

1回答

0評価

0クリップ

378閲覧

投稿2022/06/07 03:10

編集2022/06/15 10:00

前提・実現したいこと

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暗号化されたものである可能性のため、複合化を行って検証予定。
イメージ説明
メモ帳で開く限り、何かしらのデータは入っているようです。
こちらの取り扱い方を捜査中
イメージ説明

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

SurferOnWww

2022/06/07 23:21

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

2022/06/08 14:08

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

2022/06/08 21:35

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

2022/06/14 05:54

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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