Skip to content

shim369/Python-Encryption-Tool

Repository files navigation

Python Encryption Tool

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パイプラインの構築


Screenshots

Main Window

Python Encryption Tool


使用技術

分類 技術
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による依存関係ロック)

uv を用いて、配布環境や開発環境でのバージョンズレによるバグを100%防止し、一貫した実行環境を再現します。

git clone <repository-url>
cd Python-Encryption-Tool

# uv を用いて lock ファイルに記録された依存関係を完全に同期 (自動で仮想環境が作成されます)
uv sync

起動方法

uv run encryption-tool

品質管理・テスト

テスト実行

uv run pytest

Ruff (Linter & Formatter)

uv run ruff check .
uv run ruff format .

Mypy (Type Check Strict)

uv run mypy src tests

GitHub Actions (CI)

GitHub Actionsを利用したCIパイプラインを構築しています。

ジョブを以下の2段階に分離し、静的解析(Lint/Type Check)に成功した場合のみテストを実行する構成としています。

1. Lint Job

  • Ruff
  • Mypy

2. Test Job

  • Pytest
test:
  needs: lint

上記により、Lintエラーが発生した場合は不要なテスト実行をスキップし、CIの実行リソースを節約します。


テスト内容

CipherService

  • generate_key() による有効なFernetトークン用共通鍵の生成テスト
  • 正常なバイトデータ暗号化と、同一鍵を用いた正確な復号検証
  • 不正な鍵、改ざんされた暗号データ(InvalidToken)に対する安全な例外ハンドリングとエラー結果の返却テスト

CryptoHasher

  • os.urandom による指定バイト数のランダムソルト生成テスト
  • str を排除し bytes-like を厳守した update() の型境界テスト
  • アンダースコアなし64文字の hexdigest() 出力形式の妥当性検証
  • Path.parts および Path.parents を用いたソルトファイル生成時のパス永続化・ディレクトリ自動生成テスト

FileService

  • 指定ディレクトリ配下のファイルを再帰的にスキャンする一括暗号化・復号ループ処理の検証
  • unittest.mock を用いた、ファイル入出力(read_bytes / write_bytes)のモック化による高速・安全な分離テスト

Decorators

  • デコレータの多重適用時の関数メタデータ(__name__)の保持テスト
  • string.Formatter().parse() の挙動と match.group(1, 2) のタプル返却仕様を満たしたログ整形の検証

学習テーマ

本プロジェクトでは以下の技術要素を重点的に学習・実践しました。

Python基礎・オブジェクト指向

  • 「継承(is-a)より委譲・コンポジション(has-a)を最優先」: CipherServiceCryptoHasher を内部コンポーネントとして保持。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=FalsedictConfig による高度な外部ライブラリ保護制御

開発プロセス

  • Pytest / Ruff / Mypy Strict の3層ガードレールによる品質担保
  • Python 3.12+ の最新ジェネリクス(新型パラメータ構文構文)を用いた厳格な型保証と、実行時スコープ(NameError)の完全回避
  • GitHub Actionsによる自動化CI環境の構築

今後の改善案

  • 非同期・マルチスレッドIOの導入: 大容量ファイルや大量のフォルダ内ファイルを一括処理する際、GUIのメインスレッドがフリーズ(応答なし)するのを防ぐため、threading または asyncio へのタスク委譲を実装する。
  • 暗号鍵派生標準アルゴリズムへの置換: 独自実装のストレッチングロジックから、cryptography ライブラリの PBKDF2HMACArgon2id といった実績ある鍵派生関数(KDF)へのリファクタリング。
  • ドラッグ&ドロップ対応: ファイル選択ダイアログだけでなく、GUI上のメインパネルに直接ファイルをドラッグ&ドロップしてパスを自動取得するユーザー体験(UX)の向上。

License

MIT License

About

Secure file and folder encryption desktop tool built with Python 3.12+, CustomTkinter, and cryptography. Features strict static typing (Mypy Strict) and custom aspect-oriented decorators.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages