【Python】PythonでAES暗号化・復号化ツールを作る

技術情報
技術情報

はじめに

本記事では、ローカル環境で安全に文字列を暗号化・復号化できるPythonツールの作り方を解説します。
オンラインツールでは平文がサーバに送信される可能性があり、セキュリティが保証されないため、ローカル完結型のツールを作ることを目的とします。

1. 暗号化ツールの仕様

今回作成するツールは以下の仕様です。

  • AES-256を使用(256ビット鍵)
  • CBCモードで暗号化
  • ランダムIVを使用して同じ平文でも毎回異なる暗号文
  • パスワードから鍵を生成する際に PBKDF2-HMAC-SHA256 を使用
  • Base64出力で扱いやすく
  • 完全にローカル環境で完結

2. 検証環境

  • OS: Windows 11
  • Python: 3.11
  • ライブラリ: pycryptdome
  • 実行方法: コマンドプロンプト、VSCodeターミナル、バッチ実行可

3.事前準備

3.1. Python をインストール

  1. Python公式サイト からインストーラーをダウンロード
  2. インストール時に 「Add Python to PATH」 オプションを必ずチェック
  3. インストール完了後、コマンドプロンプトで以下を実行して確認
python --version

3.2. ライブラリ をインストール

pip install pycryptodome

4. 実装

4.1. Pythonファイル

encrypt_tool.py

import base64
import os
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import SHA256

def derive_key(password: str, salt: bytes, key_len=32) -> bytes:
    """PBKDF2-HMAC-SHA256でパスワードから安全に鍵を生成"""
    return PBKDF2(password.encode("utf-8"), salt, dkLen=key_len, count=100000, hmac_hash_module=SHA256)

def encrypt(text: str, password: str) -> str:
    salt = os.urandom(16)  # 鍵派生用のランダムSalt
    key = derive_key(password, salt)
    iv = os.urandom(16)    # ランダムIV
    cipher = AES.new(key, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(pad(text.encode("utf-8"), AES.block_size))
    return base64.b64encode(salt + iv + encrypted).decode("utf-8")

def decrypt(text: str, password: str) -> str:
    raw = base64.b64decode(text)
    salt = raw[:16]
    iv = raw[16:32]
    encrypted = raw[32:]
    key = derive_key(password, salt)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
    return decrypted.decode("utf-8")

def main():
    mode = input("暗号化する場合は e、復号化する場合は d を入力してください: ").lower()
    key = input("キーを入力してください: ")
    target = input("対象文字列を入力してください: ")

    try:
        if mode == "e":
            print("\n暗号化結果:")
            print(encrypt(target, key))
        elif mode == "d":
            print("\n復号化結果:")
            print(decrypt(target, key))
        else:
            print("e または d を入力してください。")
    except Exception as e:
        print("エラー:", e)

if __name__ == "__main__":
    main()

4.2. Batファイル

run.bat

@echo off
python "%~dp0encrypt_tool.py"
pause

5. 実行例

5.1. 暗号化

暗号化する場合は e、復号化する場合は d を入力してください: e
キーを入力してください: mypassword
対象文字列を入力してください: secret123

暗号化結果:
l8IhW6Mv0Xj5G2Ry2v6ZrNxF9Mb+Y1sS5cO1Kxy+K8Y=

5.2. 暗号化

暗号化する場合は e、復号化する場合は d を入力してください: d
キーを入力してください: mypassword
対象文字列を入力してください: l8IhW6Mv0Xj5G2Ry2v6ZrNxF9Mb+Y1sS5cO1Kxy+K8Y=

復号化結果:
secret123

6. まとめ

  • Python公式サイトからのインストールで安全にPython環境を構築
  • ローカルで完結するAES暗号化ツールは、オンラインツールより安全
  • PBKDF2-HMAC-SHA256 + ランダムIV/Saltでセキュリティ強化
  • Base64出力により暗号文を簡単に扱える
  • バッチファイルを使えば、ダブルクリックで実行可能

タイトルとURLをコピーしました