Pythonのcryptographyとは?暗号化・復号を実装できるライブラリの使い方を解説

Pythonで暗号化や電子署名などのセキュリティ機能を実装する際に、 よく利用されるライブラリの一つが「cryptography」です。

cryptographyは、Pythonから暗号化・復号、ハッシュ、電子署名、 鍵の生成などを扱えるライブラリです。Webアプリケーションのデータ保護や API通信など、さまざまな用途で利用されています。

cryptography Pythonとは?

Pythonの「cryptography」は、暗号技術をPythonプログラムから利用するためのライブラリです。

標準ライブラリだけでは扱いにくい暗号処理を、比較的シンプルなコードで実装できます。

主に次のような用途で使われます。

  • データの暗号化・復号
  • 秘密鍵・公開鍵の生成
  • 電子署名
  • ハッシュ値の計算
  • パスワード関連の処理
  • TLSなどで利用される暗号技術
  • APIやWebサービスのデータ保護

Pythonで機密データを暗号化したい場合、cryptographyを利用することで、 暗号アルゴリズムを直接実装する必要がなくなります。

Python cryptographyのインストール方法

cryptographyはpipでインストールできます。

pip install cryptography

Python 3を明示する環境では、次のようにする場合もあります。

pip3 install cryptography

インストール後、Pythonから読み込めるか確認します。

import cryptography

print(cryptography.__version__)

バージョンが表示されれば、基本的なインストールは完了です。

仮想環境でインストールするのがおすすめ

Pythonでは、プロジェクトごとに仮想環境を作成してライブラリを管理する方法が一般的です。

例えば、次のコマンドで仮想環境を作成します。

python3 -m venv .venv

macOSやLinuxの場合は、次のように仮想環境を有効化します。

source .venv/bin/activate

Windowsの場合は次のコマンドを使用します。

.venv\Scripts\activate

その後、以下を実行します。

pip install cryptography

cryptographyでできること

cryptographyには、「Fernet」のような高水準APIから、 より細かな暗号処理を行うためのAPIまで用意されています。

代表的な機能は以下のとおりです。

機能 用途
Fernet データの暗号化・復号
AES 共通鍵暗号
RSA 公開鍵暗号・電子署名
SHA-256 ハッシュ値の計算
PBKDF2 パスワードから鍵を生成
Ed25519 電子署名
X.509 証明書の処理

特に初心者が最初に学ぶなら、比較的扱いやすいFernetがおすすめです。

cryptographyのFernetとは?

Fernetは、Pythonでデータを比較的簡単に暗号化・復号できる仕組みです。

例えば、次のように利用できます。

from cryptography.fernet import Fernet

key = Fernet.generate_key()

f = Fernet(key)

message = b"Hello Python"

encrypted = f.encrypt(message)

print(encrypted)

これでmessageが暗号化されます。

暗号化したデータを復号するには、同じ鍵を使います。

decrypted = f.decrypt(encrypted)

print(decrypted)

結果は次のようになります。

b'Hello Python'

cryptographyで暗号化する基本的な流れ

暗号化の基本的な考え方は、「平文を暗号化して暗号文に変換し、 必要に応じて復号して元のデータに戻す」というものです。

平文 → 暗号化 → 暗号文 → 復号 → 平文

Pythonでは次のように実装できます。

from cryptography.fernet import Fernet

# 鍵を生成
key = Fernet.generate_key()

# 暗号化オブジェクトを作成
cipher = Fernet(key)

# 暗号化
message = "秘密のメッセージ"
encrypted = cipher.encrypt(message.encode())

print("暗号文:", encrypted)

# 復号
decrypted = cipher.decrypt(encrypted)

print("復号:", decrypted.decode())

ポイントは、文字列をそのまま暗号化するのではなく、 encode()によってバイト列に変換していることです。

cryptographyの鍵を保存する方法

暗号化では「鍵の管理」が非常に重要です。

例えば、次のように生成した鍵をプログラム内に直接記述する方法はおすすめできません。

key = Fernet.generate_key()

特に秘密鍵をソースコードへ直接記述すると、GitHubなどに公開してしまうリスクがあります。

実際のシステムでは、環境変数や秘密情報管理サービスなどを利用して鍵を管理します。

