フッターコンテンツにスキップ
PYTHONヘルプ

Pythonで暗号化にPyCryptodomeを使用する

デジタルトランスフォーメーションの時代において、堅牢な暗号化メカニズムの重要性は言うまでもありません。 暗号化は、データがさまざまなネットワークやシステムを通過する際のセキュリティとプライバシーを保証します。 PyCryptodomeは、暗号化の分野で際立ったPythonライブラリであり、認証付き暗号化モード(GCM、CCM、EAX、SIV、OCB)や、第一級のサポート付きの高速AESを含む多くの機能を提供し、安全なデータ処理を促進します。 この記事では、PyCryptodomeの最新公式バージョンを掘り下げ、その機能、ユースケース、簡単なインストールプロセス、およびさまざまなアプリケーションでの効果的な活用方法を探索します。 また、C#の別のライブラリであるIronPDFとPyCryptodomeを使用して暗号化されたPDFファイルを作成します。

PyCryptodomeの概要

PyCryptodomeは、低レベルの暗号化プリミティブを含む自己完結型のPythonパッケージです。 これは、古いPyCryptoライブラリの置換として設計され、多くの制約を解決し、その能力を拡張しました。 広範な暗号化アルゴリズムやプロトコルが提供されており、アプリケーションにセキュリティ機能を実装する必要がある開発者にとって貴重なツールです。

主要機能

  1. 幅広いアルゴリズムサポート: PyCryptodomeは、AES、RSA、DSAなどを含む幅広い暗号化アルゴリズムをサポートしています。 この広範なサポートにより、開発者はさまざまな暗号化ニーズに必要なツールを見つけることができます。
  2. 使いやすさ: ライブラリは使いやすさを考えた設計となっており、限定的な暗号知識を持つ人でも効果的にセキュリティ機能を実装できるクリアで簡潔なAPIを備えています。
  3. 積極的なメンテナンス: その前身であるPyCryptoとは異なり、PyCryptodomeは積極的にメンテナンスされており、定期的な更新と改善があります。これにより、最新のPythonバージョンおよびセキュリティ標準に互換性があります。
  4. 自己完結型: PyCryptodomeは外部依存関係を必要としないため、さまざまな環境で簡単にインストールして使用できます。
  5. 既存ライブラリとの統合: PyCryptodomeは他のPythonライブラリやフレームワークとシームレスに統合でき、さまざまなアプリケーションでそのユーティリティを高めます。

インストール

PyCryptodomeのインストールは、その自己完結型の性質のおかげで簡単なプロセスです。 Pythonのパッケージインストーラーであるpipを使用して次のコマンドでインストールできます:

pip install pycryptodome
pip install pycryptodome
SHELL

コアコンセプトとモジュール

PyCryptodomeは暗号化のさまざまな側面に対応する複数のモジュールに整理されています。 これらのモジュールを理解することは、ライブラリを効果的に活用するために重要です。

ハッシング

ハッシュ関数は暗号化の基本であり、任意のデータから固定サイズのハッシュ値を生成する方法を提供します。 PyCryptodomeはCrypto.Hashモジュールを通じてさまざまなハッシュアルゴリズムをサポートします。

SHA-256ハッシュ関数の使用例

from Crypto.Hash import SHA256

# Create a new SHA-256 hash object
hash_object = SHA256.new(data=b'Hello, PyCryptodome!')

# Output the hexadecimal digest of the hash
print(hash_object.hexdigest())
from Crypto.Hash import SHA256

# Create a new SHA-256 hash object
hash_object = SHA256.new(data=b'Hello, PyCryptodome!')

# Output the hexadecimal digest of the hash
print(hash_object.hexdigest())
PYTHON

PyCryptodome (開発者向けの働き方): 図1 - ハッシュ出力

対称暗号化

対称暗号化には、暗号化と復号化の両方に同じ鍵が使用されます。 PyCryptodomeのCrypto.Cipherモジュールは、AES、DESなどを含むいくつかの対称暗号をサポートしています。

AESの暗号化と復号化の例

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

# Generate a random AES key
key = get_random_bytes(16)  # 16 bytes for AES-128

# Create a new AES cipher in EAX mode for encryption
cipher = AES.new(key, AES.MODE_EAX)
data = b'Secret Message'

# Encrypt the data and get the nonce, ciphertext and tag
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(data)

# Create a new AES cipher in EAX mode for decryption
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
plaintext = cipher.decrypt(ciphertext)

# Verify the authenticity of the message
try:
    cipher.verify(tag)
    print("The message is authentic:", plaintext)
