見出し画像

【ファイル操作】ファイル暗号化・復号化ツール サンプルコード

・業務効率化には何すればいいのかな?
・Pythonで自動化ツールを作成できると聞くけど、具体的に何が作れるの?
・自動化のアイデアが出てこない

こんな悩みを抱えている人に向けて、Pythonで作れる自動化ツールを解説しています。

ファイル操作のツールについて、こちらの記事で紹介しています。
 ⇒【ファイル操作】Pythonで作れる自動化ツールの具体例アイデア9選【業務効率化】

本記事では、ファイル暗号化・復号化ツールのサンプルコードを公開しています。

サンプルコードは、自分で作成するのが難しい方や、ツール作成の手間を減らしたい方にお勧めです。ぜひご活用ください。



アイデア「ファイル暗号化・復号化ツール」

概要

指定したファイルやフォルダを暗号化し、セキュリティを強化します。また、正当なユーザーが復号化できる機能も提供します。

導入メリット

機密情報を含むファイルのセキュリティを強化し、不正アクセスから保護します。

ツール機能

強力な暗号化アルゴリズムを使用してファイルやフォルダを暗号化し、安全なパスワードまたはキーを用いてのみアクセス可能にします。

必要技術

cryptography:強力な暗号化と復号化を提供する

処理フロー

  1. ユーザーが暗号化または復号化したいファイルまたはフォルダを選択

  2. 暗号化の場合、ユーザーが安全なパスワードまたはキーを設定

  3. cryptographyを使用してファイルまたはフォルダを暗号化

  4. 復号化の場合、正しいパスワードまたはキーの入力を要求

  5. 入力されたパスワードまたはキーが正しい場合、ファイルまたはフォルダを復号化

  6. 暗号化または復号化プロセス完了後、ユーザーに通知


注意事項

著作権について

本ソースコードの著作権は、販売者に帰属します。
修正や改変は自由に行えますが、無断での複製、配布は法律で禁止されています。

ライセンスについて

本ソースコードは、個人利用及び商用利用が可能です。ただし、再販売や、本ソースコードを基にした派生作品の販売は禁止します。

返金について

デジタルコンテンツの性質上、購入後の返品や返金は原則として受け付けておりません。

使用上の免責事項

本ソースコードは予告なく変更や修正を行う場合があります。
本ソースコードの動作を保証するものではありません。
本ソースコードの使用から生じたいかなる直接的または間接的な損害に対しても、販売者は責任を負いません。
動作の不具合については、購入者自身の責任で対処してください。

サポートについて

本ソースコードに関するサポートは行っておりません。バグ報告や質問への対応は致しかねます。


ソースコード

import os
import base64
import getpass
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

def get_files_in_directory(directory):
    """ディレクトリ内のすべてのファイルパスを取得する"""
    file_list = []
    for root, _, files in os.walk(directory):
        for file in files:
            file_list.append(os.path.join(root, file))
    return file_list

def derive_key(password, salt):
    """パスワードからキーを導出する"""
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=salt,
        iterations=100000,
        backend=default_backend()
    )
    return kdf.derive(password.encode())

def encrypt_file(file_path, password):
    """ファイルを暗号化する"""
    print("暗号化開始")
    print(password)

    with open(file_path, 'rb') as f:
        data = f.read()
    
    salt = os.urandom(16)
    key = derive_key(password, salt)
    
    aesgcm = AESGCM(key)
    nonce = os.urandom(12)
    encrypted_data = aesgcm.encrypt(nonce, data, None)
    
    with open(file_path, 'wb') as f:
        f.write(salt + nonce + encrypted_data)

def decrypt_file(file_path, password):
    """ファイルを復号化する"""
    with open(file_path, 'rb') as f:
        data = f.read()
    
    salt = data[:16]
    nonce = data[16:28]
    encrypted_data = data[28:]
    
    key = derive_key(password, salt)
    aesgcm = AESGCM(key)
    
    try:
        decrypted_data = aesgcm.decrypt(nonce, encrypted_data, None)
    except Exception as e:
        print(f"エラー: ファイルの復号化に失敗しました。 {e}")
        return
    
    with open(file_path, 'wb') as f:
        f.write(decrypted_data)

def main():
    mode = input("暗号化する場合は'e'を、復号化する場合は'd'を入力してください: ")
    target = input("暗号化/復号化するファイルまたはディレクトリのパスを入力してください: ")
    password = input("パスワードを入力してください: ")
    # パスワードを隠すときはgetpassを使用する
    # password = getpass.getpass("パスワードを入力してください: ")


    if os.path.isfile(target):
        print("対象:ファイル")
        if mode == 'e':
            encrypt_file(target, password)
            print("ファイルが暗号化されました。")
        elif mode == 'd':
            decrypt_file(target, password)
            print("ファイルが復号化されました。")
    elif os.path.isdir(target):
        print("対象:フォルダ")
        files = get_files_in_directory(target)
        for file in files:
            try:
                if mode == 'e':
                    encrypt_file(file, password)
                    print(f"{file} が暗号化されました。")
                elif mode == 'd':
                    decrypt_file(file, password)
                    print(f"{file} が復号化されました。")
            except Exception as e:
                print(f"エラー: {file} の処理中に問題が発生しました。 {e}")
    else:
        print("ファイルまたはディレクトリのパスが間違っています")

if __name__ == "__main__":
    main()

最後まで読んでいただき、ありがとうございました!
参考のなったと思っていただけたら、
♡スキを押していただけると嬉しいです。

今後もサンプルコードを紹介する予定なので、
関心のある方は是非アカウントのフォローをお願いします!

この記事が気に入ったらサポートをしてみませんか?