はじめに
RSA暗号は、公開鍵暗号方式の代表的なアルゴリズムです。データの暗号化と復号化を非対称な鍵(公開鍵と秘密鍵)を用いて行います。
本記事では、PythonのライブラリPyCryptodomeを用いて、RSA暗号化・復号化を実装する方法を紹介します。
RSA暗号とは
1977年、当時MITにいた3人の研究者リベスト(R.L.Rivest)、シャミア(A.Shamir)、エイドルマン(L.Adleman)により発表された公開鍵暗号方式で、次のような特徴があります。
- 公開鍵と秘密鍵を利用してデータの暗号化と復号化を行う
- 公開鍵は暗号化に、秘密鍵は復号化に使用される
- 大きな素因数を使った数字的な問題(素因数分解)を利用することで高いセキュリティを確保する
これにより、安全な通信を実現することが可能です。例えば、webサイトのSSL/TLS通信や電子署名など。様々分野で利用されています。
必要なライブラリ
今回のプログラムでは、PyCryptodomeというライブラリを使用します。インストールは以下のコマンドで行えます。
pip install pycryptodome
実装の概要
今回のプログラムでは、以下の処理を行います。
- RSA鍵のペアの作成
- メッセージの暗号化(公開鍵を使用)
- メッセージの復号化(秘密鍵を使用)
コード全体
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が復号化に使用される秘密鍵です。
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進文字列に変換しています。
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()関数では、秘密鍵を用いて暗号化されたメッセージを復号化しています。復号化後、元のメッセージが再現されます。
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暗号はセキュリティ分野で重要なアルゴリズムです。応用として、電子署名や安全な通信プロトコルの理解に役立つので、応用してみてください。
最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください!
参考資料