Pythonで暗号化: cryptographyで非対称鍵暗号化を実装する方法

Pythonは優れた暗号化機能を提供するため、セキュアな通信やデータの保護に広く使用されています。その中でも非対称鍵暗号化は、データの安全性を確保するために頻繁に使用される手法です。本記事では、Pythonのcryptographyライブラリを使用して非対称鍵暗号化を実装する方法について詳しく説明します。また、具体的な例とコードを交えて、実際の使用法を解説します。

cryptographyライブラリは、Pythonで暗号化や復号化を行うための強力なツールセットです。非対称鍵暗号化は、公開鍵と秘密鍵の2つの異なる鍵を使用してデータを暗号化および復号化する方式です。まず、公開鍵でデータを暗号化し、その後、対応する秘密鍵でのみ復号化できるという特徴があります。非対称鍵暗号化の実装には、以下の手順を追う必要があります。

1. cryptographyのインストール

まず、Pythonのパッケージマネージャーを使用してcryptographyライブラリをインストールします。以下のコマンドを実行してください。

pip install cryptography

2. 鍵の生成

非対称鍵暗号化には、公開鍵と秘密鍵の両方が必要です。これらの鍵を生成するためには、cryptographyライブラリのcryptography.hazmat.primitives.asymmetricモジュールを使用します。以下のコードは、RSAアルゴリズムを使用して鍵を生成する例です。RSA(Rivest-Shamir-Adleman)は、非対称鍵暗号化の一種であり、1977年にRon Rivest、Adi Shamir、Leonard Adlemanによって提案されました。RSAは、公開鍵と秘密鍵の2つの異なる鍵を使用してデータを暗号化および復号化する方式です。

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)

private_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

public_key = private_key.public_key()

public_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

with open('private_key.pem', 'wb') as f:
    f.write(private_pem)

with open('public_key.pem', 'wb') as f:
    f.write(public_pem)

上記のコードでは、2048ビットのRSA鍵ペアを生成し、private_key.pemとpublic_key.pemという2つのファイルに保存しています。

3. 暗号化と復号化

生成した公開鍵と秘密鍵を使用して、データの暗号化と復号化を行います。以下の例では、文字列を暗号化し、復号化する方法を示しています。

from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization

# 秘密鍵の読み込み
with open('private_key.pem', 'rb') as f:
    private_pem = f.read()
    private_key = serialization.load_pem_private_key(
        private_pem,
        password=None
    )

# 公開鍵の読み込み
with open('public_key.pem', 'rb') as f:
    public_pem = f.read()
    public_key = serialization.load_pem_public_key(public_pem)

# データの暗号化
message = b"Hello, World!"
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# データの復号化
plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(plaintext)

上記のコードでは、まず秘密鍵と公開鍵をそれぞれ読み込みます。次に、public_key.encrypt()メソッドを使用してデータを暗号化し、private_key.decrypt()メソッドを使用して復号化します。復号化されたデータは元の平文と一致するはずです。この例では、OAEP(Optimal Asymmetric Encryption Padding)パディングスキームを使用しています。これは非対称鍵暗号化で一般的に使用されるパディング方式です。また、SHA256ハッシュ関数を使用していますが、他のハッシュ関数を選択することもできます。

まとめ

非対称鍵暗号化は、データの機密性を確保するだけでなく、デジタル署名などのセキュリティメカニズムにも広く使用されます。cryptographyライブラリを使用すれば、Pythonで簡単かつ安全に非対称鍵暗号化を実装できます。以上が、Pythonで非対称鍵暗号化を実装する方法の詳細な説明です。

pydocument.hatenablog.com

pydocument.hatenablog.com

pydocument.hatenablog.com

pydocument.hatenablog.com