except ValueError:
    print("Key incorrect or message corrupted")
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# Generate a random AES key
key = get_random_bytes(16)  # 16 bytes for AES-128

# Create a new AES cipher in EAX mode for encryption
cipher = AES.new(key, AES.MODE_EAX)
data = b'Secret Message'

# Encrypt the data and get the nonce, ciphertext and tag
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(data)

# Create a new AES cipher in EAX mode for decryption
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
plaintext = cipher.decrypt(ciphertext)

# Verify the authenticity of the message
try:
    cipher.verify(tag)
    print("The message is authentic:", plaintext)
except ValueError:
    print("Key incorrect or message corrupted")
PYTHON

PyCryptodome (開発者向けの働き方): 図2 - AES出力

非対称暗号化

非対称暗号化には、暗号化用の公開鍵と復号化用のプライベート鍵のペアが使用されます。 PyCryptodomeのCrypto.PublicKeyモジュールは、RSA、DSA、ECC(楕円曲線暗号)をサポートします。

RSAの暗号化と復号化の例

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

# Generate an RSA key pair
key = RSA.generate(2048)
public_key = key.publickey()

# Encrypt the message using the public key
cipher = PKCS1_OAEP.new(public_key)
ciphertext = cipher.encrypt(b'Secret Message')

# Decrypt the message using the private key
cipher = PKCS1_OAEP.new(key)
plaintext = cipher.decrypt(ciphertext)
print(plaintext)
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

# Generate an RSA key pair
key = RSA.generate(2048)
public_key = key.publickey()

# Encrypt the message using the public key
cipher = PKCS1_OAEP.new(public_key)
ciphertext = cipher.encrypt(b'Secret Message')

# Decrypt the message using the private key
cipher = PKCS1_OAEP.new(key)
plaintext = cipher.decrypt(ciphertext)
print(plaintext)
PYTHON

PyCryptodome (開発者向けの働き方): 図3 - RSA出力

鍵導出

鍵導出関数は、パスワードやパスフレーズから暗号化鍵を生成します。 これはパスワードベースの暗号化で特に役立ちます。 PyCryptodomeはPBKDF2、scrypt、その他の鍵導出アルゴリズムをサポートします。

PBKDF2の使用例

from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes

# Define a password and generate a salt
password = b'my secret password'
salt = get_random_bytes(16)

# Derive a key from the password and salt using PBKDF2
key = PBKDF2(password, salt, dkLen=32, count=1000000)
print(key)
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes

# Define a password and generate a salt
password = b'my secret password'
salt = get_random_bytes(16)

# Derive a key from the password and salt using PBKDF2
key = PBKDF2(password, salt, dkLen=32, count=1000000)
print(key)
PYTHON

PyCryptodome (開発者向けの働き方): 図4 - PBKDF2出力

ユースケース

パスワード管理

パスワードマネージャは、ユーザーパスワードを安全に保存および取得するためにPyCryptodomeの鍵導出関数を利用します。 PBKDF2のような強力な鍵導出アルゴリズムを使用することにより、開発者は保存されたパスワードが総当たり攻撃に対して耐性があることを確保できます。

パスワードのセキュリティ確保に関する例

from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES

# Derive a strong key from a password
password = b'user_password'
salt = get_random_bytes(16)
key = PBKDF2(password, salt, dkLen=32, count=1000000)

# Encrypt the password before storing
cipher = AES.new(key, AES.MODE_EAX)
stored_password = b'ActualPassword'
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(stored_password)

# Store ciphertext, nonce, salt, and tag securely
password_data = {
    'ciphertext': ciphertext,
    'nonce': nonce,
    'salt': salt,
    'tag': tag
}

# Decrypt the password when needed
key = PBKDF2(password, password_data['salt'], dkLen=32, count=1000000)
cipher = AES.new(key, AES.MODE_EAX, nonce=password_data['nonce'])
plaintext = cipher.decrypt(password_data['ciphertext'])

# Verify the authenticity of the password
try:
    cipher.verify(password_data['tag'])
    print("The stored password is authentic:", plaintext)
except ValueError:
    print("Key incorrect or password corrupted")
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES

# Derive a strong key from a password
password = b'user_password'
salt = get_random_bytes(16)
key = PBKDF2(password, salt, dkLen=32, count=1000000)

# Encrypt the password before storing
cipher = AES.new(key, AES.MODE_EAX)
stored_password = b'ActualPassword'
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(stored_password)

# Store ciphertext, nonce, salt, and tag securely
password_data = {
    'ciphertext': ciphertext,
    'nonce': nonce,
    'salt': salt,
    'tag': tag
}