例えば環境変数から取得する方法です。

import os
from cryptography.fernet import Fernet

key = os.environ["FERNET_KEY"]

cipher = Fernet(key)

cryptographyでAESを使う

cryptographyではAESなどの暗号アルゴリズムも利用できます。

AESは代表的な共通鍵暗号方式です。 共通鍵暗号では、基本的に暗号化と復号で同じ秘密鍵を使用します。

秘密鍵 → 暗号化 → 暗号文 → 復号 → 元のデータ

ただし、AESを低レベルAPIで直接扱う場合には、鍵だけでなく、 IVやnonce、認証タグなどの扱いも重要になります。

そのため、初心者が「データを安全に暗号化したい」という目的であれば、 独自にAESの処理を組み立てるより、用途に適した高水準APIを使うほうが安全です。

cryptographyでハッシュ値を計算する

cryptographyではハッシュ関数も扱えます。 代表的なものがSHA-256です。

from cryptography.hazmat.primitives import hashes

digest = hashes.Hash(hashes.SHA256())

digest.update(b"Hello Python")

result = digest.finalize()

print(result.hex())

ハッシュは暗号化とは異なります。

暗号化では、基本的に次のような処理を想定します。

データ → 暗号文 → 復号 → データ

一方、ハッシュは次のような一方向の変換です。

データ → ハッシュ値

そのため、SHA-256でハッシュ化したデータを元の文章に戻すことはできません。

パスワードをSHA-256でハッシュ化すればいい?

パスワード保存では、単純にSHA-256を適用するだけでは不十分です。

パスワード保存には、PBKDF2、Argon2、scryptなど、 パスワード向けのハッシュ・鍵導出方式を利用する方法があります。

例えば、cryptographyではPBKDF2を利用できます。

from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

パスワード処理では、次のような要素を考慮する必要があります。

  • ソルト
  • 適切な反復回数
  • 安全なアルゴリズム
  • 鍵や認証情報の管理

Webアプリケーションでユーザーのパスワードを保存する場合は、 フレームワークが提供するパスワードハッシュ機能を優先して利用するのが基本です。

cryptographyでRSAを使う

cryptographyではRSAも扱えます。 RSAは公開鍵暗号方式の代表例です。

公開鍵と秘密鍵の2つを使用します。

  • 公開鍵:他者に公開できる鍵
  • 秘密鍵:所有者が秘密に管理する鍵

RSAの鍵を生成する例です。

from cryptography.hazmat.primitives.asymmetric import rsa

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

public_key = private_key.public_key()

このコードではRSAの秘密鍵を生成し、その秘密鍵から公開鍵を取得しています。

公開鍵暗号と共通鍵暗号の違い

cryptographyを理解するためには、共通鍵暗号と公開鍵暗号の違いを理解しておくとよいでしょう。

項目 共通鍵暗号 公開鍵暗号
基本的に同じ鍵 公開鍵・秘密鍵
代表例 AES RSA
処理速度 高速 比較的遅い
大量データ 得意 不向き
鍵交換 課題になる 公開鍵を利用できる
電子署名 基本的に別方式 利用可能

実際のシステムでは、共通鍵暗号と公開鍵暗号を組み合わせて利用することも一般的です。

cryptographyで電子署名を実装する

cryptographyでは電子署名も扱えます。 例えばRSAによる署名を次のように作成できます。

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

