Python学習およびポートフォリオ作成を目的として開発した、GUIベースの高セキュアなファイル・フォルダ暗号化/復号デスクトップアプリケーションです。
Python3エンジニア認定実践試験の学習範囲にとどまらず、最上位レベルのプログラミング実務に直結する発展トピックを、堅牢なセキュリティツール開発を通して体系的に学ぶことを目的として作成しました。
cryptography の高水準暗号化モジュール(Fernet)を利用し、ファイルおよびフォルダ内の一括暗号化・復号を直感的なGUIから行えるツールです。
単純なパスワード暗号化の脆弱性を克服するため、標準ライブラリ hashlib によるストレッチング(10万回ループによるハッシュ強化)および os.urandom を用いたソルト管理を組み合わせ、ブルートフォース攻撃に耐えうる暗号仕様を独自実装しています。
また、CustomTkinterによるモダンなダークモードGUI、「継承(is-a)より委譲・コンポジション(has-a)を最優先」した疎結合設計、Python 3.12+の最新ジェネリクス(PEP 695)による厳格な静的型付け(Mypy Strict適合)を採用し、保守性・実用性を極限まで追求しました。
-
ファイル・フォルダの一括暗号化/復号
-
cryptography.fernet.FernetによるAES-128-CBCベースの共通鍵暗号処理 -
ファイル単体だけでなく、フォルダを指定した配下全ファイルの一括再帰暗号化(バッチ処理)
-
堅牢なハッシュ&ストレッチング処理
-
os.urandomによる暗号論的に安全なソルトの自動生成 -
SHA-256を用いたストレッチング処理の実装
-
update()の引数はbytes-like必須(str直渡しはTypeError)とする型安全性の保証 -
hexdigest()仕様に準拠したアンダースコアなし64文字(16進数文字列)の厳密なハッシュ管理 -
pathlibに特化したデータ管理(Repository層の最適化)
-
ファイルIOに対して無駄な横流し層(Repository)を作らず、サービス層のみで簡結させる洗練されたアーキテクチャ設計
-
Path.parts(プロパティのため()をつけない仕様)の厳守、len(Path.parents)による階層数の正確な制御 -
アスペクト指向デコレータの重ねがけ
-
functools.wrapsを用いたメタデータの保護と、複数デコレータ適用順序(上に書いたものが外側)の厳密な管理 -
timeit仕様(Timer.repeat()が実行時間のリストを返す挙動)の理解を内包した「ミリ秒単位の処理時間計測デコレータ(@measure_time)」 -
string.Formatter.parse()の4番目要素(conversionが!r等を表し未指定ならNone)の仕様や、正規表現match.group()に複数指定すると「タプル」が返る挙動、名前付きキャプチャグループ((?P<name>...))を用いた高度な文字列整形ログデコレータ(@log_action) -
近代的な dictConfig ロギング
-
パフォーマンス低下を招く不要な文字列結合を排除した「遅延フォーマット評価(
%sの活用)」の徹底 -
disable_existing_loggers=Falseによる既存ロガーの保護(GUIライブラリ等のログ喪失を防止) -
fileConfigではフィルター等の詳細制御ができない制限を克服するdictConfig構造の全面採用 -
日付ごとのログファイル出力(
logs/app_YYYYMMDD.log)とコンソールへの同時出力 -
最新 Python 3.12+ 準拠の品質ガードレール
-
PEP 695で導入された新型パラメータ(
[F: Callable[..., Any]]構文)をデコレータに適用し、実行時スコープエラー(NameError)を完全回避 -
GitHub Actionsによる自動CIパイプラインの構築
| 分類 | 技術 |
|---|---|
| Language | Python 3.12+ (新型パラメータ/PEP 695 準拠) |
| Package Management | uv |
| GUI Framework | CustomTkinter |
| Cryptography | cryptography (Fernet) |
| Logger Configuration | dictConfig (disable_existing_loggers=False) |
| Testing | Pytest |
| Linter & Formatter | Ruff |
| Type Check | Mypy (Strict仕様適合) |
| CI/CD | GitHub Actions |
src/
└── encryption_tool/
├── gui/
│ └── main_window.py # CustomTkinterベースのGUI
├── models/
│ └── result.py # 処理結果オブジェクト型(EncryptionResult)
├── services/
│ ├── cipher_service.py # 暗号・復号の共通鍵サービス(CryptoHasherをコンポジション)
│ ├── crypto_hasher.py # ハッシュ化、ストレッチング、ソルトのファイル保存
│ └── file_service.py # ディレクトリ一括スキャン・バッチ処理
├── utils/
│ ├── decorators.py # timeit/正規表現/文字列仕様を盛り込んだ高度なデコレータ
│ └── logger.py # dictConfig を用いた既存ロガー保護対応の初期設定
└── main.py # アプリケーションの起動用エントリーポイント
tests/
├── services/
│ ├── test_cipher_service.py
│ ├── test_crypto_hasher.py
│ └── test_file_service.py
└── utils/
└── test_decorators.py
logs/ # 日付ごとの実行ログ(自動作成)
- Python 3.12以上
- uv (一貫した開発・実行環境を再現するため必須)
uv がインストールされていない場合は以下を実行してください。
pip install uv
uv を用いて、配布環境や開発環境でのバージョンズレによるバグを100%防止し、一貫した実行環境を再現します。
git clone <repository-url>
cd Python-Encryption-Tool
# uv を用いて lock ファイルに記録された依存関係を完全に同期 (自動で仮想環境が作成されます)
uv sync
uv run encryption-tool
uv run pytest
uv run ruff check .
uv run ruff format .
uv run mypy src tests
GitHub Actionsを利用したCIパイプラインを構築しています。
ジョブを以下の2段階に分離し、静的解析(Lint/Type Check)に成功した場合のみテストを実行する構成としています。
- Ruff
- Mypy
- Pytest
test:
needs: lint
上記により、Lintエラーが発生した場合は不要なテスト実行をスキップし、CIの実行リソースを節約します。
generate_key()による有効なFernetトークン用共通鍵の生成テスト- 正常なバイトデータ暗号化と、同一鍵を用いた正確な復号検証
- 不正な鍵、改ざんされた暗号データ(
InvalidToken)に対する安全な例外ハンドリングとエラー結果の返却テスト
os.urandomによる指定バイト数のランダムソルト生成テストstrを排除しbytes-likeを厳守したupdate()の型境界テスト- アンダースコアなし64文字の
hexdigest()出力形式の妥当性検証 Path.partsおよびPath.parentsを用いたソルトファイル生成時のパス永続化・ディレクトリ自動生成テスト
- 指定ディレクトリ配下のファイルを再帰的にスキャンする一括暗号化・復号ループ処理の検証
unittest.mockを用いた、ファイル入出力(read_bytes/write_bytes)のモック化による高速・安全な分離テスト
- デコレータの多重適用時の関数メタデータ(
__name__)の保持テスト string.Formatter().parse()の挙動とmatch.group(1, 2)のタプル返却仕様を満たしたログ整形の検証
本プロジェクトでは以下の技術要素を重点的に学習・実践しました。
- 「継承(is-a)より委譲・コンポジション(has-a)を最優先」:
CipherServiceがCryptoHasherを内部コンポーネントとして保持。Car が Engine インスタンスを保持するように、疎結合なオブジェクト設計を徹底 - Repository層の乱用見直し: ペラペラな横流し層を作る無駄を省き、ビジネスロジックと密接に関わるファイルIOをサービス層へ綺麗に集約・スリム化
- pathlibプロパティ仕様:
Path.partsに()をつけるとTypeErrorになる罠の理解、およびlen(Path.parents)の要素数ルールの正確な把握 - hashlibの厳格化:
update()引数にstrを直渡しした際のTypeError仕様の理解
- cryptography標準暗号: AES共通鍵暗号の仕組みと、バイトデータのエンコード・デコードの安全な境界設計
- アスペクト指向プログラミング: デコレータの重ねがけ、
timeit.Timer.repeat()がリストを返す挙動への理解、および正規表現の名前付きキャプチャグループ((?P<name>...))の応用 - 本格的なプロダクションロギング: 不要な文字列結合を避ける「遅延フォーマット評価(
%s)」の徹底、およびdisable_existing_loggers=FalseとdictConfigによる高度な外部ライブラリ保護制御
- Pytest / Ruff / Mypy Strict の3層ガードレールによる品質担保
- Python 3.12+ の最新ジェネリクス(新型パラメータ構文構文)を用いた厳格な型保証と、実行時スコープ(
NameError)の完全回避 - GitHub Actionsによる自動化CI環境の構築
- 非同期・マルチスレッドIOの導入: 大容量ファイルや大量のフォルダ内ファイルを一括処理する際、GUIのメインスレッドがフリーズ(応答なし)するのを防ぐため、
threadingまたはasyncioへのタスク委譲を実装する。 - 暗号鍵派生標準アルゴリズムへの置換: 独自実装のストレッチングロジックから、
cryptographyライブラリのPBKDF2HMACやArgon2idといった実績ある鍵派生関数(KDF)へのリファクタリング。 - ドラッグ&ドロップ対応: ファイル選択ダイアログだけでなく、GUI上のメインパネルに直接ファイルをドラッグ&ドロップしてパスを自動取得するユーザー体験(UX)の向上。
MIT License
