はじめに
Avalonia UIの学習プロジェクトとして開発していたファイル暗号化ツールを、 「暗号化されたHTMLや画像をブラウザで安全に閲覧するラッパー」 としてブラッシュアップしました。 「アプリ内で表示する」から「ブラウザに任せる」へと発想を転換した経緯と、その技術仕様・実装のポイントをまとめます。
開発の背景と目的
当初は「画像を暗号化してアプリ内で表示する」ツールでしたが、開発を進める中で以下の課題が出てきました。
- 対応フォーマットの限界: 画像だけでなく、HTMLやPDF、動画なども扱いたい。
- レンダリングのコスト: アプリ内でHTMLレンダリングエンジンを実装・維持するのはコストが高い。
そこで、アプリ自体は 「復号と起動」に徹し、表示は高機能な「既定のブラウザ(またはOSの関連付けアプリ)」に任せるというラッパー方式 を採用しました。
システムの挙動(EncBrowse)
このツールは、管理者(暗号化する人)とユーザー(閲覧する人)の利用を想定しています。
暗号化 (管理者):
- 任意のファイル(HTML, JS, PNG等)をパスワード付きで暗号化。
- 独自形式 .secure ファイルとして保存。
- 複数ファイルの一括暗号化にも対応。
復号と閲覧 (ユーザー):
- パスワードを入力して .secure ファイルを選択。
- アプリが復号し、ランダムなファイル名で一時ファイルを作成。
- 自動的に既定のブラウザが起動し、ファイルが表示される。
- アプリ終了時に一時ファイルを自動削除し、痕跡を消す。
技術仕様
セキュリティツールとして実用的な強度を持たせるため、以下の標準技術を採用しています。
- フレームワーク: .NET 8 / Avalonia UI 11
- 暗号化アルゴリズム: AES-256 (CBCモード)
- 鍵導出: PBKDF2 (SHA-256, 10,000回反復)
- Salt/IV: ファイルごとにランダム生成してヘッダに埋め込み
ファイル構造
復号に必要な情報はファイルヘッダに平文で持ち、データ本体のみを暗号化しています。
[ Salt (16B) ] + [ IV (16B) ] + [ Encrypted Data (MIME + Content) ]
4. 実装のポイント (C#)
運用モードの切り替え(管理者/ユーザー)
誤操作を防ぐため、コード内のフラグ一つで「暗号化機能(管理者用)」を非表示にできる仕組みを導入しました。配布用ビルドを作成する際に便利です。
// MainWindowViewModel.cs
// 運用設定: trueなら管理者用(暗号化あり)、falseならユーザー用(復号のみ)
public bool IsEncryptionVisible { get; } = true;
View側では IsVisible にバインドするだけで制御できます。
<!-- MainWindow.axaml -->
<Button Content="Select & Encrypt File"
Command="{Binding EncryptCommand}"
IsVisible="{Binding IsEncryptionVisible}"/>
一時ファイルの自動削除
ブラウザで表示するために一時ファイルを作成しますが、セキュリティリスクを低減するため、アプリ終了時にこれらを削除する処理を実装しています。
// MainWindowViewModel.cs
public MainWindowViewModel()
{
// ... コマンド初期化など
AppDomain.CurrentDomain.ProcessExit += (s, e) => CleanupTempFiles();
}
private void CleanupTempFiles()
{
foreach (var path in _tempFilePaths)
{
try
{
if (File.Exists(path)) File.Delete(path);
}
catch { /* 削除失敗時は無視 */ }
}
}
既定のブラウザで開く
.NET の Process.Start を使用し、シェル実行 (UseShellExecute = true) を有効にすることで、拡張子に関連付けられた既定のアプリケーション(HTMLならブラウザ、PDFならPDFリーダー)で開くことができます。
// 復号後の処理
Process.Start(new ProcessStartInfo {
FileName = tempFilePath,
UseShellExecute = true
});
まとめ
Avalonia UIを使うことで、Windows/macOS/Linuxで動作するセキュリティツールをクロスプラットフォームで実装できました。 「ブラウザラッパー」というアプローチにより、HTMLベースのリッチなコンテンツも安全に配布・閲覧できる、汎用性の高いツールになりました。
今後は、WebView2を用いたアプリ内表示(完全なファイルレス化)なども検討していきたいです