素数とRSA暗号の仕組み|計算例で学ぶ公開鍵・電子署名・TLSの基本
素数は、数学の問題だけでなく、情報を守る暗号技術にも関わっています。代表例がRSAで、大きな整数の素因数分解が難しいことが、その安全性を考える重要な土台になっています。
ただし、「すべての暗号が素数で守られている」「十分に大きな素数を使えば絶対に解読されない」という理解は正確ではありません。暗号の方式に加えて、鍵の生成・管理、実装、通信の仕組みも安全性を左右します。
この記事では、小さな数によるRSAの計算例から出発し、暗号化と電子署名の違い、HTTPSを支えるTLS、量子コンピューターに備える耐量子暗号までを整理します。
目次
素数と暗号にはどのような関係がある?
素数とは、1より大きい自然数のうち、正の約数が1と自分自身だけである数です。2、3、5、7、11などが該当し、1は素数に含みません。
RSAでは、異なる大きな素数を掛け合わせて作った整数を利用します。掛け算は効率よく計算できますが、積だけから元の素数を探す素因数分解は、数の大きさや選び方によって非常に難しくなります。
「掛けること」と「元に戻すこと」の難しさは違う
例えば、3と11を掛けると33になります。33ならすぐに素因数分解できますが、適切に選んだ非常に大きな素数の積では、同じように簡単には元の素数を求められません。
ただし、これは「逆の計算が数学的に不可能」という意味ではありません。利用できる計算機や既知の攻撃手法を前提に、解くために必要な計算量を評価している点が重要です。
すべての暗号が素因数分解に依存するわけではない
暗号には複数の方式があり、安全性の根拠も異なります。RSAを理解したうえで、ほかの方式まで同じ仕組みだと考えないようにしましょう。
| 方式・技術 | 主な役割 | RSAとの違い |
|---|---|---|
| RSA | 公開鍵暗号による暗号化や電子署名 | 大きな整数の素因数分解の難しさが重要な土台になる |
| AES | 共通鍵によるデータの暗号化 | RSAとは異なる構造で、素因数分解を安全性の根拠にしない |
| 楕円曲線を使う暗号技術 | 鍵共有や電子署名 | 楕円曲線上の離散対数問題などを利用する |
| 耐量子暗号 | 量子計算による攻撃を考慮した鍵共有や電子署名 | 格子やハッシュ関数など、方式ごとに異なる構成を用いる |
公開鍵と秘密鍵の役割|暗号化と電子署名を区別する
公開鍵暗号では、公開して利用してもらう「公開鍵」と、所有者が厳重に管理する「秘密鍵」を使います。RSAには暗号化の方式と電子署名の方式がありますが、それぞれ目的が異なります。
| 用途 | 鍵の使い方 | 目的 |
|---|---|---|
| 暗号化 | 受信者の公開鍵で暗号化し、受信者の秘密鍵で復号する | 通信内容などを第三者に読まれにくくする |
| 電子署名 | 署名者の秘密鍵で署名を作り、対応する公開鍵で検証する | データの改ざんや、署名に使われた鍵の対応関係を確認する |
電子署名そのものは、文書の内容を隠す機能ではありません。また、「秘密鍵で暗号化するだけ」と理解すると、実際の署名方式に必要な処理を見落としてしまいます。
公開鍵が誰のものかを確認することも必要です。第三者の鍵にすり替えられると困るため、実際の通信では証明書などの仕組みと組み合わせて利用します。
小さな数でRSAの計算を体験する
ここでは、計算の流れを確認するために、小さな素数3と11を使います。安全な暗号の実装例ではなく、数学的な仕組みを学ぶための例です。
式に出てくる「mod」は、割り算の余りを表します。例えば「128 mod 33」は、128を33で割った余りである29です。
1.2つの素数からNを作る
異なる素数をp=3、q=11とし、その積をNとします。続いて、今回の鍵の計算に使う値として、φ(N)=(p−1)(q−1)を求めます。
$$ \begin{aligned} p &= 3,\quad q = 11 \\ N &= pq = 33 \\ \varphi(N) &= (p-1)(q-1) = 20 \end{aligned} $$
2.公開する数eと秘密にする数dを決める
eは、20と互いに素になる数から選びます。「互いに素」とは、最大公約数が1という意味で、ここではe=7とします。
次に、eとdを掛けて20で割った余りが1になるように、dを選びます。7×3=21なので、この例ではd=3を使えます。
$$ \begin{aligned} e &= 7 \\ d &= 3 \\ ed &= 21 \equiv 1 \pmod{20} \end{aligned} $$
この説明では、公開鍵を「N=33、e=7」、秘密鍵側の値を「N=33、d=3」として扱います。実際の鍵データには、計算を効率化するための追加情報などが含まれることがあります。
3.数値2を暗号化する
元の数値をM=2とすると、暗号化の計算は「Mをe乗して、Nで割った余りを求める」です。この例では、暗号文に相当する数値Cは29になります。
$$ C = M^e \bmod N = 2^7 \bmod 33 = 29 $$
4.暗号化した数値を元に戻す
復号では、Cをd乗して、Nで割った余りを求めます。29の3乗は24,389で、33で割った余りが2になるため、元の数値に戻ります。
$$ M = C^d \bmod N = 29^3 \bmod 33 = 2 $$
この例では、2から29へ変換し、29から2へ戻す流れを確認できました。ただし、扱う値や鍵の条件を満たす必要があり、任意の文章をそのままこの式に入れれば安全に送れるわけではありません。
素数の性質を別の角度から学びたい方には、フィボナッチ数列の中に現れる素数を調べる記事もおすすめです。具体例とPythonの計算を通じて、条件を確かめる練習ができます。
フィボナッチ素数とは?具体例・素数になる条件とPythonでの調べ方 記事を読む →RSAの計算ができても、安全な暗号になるとは限らない
先ほどの例は、N=33なので素因数分解が簡単です。さらに、単純なべき乗と余りの計算だけを使う方式は、鍵を大きくするだけでは実用上の安全性を確保できません。
実際のRSAでは、暗号化にRSA-OAEP、電子署名にRSA-PSSといった、追加の処理を含む方式が使われます。数学的な計算と、安全に利用するための方式を分けて理解しましょう。
攻撃者が狙うのは素因数分解だけではない
鍵の生成に問題がある、秘密鍵が漏れる、実装に欠陥があるといった場合には、大きな整数の素因数分解を正面から解かずに攻撃されることがあります。「大きな鍵を使ったから安心」とは言い切れません。
- 鍵の生成:暗号用途に適した乱数生成機能と、適切な鍵生成手順を使う。
- 方式の選択:暗号化と署名を区別し、用途に対応する方式・設定を使う。
- 秘密鍵の管理:ソースコードや公開リポジトリ、共有ログに含めない。
- 実装の管理:保守されているライブラリを使い、脆弱性情報や更新を確認する。
学習のためにRSAの計算を自作することには意味があります。一方、個人情報や認証情報を守る用途では、学習用コードを流用せず、利用するサービスやライブラリの公式手順に従ってください。
HTTPSでは何が使われる?TLS 1.3とRSAの関係
HTTPSは、HTTPの通信をTLSで保護する仕組みです。ただし、「WebページのデータをすべてRSAで暗号化して送っている」という説明は正確ではありません。
TLSでは、通信相手の確認、鍵の共有、通信内容の保護を組み合わせます。証明書を使うTLS 1.3の接続では、概ね次のように役割を分担します。
| 役割 | 処理の例 |
|---|---|
| 通信相手を確認する | 証明書と電子署名を検証する |
| 通信に使う鍵を導く | ECDHEなどの鍵共有方式を利用する |
| 通信内容を保護する | AES-GCMやChaCha20-Poly1305などで暗号化と改ざん検知を行う |
TLS 1.3では、RSAで秘密情報を暗号化して送る従来の鍵配送方式は使いません。一方、RSA-PSSによる署名など、認証の場面でRSAが使われることはあります。なお、TLSには事前共有鍵を使う構成もあります。
HTTPSは通信経路を保護しますが、接続先のサービスが信頼できることや、端末が感染していないことまで保証するものではありません。暗号化の有無と、サイト・端末の安全性は分けて確認する必要があります。
暗号の仕組みを理解したら、アプリの開発・公開・運用で何を確認するかも整理しましょう。認証情報の扱いや、情報漏洩を防ぐための対策を紹介しています。
開発からデプロイまでのセキュリティ対策:情報漏洩を防ぐ実践ガイド 記事を読む →量子コンピューターと耐量子暗号
RSAや楕円曲線を使う暗号技術は、十分な規模と誤り訂正能力を備えた量子コンピューターが実現すると、Shorのアルゴリズムによる攻撃の影響を受けます。ただし、量子コンピューターが存在することと、実用的な暗号を解読できることは同じではありません。
こうした将来の攻撃を考慮して設計されるのが、耐量子暗号です。利用する側が量子コンピューターを用意する必要はなく、通常のコンピューターで動作する方式が標準化されています。
すでに標準化された方式もある
米国のNISTは、2024年8月13日に次の3つの標準を公開しました。鍵共有に関わる方式と、電子署名の方式があるため、まとめて「データを暗号化する方式」と説明しないことが大切です。
| 標準 | 方式名 | 主な用途 |
|---|---|---|
| FIPS 203 | ML-KEM | 共有秘密を確立するための鍵カプセル化 |
| FIPS 204 | ML-DSA | 電子署名 |
| FIPS 205 | SLH-DSA | 電子署名 |
耐量子暗号も、将来にわたる絶対的な安全を保証する名称ではありません。導入では方式名だけで判断せず、利用する製品や通信規格の対応状況、実装、移行方法を確認する必要があります。
よくある質問
素数を大きくすれば、必ず安全になりますか?
いいえ。鍵の大きさは重要ですが、鍵の選び方、利用する方式、秘密鍵の管理、実装の不備にも影響されます。「何ビットなら何年絶対に安全」と一律に断定せず、用途や保護期間に合った基準を確認しましょう。
公開鍵は公開してもよいのに、なぜ暗号が成立するのですか?
公開情報だけから秘密鍵や元のデータを求めることが、適切な条件では計算上難しくなるように設計されているためです。ただし、その公開鍵が意図した相手のものかどうかは、別途確認しなければなりません。
Webサイトの運営者もRSAを自分で実装する必要がありますか?
通常、その必要はありません。ホスティングサービスなどが提供するHTTPSの設定や、保守されている認証・暗号ライブラリを利用し、証明書の更新や秘密情報の管理を確認することが実務上の基本になります。
まとめ|数学の仕組みと安全な運用をつなげて学ぼう
RSAを学ぶと、素数、素因数分解、余りの計算が情報セキュリティにどうつながるかを理解できます。まずは小さな数で暗号化と復号を計算し、公開鍵と秘密鍵の役割を確認してみましょう。
そのうえで、暗号化と電子署名の違い、TLSでの役割分担、鍵の管理まで学びを広げることが重要です。数学的に計算できることと、現実のサービスを安全に運用できることの両方を意識すると、暗号技術をより正確に理解できます。
参考資料
- RFC 8017:PKCS #1 — RSA Cryptography Specifications Version 2.2:RSAの計算、暗号化方式、署名方式の仕様。
- RFC 8446:The Transport Layer Security(TLS)Protocol Version 1.3:TLS 1.3の鍵共有、認証、通信保護の仕様。
- NIST:最初の3つの耐量子暗号標準に関する発表:2024年8月に確定した標準の概要。
- NIST FIPS 203:ML-KEM:鍵カプセル化方式の標準。
- NIST FIPS 204:ML-DSA、NIST FIPS 205:SLH-DSA:電子署名方式の標準。
Learning Tools
記事を検索したい方はここから!
記事を検索
関連記事や、今の内容に近いテーマをすぐに検索できます。
例: AI / 情報Ⅰ / Python / 統計 / 資格 / 学習法