# Decrypt the password when needed
key = PBKDF2(password, password_data['salt'], dkLen=32, count=1000000)
cipher = AES.new(key, AES.MODE_EAX, nonce=password_data['nonce'])
plaintext = cipher.decrypt(password_data['ciphertext'])

# Verify the authenticity of the password
try:
    cipher.verify(password_data['tag'])
    print("The stored password is authentic:", plaintext)
except ValueError:
    print("Key incorrect or password corrupted")
PYTHON

PyCryptodome (開発者向けの働き方): 図5 - パスワードセキュリティ出力

IronPDF for Python

IronPDFは、開発者がPDFドキュメントを簡単に作成、編集、および操作できる強力なPython用PDF生成ライブラリです。 HTMLをPDFに変換することから、複数のPDFを結合することまで、幅広い機能を提供しており、ドキュメントワークフローの自動化に最適な選択肢です。 PyCryptodomeとの組み合わせにより、暗号化やデジタル署名など、安全な機能をPDF文書に追加することができます。 この統合は、金融、法律、または機密環境など、高いセキュリティとデータの完全性を必要とするアプリケーションに特に役立ちます。

IronPDFのインストールには、Pythonのパッケージマネージャであるpipを使用できます。 開始方法は次のとおりです。

pip install ironpdf
pip install ironpdf
SHELL

PyCryptodome (開発者向けの働き方): 図6 - IronPDF

インストール後、IronPDFを使用してPDFを作成および操作することができます。 以下は、IronPDFを使用してPDFを作成し、次にPyCryptodomeを使用してそれを暗号化する例を示します:

from ironpdf import ChromePdfRenderer
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os

# Create a new PDF renderer
renderer = ChromePdfRenderer()

# Render a URL as a PDF and save it
pdfFromUrl = renderer.RenderUrlAsPdf("https://ironpdf.com/")
pdfFromUrl.SaveAs("output.pdf")

# Function to encrypt a file using AES
def encrypt_file(file_name, key):
    cipher = AES.new(key, AES.MODE_CBC)  # Use AES in CBC mode
    iv = cipher.iv
    with open(file_name, 'rb') as f:
        data = f.read()
    encrypted_data = iv + cipher.encrypt(pad(data, AES.block_size))
    with open(file_name + '.enc', 'wb') as f:
        f.write(encrypted_data)

# Example usage
key = os.urandom(16)  # AES key must be either 16, 24, or 32 bytes long
encrypt_file("output.pdf", key)
from ironpdf import ChromePdfRenderer
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os

# Create a new PDF renderer
renderer = ChromePdfRenderer()

# Render a URL as a PDF and save it
pdfFromUrl = renderer.RenderUrlAsPdf("https://ironpdf.com/")
pdfFromUrl.SaveAs("output.pdf")

# Function to encrypt a file using AES
def encrypt_file(file_name, key):
    cipher = AES.new(key, AES.MODE_CBC)  # Use AES in CBC mode
    iv = cipher.iv
    with open(file_name, 'rb') as f:
        data = f.read()
    encrypted_data = iv + cipher.encrypt(pad(data, AES.block_size))
    with open(file_name + '.enc', 'wb') as f:
        f.write(encrypted_data)

# Example usage
key = os.urandom(16)  # AES key must be either 16, 24, or 32 bytes long
encrypt_file("output.pdf", key)
PYTHON

このスクリプトは、IronPDFを使用してシンプルなPDFを作成し、PyCryptodomeのAESを使用して暗号化することで、より複雑で安全なPDFハンドリングアプリケーションを構築するための基盤を提供します。

PyCryptodome (開発者向けの働き方): 図7 - 暗号化ファイル出力

結論

結論として、PyCryptodomeは開発者のための暗号化操作を大幅に強化する強力で多様なPythonライブラリであり、アルゴリズムの幅広い選択肢とIronPDFのような他のツールとの簡単な統合を提供します。 認証暗号化モード、対称および非対称暗号化、ハッシュ化、および鍵導出のサポートを含む包括的な機能セットにより、PyCryptodomeは堅牢なセキュリティ対策を必要とする現代のアプリケーションのニーズに応えます。 その使いやすさ、積極的なメンテナンス、および自己完結型の性質により、さまざまなシナリオで安全なデータ処理を実装するための不可欠なツールとなり、パスワード管理から安全なドキュメント生成や暗号化に至るまで、デジタル世界でのデータの完全性と機密性を確保します。

IronPDFのライセンスに関する詳細は、IronPDFライセンスページを参照してください。 さらに探求するには、HTMLをPDFに変換するための徹底したチュートリアルをご覧ください。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。