PythonでAES暗号化と復号を行う手順

この記事では、PythonでのAES(Advanced Encryption Standard)暗号化と復号の手順について詳細に解説します。具体的なコード例、その解説、さらに応用例を含めています。

目次

はじめに

AES(Advanced Encryption Standard)は、広く用いられている暗号化アルゴリズムの一つです。セキュリティが重要な情報を扱う際に、暗号化と復号は欠かせない技術となっています。

AES暗号化の基本

PythonでのAES暗号化ライブラリ

PythonでAES暗号化を行うには、多くのライブラリが存在しますが、ここでは`pycryptodome`を使用します。

# pycryptodomeのインストール
!pip install pycryptodome

基本的な暗号化と復号のコード

以下は、AES暗号化と復号を行う基本的なPythonコードです。

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# 鍵の生成(16バイト)
key = get_random_bytes(16)

# 暗号化したいデータ
data = "秘密のメッセージ".encode('utf-8')

# AESオブジェクトの生成
cipher = AES.new(key, AES.MODE_EAX)

# データの暗号化
ciphertext, tag = cipher.encrypt_and_digest(data)

# データの復号
cipher = AES.new(key, AES.MODE_EAX, nonce=cipher.nonce)
decrypted_data = cipher.decrypt(ciphertext)

print(decrypted_data.decode('utf-8'))  # '秘密のメッセージ'と表示される

コードの解説

1. `Crypto.Cipher`から`AES`をインポートします。
2. `get_random_bytes`関数でランダムな16バイトの鍵を生成します。
3. 暗号化したいデータをUTF-8でエンコードします。
4. `AES.new()`でAESオブジェクトを生成し、
5. `encrypt_and_digest()`メソッドでデータを暗号化します。
6. 復号は、同じ鍵とNonce(Number used once)を用いて、`decrypt()`メソッドで行います。

応用例

ファイルの暗号化と復号

AESを用いて、ファイル全体を暗号化し、それを再び復号する例です。

# ファイルの読み込み
with open('secret.txt', 'rb') as f:
    file_data = f.read()

# AESオブジェクトの生成と暗号化
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(file_data)

# 暗号化したデータを保存
with open('encrypted.txt', 'wb') as f:
    f.write(ciphertext)

# 暗号化したデータの読み込み
with open('encrypted.txt', 'rb') as f:
    encrypted_data = f.read()

# データの復号
cipher = AES.new(key, AES.MODE_EAX, nonce=cipher.nonce)
decrypted_data = cipher.decrypt(encrypted_data)

# 復号したデータを保存
with open('decrypted.txt', 'wb') as f:
    f.write(decrypted_data)

暗号文の送受信

AES暗号化を用いて、安全なメッセージの送受信を行う例です。

# サーバー側
def server(ciphertext, key, nonce):
    cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
    decrypted_data = cipher.decrypt(ciphertext)
    return decrypted_data.decode('utf-8')

# クライアント側
def client(data, key):
    cipher = AES.new(key, AES.MODE_EAX)
    ciphertext, tag = cipher.encrypt_and_digest(data.encode('utf-8'))
    return ciphertext, cipher.nonce

# 使用例
key = get_random_bytes(16)
ciphertext, nonce = client("安全なメッセージ", key)
received_message = server(ciphertext, key, nonce)
print(received_message)  # "安全なメッセージ"と表示される

まとめ

PythonでAES暗号化と復号を行う方法について解説しました。基本的な手順から、ファイルの暗号化や安全なメッセージの送受信まで、様々な応用例を通じて理解を深めることができるでしょう。セキュリティ対策として、これらの手法を活用してみてください。

コメント

コメントする

目次