signature = private_key.sign(
    b"Hello Python",
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

署名を検証する場合は公開鍵を利用します。

public_key.verify(
    signature,
    b"Hello Python",
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

電子署名を利用すると、データが正しい送信者によって署名されたか、 また署名後に内容が変更されていないかを確認できます。

cryptographyを使うときの注意点

cryptographyは強力なライブラリですが、 ライブラリを使えば自動的に安全になるわけではありません。

特に重要なのが鍵管理です。

秘密鍵をソースコードに書かない

次のようなコードは避けましょう。

SECRET_KEY = "秘密の鍵"

ソースコードやGitリポジトリに秘密鍵を保存すると、 第三者に漏洩する可能性があります。

暗号アルゴリズムを自作しない

独自の暗号方式を考えて実装することはおすすめできません。

暗号技術では、アルゴリズムだけでなく次のような要素も適切に扱う必要があります。

  • 鍵の生成
  • nonce
  • IV
  • パディング
  • 認証
  • 鍵管理
  • 安全な乱数

そのため、実績のある暗号方式とライブラリを利用することが重要です。

cryptographyとhashlibの違い

Pythonには標準ライブラリのhashlibもあります。

例えばSHA-256なら、次のように書けます。

import hashlib

result = hashlib.sha256(b"Hello Python").hexdigest()

print(result)

一方、cryptographyはハッシュだけでなく、 暗号化、復号、公開鍵暗号、電子署名、鍵導出、証明書など、 より幅広い暗号技術を扱えます。

そのため、単純なハッシュ計算ならhashlib、 より高度な暗号処理ならcryptographyと考えると分かりやすいでしょう。

cryptographyは初心者にもおすすめ?

Pythonを学習している初心者が、いきなり暗号アルゴリズムの内部実装まで理解する必要はありません。

まずは次の基本概念を理解しましょう。

  1. 暗号化とは何か
  2. 復号とは何か
  3. 共通鍵暗号とは何か
  4. 公開鍵暗号とは何か
  5. ハッシュとは何か
  6. 電子署名とは何か
  7. 鍵を安全に管理するにはどうするか

そのうえで、cryptographyのFernetなどを使って 簡単な暗号化プログラムを作ると理解しやすくなります。

cryptography Pythonの学習におすすめのサンプル

最初は次のような小さなプログラムを作ってみるとよいでしょう。

from cryptography.fernet import Fernet

# 鍵を生成
key = Fernet.generate_key()

# 暗号化オブジェクトを作成
cipher = Fernet(key)

# 暗号化
message = "Pythonを学習しています"
encrypted = cipher.encrypt(message.encode())

print("暗号化:", encrypted)

# 復号
decrypted = cipher.decrypt(encrypted)

print("復号:", decrypted.decode())

このコードだけでも、 鍵の生成 → 暗号化 → 暗号文 → 復号 という暗号処理の基本的な流れを体験できます。

cryptography Pythonでよくある質問

cryptographyとは何ですか?

Pythonから暗号化、復号、ハッシュ、電子署名、公開鍵暗号などを利用するためのライブラリです。

cryptographyはPython標準ライブラリですか?

いいえ。標準ライブラリではないため、通常はpipなどを使ってインストールします。

pip install cryptography

cryptographyとCryptoは同じですか?

同じものではありません。

Pythonの暗号関連ライブラリには複数の選択肢があります。 cryptographyは広く利用されている暗号ライブラリの一つです。

cryptographyでAESを使えますか?

はい。AESをはじめとした暗号アルゴリズムを利用できます。

ただし、低レベルAPIを使う場合は暗号方式だけでなく、 nonceやIV、認証などについても正しく設計する必要があります。

cryptographyでパスワードを暗号化できますか?

技術的には暗号化できますが、ユーザーのパスワードを保存する目的なら、 通常は「復号できる暗号化」ではなく、パスワード専用のハッシュ・鍵導出方式を利用します。

まとめ:Pythonの暗号処理ならcryptographyを活用しよう

Pythonのcryptographyは、暗号化・復号、ハッシュ、 公開鍵暗号、電子署名などを扱える重要なライブラリです。

特に覚えておきたいポイントは次のとおりです。

  • cryptographyはPython向けの暗号ライブラリ
  • pipでインストールできる
  • Fernetを使うと比較的簡単に暗号化・復号を体験できる
  • AESなどの共通鍵暗号を利用できる
  • RSAなどの公開鍵暗号を利用できる
  • SHA-256などのハッシュ処理にも対応している
  • 電子署名も実装できる
  • 秘密鍵を安全に管理することが重要
  • 独自の暗号方式を実装するのは避ける

PythonでWebアプリケーションやAPI、データ処理などを開発する場合、 セキュリティを考える機会は少なくありません。

まずはFernetによる簡単な暗号化・復号から始め、 AES、RSA、ハッシュ、電子署名へと学習範囲を広げていくと、 Pythonにおける暗号技術を理解しやすくなります。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら