1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでRSA暗号化・復号化実装する方法[PyCryptodome]

Last updated at Posted at 2025-02-13

はじめに

RSA暗号は、公開鍵暗号方式の代表的なアルゴリズムです。データの暗号化と復号化を非対称な鍵(公開鍵と秘密鍵)を用いて行います。
本記事では、PythonのライブラリPyCryptodomeを用いて、RSA暗号化・復号化を実装する方法を紹介します。

RSA暗号とは

1977年、当時MITにいた3人の研究者リベスト(R.L.Rivest)、シャミア(A.Shamir)、エイドルマン(L.Adleman)により発表された公開鍵暗号方式で、次のような特徴があります。

  • 公開鍵と秘密鍵を利用してデータの暗号化と復号化を行う
  • 公開鍵は暗号化に、秘密鍵は復号化に使用される
  • 大きな素因数を使った数字的な問題(素因数分解)を利用することで高いセキュリティを確保する

これにより、安全な通信を実現することが可能です。例えば、webサイトのSSL/TLS通信や電子署名など。様々分野で利用されています。

必要なライブラリ

今回のプログラムでは、PyCryptodomeというライブラリを使用します。インストールは以下のコマンドで行えます。

pip install pycryptodome

実装の概要

今回のプログラムでは、以下の処理を行います。

  1. RSA鍵のペアの作成
  2. メッセージの暗号化(公開鍵を使用)
  3. メッセージの復号化(秘密鍵を使用)

コード全体

Rsa.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii

# 鍵ペアを生成
def generate_keys():
    key = RSA.generate(2048)
    private_key = key.export_key()
    public_key = key.publickey().export_key()
    return private_key, public_key

# 公開鍵でメッセージを暗号化
def encrypt_message(public_key, message):
    key = RSA.import_key(public_key)
    cipher = PKCS1_OAEP.new(key)
    encrypted_message = cipher.encrypt(message.encode())
    return binascii.hexlify(encrypted_message).decode()

# 秘密鍵でメッセージを復号化
def decrypt_message(private_key, encrypted_message):
    key = RSA.import_key(private_key)
    cipher = PKCS1_OAEP.new(key)
    decrypted_message = cipher.decrypt(binascii.unhexlify(encrypted_message))
    return decrypted_message.decode()

# メイン処理
# 鍵ペアの生成
private_key, public_key = generate_keys()

# メッセージの暗号化
message = "Hello, RSA!"
encrypted = encrypt_message(public_key, message)
print(f"暗号化されたメッセージ: {encrypted}")

# メッセージの復号化
decrypted = decrypt_message(private_key, encrypted)
print(f"復号化されたメッセージ: {decrypted}")

プログラムの説明

1.RSA鍵ペアの生成

generate_keys()関数では、2048ビットのRSA鍵ペアを生成しています。public_keyが暗号化に使用される公開鍵、private_keyが復号化に使用される秘密鍵です。

Rsa.py
def generate_keys():
    key = RSA.generate(2048)
    private_key = key.export_key()
    public_key = key.publickey().export_key()
    return private_key, public_key

2.メッセージの暗号化

encrypt_message()関数では、PKCS1_OAEPアルゴリズムを使用して公開鍵でメッセージを暗号化しています。暗号化されたメッセージはバイナリデータであるため、binasciiを用いて16進文字列に変換しています。

Rsa.py
def encrypt_message(public_key, message):
    key = RSA.import_key(public_key)
    cipher = PKCS1_OAEP.new(key)
    encrypted_message = cipher.encrypt(message.encode())
    return binascii.hexlify(encrypted_message).decode()

3.メッセージの復号化

decrypt_message()関数では、秘密鍵を用いて暗号化されたメッセージを復号化しています。復号化後、元のメッセージが再現されます。

Rsa.py
def decrypt_message(private_key, encrypted_message):
    key = RSA.import_key(private_key)
    cipher = PKCS1_OAEP.new(key)
    decrypted_message = cipher.decrypt(binascii.unhexlify(encrypted_message))
    return decrypted_message.decode()

実行結果

暗号化されたメッセージ: 8f4b91c43e4b6f2db3b4b...
復号化されたメッセージ: Hello, RSA!

まとめ

本記事では、PythonのPyCryptodomeライブラリを使用してRSA暗号化・復号化を実装しました。RSA暗号はセキュリティ分野で重要なアルゴリズムです。応用として、電子署名や安全な通信プロトコルの理解に役立つので、応用してみてください。
最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください!

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?