RSA暗号は、公開鍵暗号方式の一つであり、安全なデータ通信を可能にするための主要な技術です。この教材では、RSA暗号の基本構造を理解し、Pythonを用いてその実装方法を学びます。
RSA暗号は以下の3つの主要なステップから成り立っています。
鍵の生成には、以下の手順が含まれます。
暗号化: メッセージ ( m ) を暗号化するには、次の式を使用します。 [ c = m^e \mod n ]
復号化: 暗号文 ( c ) を復号化するには、次の式を使用します。 [ m = c^d \mod n ]
以下に、RSA暗号を実装するためのPythonコードを示します。コードは鍵の生成、暗号化、復号化の各ステップを含みます。
import random
from sympy import isprime, mod_inverse
def generate_prime_candidate(length):
"""指定されたビット長の素数候補を生成する"""
p = random.getrandbits(length)
return p | (1 << length - 1) | 1 # 最上位ビットと最下位ビットを1にする
def generate_prime_number(length):
"""指定されたビット長の素数を生成する"""
p = 4
while not isprime(p):
p = generate_prime_candidate(length)
return p
def generate_keypair(length):
"""公開鍵と秘密鍵を生成する"""
p = generate_prime_number(length)
q = generate_prime_number(length)
n = p * q
phi = (p - 1) * (q - 1)
e = 65537 # よく使われる公開指数
d = mod_inverse(e, phi)
return ((e, n), (d, n)) # 公開鍵と秘密鍵を返す
def encrypt(public_key, plaintext):
"""メッセージを暗号化する"""
e, n = public_key
cipher = [pow(ord(char), e, n) for char in plaintext]
return cipher
def decrypt(private_key, ciphertext):
"""暗号文を復号化する"""
d, n = private_key
plain = [chr(pow(char, d, n)) for char in ciphertext]
return ''.join(plain)
# 鍵の生成
public_key, private_key = generate_keypair(8) # 8ビットの素数を生成
print("公開鍵:", public_key)
print("秘密鍵:", private_key)
# メッセージの暗号化
message = "HELLO"
ciphertext = encrypt(public_key, message)
print("暗号文:", ciphertext)
# メッセージの復号化
decrypted_message = decrypt(private_key, ciphertext)
print("復号化されたメッセージ:", decrypted_message)
素数候補の生成: generate_prime_candidate
関数は、指定されたビット長の素数候補を生成します。最上位ビットと最下位ビットを1にすることで、偶数を排除します。
素数の生成: generate_prime_number
関数は、素数候補を生成し、それが素数であることを確認します。
鍵の生成: generate_keypair
関数は、公開鍵と秘密鍵を生成します。公開指数として65537を使用し、秘密指数はモジュラ逆数を用いて計算します。
暗号化: encrypt
関数は、公開鍵を使用して平文を暗号化します。各文字をASCIIコードに変換し、公開鍵の指数でべき乗してモジュラ演算を行います。
復号化: decrypt
関数は、秘密鍵を使用して暗号文を復号化します。暗号文の各整数を秘密鍵の指数でべき乗し、再び文字に変換します。
このコードを実行することで、RSA暗号の基本的な動作を体験できます。ビット長を変更することで、鍵の強度を調整することも可能です。