<一覧に戻る

モジュラー演算の応用例

モジュラー演算は、特に数論や暗号理論において非常に重要な役割を果たしています。この教材では、モジュラー演算の基本とその応用例を学び、Pythonで実装してみます。

モジュラー演算とは?

モジュラー演算は、整数の除算の余りを計算する演算です。一般的には次のように表現されます。

a ≡ b (mod m)

これは「aはmで割った余りがbである」という意味です。たとえば、7 ≡ 2 (mod 5) というのは、7を5で割った余りが2であることを表します。

モジュラー演算の基本的な性質

モジュラー演算にはいくつかの重要な性質があります。

  1. 加法の性質:
  2. (a + b) mod m = [(a mod m) + (b mod m)] mod m
  3. 乗法の性質:
  4. (a * b) mod m = [(a mod m) * (b mod m)] mod m
  5. 減法の性質:
  6. (a - b) mod m = [(a mod m) - (b mod m)] mod m

これらの性質を利用して、さまざまな計算を効率的に行うことができます。

モジュラー演算の応用例

1. RSA暗号の基本構造

RSA暗号は、公開鍵暗号方式の一つで、モジュラー演算を利用しています。このアルゴリズムの基本的な流れは以下の通りです。

  1. 2つの素数pとqを選ぶ。
  2. n = p * qを計算する。
  3. φ(n) = (p-1)(q-1)を計算する。
  4. 公開鍵eを選ぶ(1 < e < φ(n)かつgcd(e, φ(n)) = 1)。
  5. 秘密鍵dを計算する(e * d ≡ 1 (mod φ(n)))。
  6. メッセージmを暗号化する: c ≡ m^e (mod n)。
  7. メッセージcを復号する: m ≡ c^d (mod n)。

このプロセスをPythonで実装してみましょう。

サンプルコード

以下のコードは、RSA暗号の基本構造を実装しています。

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):
    """RSAの鍵ペアを生成する関数"""
    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(plaintext, e, n)
    return cipher

def decrypt(private_key, ciphertext):
    """暗号文を復号する関数"""
    d, n = private_key
    plaintext = pow(ciphertext, d, n)
    return plaintext

# 鍵長を指定して鍵ペアを生成
public_key, private_key = generate_keypair(8)

# メッセージを暗号化
message = 42
ciphertext = encrypt(public_key, message)
print(f"暗号文: {ciphertext}")

# メッセージを復号
decrypted_message = decrypt(private_key, ciphertext)
print(f"復号されたメッセージ: {decrypted_message}")

コードの解説

  1. 素数生成:
  2. generate_prime_candidate: 指定したビット長の素数候補を生成します。
  3. generate_prime_number: 候補から素数を見つけるために、素数判定を行います。

  4. 鍵生成:

  5. generate_keypair: 鍵ペアを生成する関数です。2つの素数を生成し、それを使ってnとφ(n)を計算します。公開鍵eは一般的に65537を使用します。

  6. 暗号化と復号:

  7. encrypt: 公開鍵を使って平文を暗号化します。
  8. decrypt: 秘密鍵を使って暗号文を復号します。

このように、モジュラー演算はRSA暗号を構築する基盤となっています。このアルゴリズムにより、安全にデータをやり取りすることが可能になります。

まとめ

モジュラー演算は、さまざまな数学的アルゴリズムや暗号理論において重要な役割を果たしています。特にRSA暗号のような公開鍵暗号方式では、モジュラー演算を用いて安全な通信を実現しています。Pythonを使ってこのようなアルゴリズムを実装することで、モジュラー演算の理解を深めることができます。

出力結果: