Pythonで公開鍵と秘密鍵を生成する方法

Pythonでの公開鍵と秘密鍵の生成について解説します。この記事では、Pythonでどのように公開鍵と秘密鍵を生成するか、それらの鍵がどのように動作するのか、さらには応用例まで詳しく説明します。

目次

公開鍵と秘密鍵とは

公開鍵暗号方式では、2つの鍵、すなわち公開鍵と秘密鍵が用いられます。公開鍵は暗号化に使用され、誰でも見ることができます。一方、秘密鍵は復号(暗号文を元に戻す作業)に使用され、この鍵は秘密に保たれる必要があります。

公開鍵の特性

公開鍵は以下の特性を持ちます。

  • 暗号化に使用される
  • 外部に公開される
  • 秘密鍵から生成される場合もある

秘密鍵の特性

秘密鍵は以下の特性を持ちます。

  • 復号に使用される
  • 厳重に管理される
  • 公開鍵と対になる

Pythonでの公開鍵と秘密鍵の生成

Pythonでは、`cryptography`というライブラリを用いて非常に簡単に公開鍵と秘密鍵を生成することができます。

環境の準備

まずは`cryptography`ライブラリをインストールしましょう。

# cryptography ライブラリのインストール
pip install cryptography

基本的なコード例

次に基本的なコードを示します。

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

# 鍵の生成
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

# 秘密鍵の保存
with open("private_key.pem", "wb") as f:
    f.write(private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    ))

# 公開鍵の保存
public_key = private_key.public_key()
with open("public_key.pem", "wb") as f:
    f.write(public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    ))

このコードは、2048ビットのRSA秘密鍵を生成し、それをPEM形式で保存しています。また、その秘密鍵から公開鍵を生成し、それもPEM形式で保存しています。

応用例

SSH鍵ペアの生成

SSH接続に使用する鍵ペアもPythonで生成することが可能です。

# SSH鍵ペアの生成
from cryptography.hazmat.primitives import serialization as crypto_serialization
from cryptography.hazmat.primitives import serialization

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

private_key_pem = private_key.private_bytes(
    crypto_serialization.Encoding.PEM,
    crypto_serialization.PrivateFormat.PKCS8,
    crypto_serialization.NoEncryption()
)

public_key = private_key.public_key()
public_key_pem = public_key.public_bytes(
    crypto_serialization.Encoding.OpenSSH,
    crypto_serialization.PublicFormat.OpenSSH
)

with open('ssh_private_key.pem', 'wb') as f:
    f.write(private_key_pem)

with open('ssh_public_key.pem', 'wb') as f:
    f.write(public_key_pem)

暗号化と復号のサンプル

公開鍵で暗号化し、秘密鍵で復号する基本的な例です。

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

# メッセージの暗号化
message = b"this is a secret message"
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.decode('utf-8'))  # Output: "this is a secret message"

まとめ

Pythonで公開鍵と秘密鍵を生成する方法について解説しました。`cryptography`ライブラリを使えば、これらの操作は非常に簡単です。セキュリティが重要なシステムを構築する際に、この知識が役立つでしょう。

コメント

コメントする

目次