RSA(公開鍵暗号)とは:仕組み・鍵生成・安全性と用途をわかりやすく解説
RSA(公開鍵暗号)の仕組み・鍵生成・安全性・用途を初心者向けに図解と実例でわかりやすく解説。暗号の基礎から実務での応用まで網羅。
RSA (Rivest-Shamir-Adleman) は、現代のコンピュータがメッセージの暗号化および復号化に使用するアルゴリズムである。非対称暗号アルゴリズムである。非対称とは、2つの異なる鍵が存在することを意味します。鍵の一方は誰にでも渡せるので、公開鍵暗号方式とも呼ばれます。もう一方の鍵は秘密にしておかなければなりません。このアルゴリズムは、大きな合成数の因子を求めることが難しいという事実に基づいています。因子が素数の場合、この問題は素因数分解と呼ばれます。また、鍵ペア(公開鍵と秘密鍵)生成器でもある。
仕組み(基本の考え方)
RSAの基本は大きな合成数 n を作り、公開鍵と秘密鍵を整数のべき乗(冪乗)で表すことにより、以下の性質を利用します。公開鍵で暗号化したデータは対応する秘密鍵でのみ復号できる、というものです。数学的には次のように表されます。
- 暗号化:平文 m に対して、暗号文 c = me mod n を計算する(e は公開指数、n は公開モジュロ)。
- 復号:秘密指数 d を使って m = cd mod n を計算すると元の平文が得られる。
e と d は互いに逆元の関係(mod φ(n))にあり、これが上の性質を成立させます。
鍵の生成(手順)
典型的な鍵生成の流れは以下の通りです。
- 大きな素数 p, q をランダムに生成する(安全のため十分大きく、一般に数百〜数千ビット)。
- n = p × q を計算する(n は公開される)。
- φ(n) = (p−1)(q−1) を計算する(φ は秘密にする)。
- 1 < e < φ(n) を満たし、e と φ(n) が互いに素となる値(公開指数)を選ぶ。よく使われる値は 65537 など。
- d を e の φ(n) に関する逆元として計算する(つまり e·d ≡ 1 (mod φ(n)))。この d が秘密鍵の主要部分になる。
- 公開鍵は (n, e)、秘密鍵は (n, d)(および p, q を保持)として管理する。
安全性と注意点
安全性の根拠は、大きな n を素因数分解して p と q を求めるのが計算上困難である点にあります。十分大きな鍵長(現在の推奨は少なくとも2048ビット、より高い安全度が必要なら3072ビットまたは4096ビット)を使うことで、既知の古典的なアルゴリズムでは素因数分解が現実的に不可能になります。
ただし次のようなリスクや注意点があります:
- 量子コンピュータの脅威:Shorのアルゴリズムを実装できる大規模量子コンピュータが実現すれば、RSAは効率的に破られます。量子耐性アルゴリズムへの移行が議論されています。
- 実装上の脆弱性:暗号化に適切なパディング(例:OAEP)を使わないと、選択暗号文攻撃や復号オラクル攻撃に弱くなります。また、タイミング攻撃や電力解析などのサイドチャネル攻撃にも注意が必要です。
- 小さすぎる鍵や不適切な e の選択:小さすぎる鍵長や、誤ったパラメータ(例:e = 3 をそのまま使って脆弱な状況を作るなど)は安全性を損ないます。
- 鍵管理:秘密鍵の保護、適切な鍵の更新(有効期限)、乱数源の品質確保は極めて重要です。
実運用での使い方・用途
RSAは直接大量データを暗号化するには遅いため、一般に次のような用途で使われます。
- セッション鍵の交換:TLS/HTTPS などで、RSAを用いて対称鍵(AESなど)を安全に交換する。
- デジタル署名:ソフトウェア配布、電子メール(S/MIME)、証明書の発行(X.509)などで、送信元の認証とメッセージの改ざん検知に使用。署名は通常、ハッシュ値をRSAで処理して生成・検証する(例:RSASSA-PKCS1-v1_5、RSASSA-PSS)。
- 認証と証明書基盤:公開鍵基盤(PKI)における認証局(CA)の証明書などで広く用いられている。
- 電子決済やSSH鍵等:公開鍵認証方式の一部として利用されることがある(ただし新しいシステムでは楕円曲線暗号(ECC)なども増えている)。
運用上の推奨事項(実務的なポイント)
- 十分な鍵長を選ぶ(現時点では最低2048ビット推奨)。
- 安全なパディングを使う(暗号化ではOAEP、署名ではPSSなど)。
- 秘密鍵はハードウェアで保護する(HSM、TPM、スマートカードなど)ことを検討する。
- 定期的な鍵ローテーションと漏洩対策を行う。
- 最新の暗号ライブラリを使用し、既知の脆弱性や攻撃から保護する。
まとめ(要点)
RSAは公開鍵暗号の代表的アルゴリズムで、鍵のペアを使って暗号化・復号やデジタル署名を可能にします。安全性は素因数分解の困難性に依存しますが、鍵長・パディング・実装・鍵管理次第で強度が大きく変わります。量子計算の進展には注意が必要で、将来的には量子耐性アルゴリズムへの移行が求められる可能性があります。それでも現在はTLSや電子署名など多くの分野で広く使われている信頼性の高い技術です。
メッセージの暗号化
アリスは公開鍵( n {displaystyle n,} & e {displaystyle e,}
)をボブに渡し、秘密鍵を保持する。ボブはメッセージMをアリスに送りたい。
まず彼は、パディングスキームとして知られる合意された可逆プロトコルを使用して、Mをn {displaystyle n} より小さい数m {displaystyle m}
に変換する。そして、それに対応する暗号文 c {displaystyle c,}
を計算する。
c = m e mod n {displaystyle c=m^{e}mod {n}}}
これは、二乗による指数計算の方法を用いれば、すぐにできる。そして、Bobはc {displaystyle c,} をAliceに送信する。
メッセージの復号化
Aliceは、以下の手順で秘密鍵d {displaystyle d,} を用いて、c {displaystyle c,}
から m {displaystyle m,}
を復元することができる。
m = c d mod n {displaystyle m=c^{d}{bmod {n}}}.
m {displaystyle m,} を与えると、元の明瞭な素数を復元できる。この2つの合同に中国の余りの定理を適用すると、次のようになる。
m e d ≡ m mod p q {displaystyle m^{ed}equiv m{bmod {pq}}} .
このように
c d ≡ m mod n {displaystyle c^{d}equiv m{bmod {n}}} .
動作例
ここでは、RSAの暗号化と復号化の例を示します。ここで使われているパラメータは人工的に小さくしたものですが、OpenSSLを使って実際のキーペアを生成して調べることもできます。
- ランダムに素数を2つ選びます。
- : p = 61 {displaystyle p=61}
and q = 53 ; {displaystyle q=53;}.
Compute n = p q {displaystyle n=pq,} }.
- : n = 61 ∗ 53 = 3233 {displaystyle n=61*53=3233}.
- Totalient φ ( n ) = ( p - 1 ) ( q - 1 ) {displaystyle \phi (n)=(p-1)(q-1)\,} を計算します。
- : ϕ ( n ) = ( 61 - 1 ) ( 53 - 1 ) = 3120 {displaystyle \phi (n)=(61-1)(53-1)=3120}.
- Choose e > 1 {displaystyle e>1}
coprime to 3120
- : e = 17 {displaystyle e=17}.
- Choose d {displaystyle d,}
to satisfy d e mod ϕ ( n ) ≡ 1 {displaystyle de{bmod {} Neitherphi (n)}} {equiv 1,} } }.
- : d = 2753 {displaystyle d=2753}
- : 17 ∗ 2753 = 46801 = 1 + 15 ∗ 3120 {displaystyle 17*2753=46801=1+15*3120}
.
公開鍵は( n = 3233 {displaystyle n=3233} , e = 17 {displaystyle e=17}
)である。padded message m {displaystyle m,}
に対して、暗号化関数c = m e mod n {displaystyle c=m^{e}{displaymod {n}}} は次のようになる。
c = m 17 mod 3 233 {displaystyle c=m^{17}{thebmod {3}}233,}}
秘密鍵は( n = 3233 {displaystyle n=3233} , d = 2753 {displaystyle d=2753}
)である。復号化関数 m = c d mod n {displaystyle m=c^{d}{Thinkbmod {n}}} は次のようになる。
m = c 2753 mod 3 233 {displaystyle m=c^{2753}{thebmod {3}}233,} }.
例えば、m=123を暗号化する場合、{displaystyle m=123} とする。を計算する。
c = 123 17 mod 3 233 = 855 {displaystyle c=123^{17}{Thinkbmod {3}}233=855}.
To decrypt c = 855 {displaystyle c=855}.を計算する。
m = 855 2753 mod 3 233 = 123 {displaystyle m=855^{2753}{Threebmod {3}}233=123}.
これらの計算はいずれも、モジュラーエキスポーネーションの平方・乗算アルゴリズム を用いて効率的に計算することができる。
オイラーの定理からRSA方程式を導き出す
RSAはオイラーの定理とオイラーの積分関数を用いて簡単に導出することができる。
オイラーの定理から始める。
m ϕ ( n ) ≡ 1 ( mod n ) {displaystyle m^{Copy (n)}}equiv 1{pmod {n}}}.
暗号化されたメッセージを正しい鍵で復号化すると、元のメッセージが得られることを示さなければならない。パディングされたメッセージmが与えられたとき、暗号文cは次のように計算されます。
c ≡ m e ( mod n ) {displaystyle cequiv m^{e}{pmod {n}}} 。
復号アルゴリズムに代入すると、次のようになります。
c d ≡ ( m e ) d ≡ m e d ( mod n ) {displaystyle c^{d}}equiv (m^{e})^{d}equiv m^{ed}{pod {n}}} {displaystyle c^{d}equiv (m^{d})^{ed}{pod {n}} {displaystylec^{d}}{d}}とする。
この値もmと合同であることを示したい。eとdの値は飽和するように選ばれている。
e d ≡ 1 ( mod ϕ ( n ) )({displaystyle edequiv 1{pmod {phi (n)}})
つまり、以下のようなある整数kが存在する。
e d = k × ϕ ( n ) + 1 {displaystyle ed=ktimes \phi (n)+1}.
ここで、暗号化されたメッセージと復号化されたメッセージに置き換えてみます。
m e d ≡ m k ϕ ( n ) + 1 ≡ m × m k ϕ ( n ) ≡ m × ( m ϕ ( n ) ) k ( mod n ) {displaystyle {begin{aligned} m^{ed}&\Ȃ m^{kathy (n)+1} Ȃ m^{kathy (n)} Ȃ mttp(m^{kathy (n)}right)^{k}{pod {n}} end{aligned}}} ↘↘ m^{kathy (n)+1} ↘ meph!
オイラーの定理を適用し、結果を得る。
m × ( 1 ) k ≡ m ( mod n ) {displaystyle mtimes (1)^{k}equiv m}{pmod {n}}}.
パディングスキーム
実際に使用する場合、RSAは何らかのパディングスキームと組み合わせ、Mの値が安全でない暗号文にならないようにする必要がある。パディングなしで使用されるRSAには、いくつかの問題がある。
- m = 0またはm = 1は、指数の特性により、常にそれぞれ0または1に等しい暗号文を生成する。
- 暗号化指数が小さく(例えばe = 3)、かつmが小さい値で暗号化する場合、m e {displaystyle m^{e}}
の(非修飾)結果が厳密に係数nより小さい場合がある。この場合、暗号文は係数を無視してethルートを取ることで容易に復号化できる可能性がある。
- RSA暗号は決定論的な暗号化アルゴリズムである。ランダムな要素を持たない。したがって、攻撃者は暗号システムに対して選択平文攻撃を成功させることができる。攻撃者は、公開鍵の下で可能性の高い平文を暗号化して辞書を作成し、その結果の暗号文を保存することができます。そして、攻撃者は通信路を監視することができる。辞書に載っている暗号文と一致するものがあれば、その辞書を使ってメッセージの内容を知ることができる。
実際には、短いASCIIメッセージを送信するときに、最初の2つの問題が発生する可能性があります。このようなメッセージでは、m は 1 つ以上の ASCII エンコード文字を連結したものである可能性があります。ASCII の NUL
文字
1
つ(数値は
0)からなるメッセージは m = 0 と符号化され、e と N がどの値であっても 0 の暗号文が生成されます。同様に、単一の ASCII SOH
(数値は 1) は常に 1 の暗号文を生成します。従来 3 のような小さな e の値を使用していたシステムでは、最大の m は 255 という値になり、2553 は妥当なモジュラスよりも小さいため、この方式でコード化したすべての単一文字の ASCII メッセージは安全ではありません。このような平文は、単に暗号文の立方根を取ることで復元することができます。
これらの問題を回避するため、実用的なRSAの実装では、暗号化する前に値mに構造化されたランダムなパディングを何らかの形で埋め込むのが一般的である。このパディングにより、mが安全でない平文の範囲に入らないこと、また、あるメッセージがパディングされると、多数の異なる可能な暗号文のうちの1つに暗号化されることが保証される。後者の性質は、辞書攻撃のコストを合理的な攻撃者の能力を超えて増加させる可能性があります。
PKCSのような標準規格は、RSA暗号化の前にメッセージを安全にパッドするように慎重に設計されています。これらの方式は、平文 m にある数のビットを追加してパディングするため、パディングされないメッセージ M のサイズはいくらか小さくならざるを得ません。RSAパディング方式は、巧妙な攻撃を防ぐために慎重に設計する必要があります。これは、予測可能なメッセージ構造によって容易になる場合があります。PKCS標準の初期のバージョンでは、アドホックな構造を使用していましたが、後に実用的な適応型選択暗号文攻撃に対して脆弱であることが判明しました。最近の構成では、最適非対称暗号パディング(OAEP)のような安全な技術を使用して、これらの攻撃を防ぎつつメッセージを保護します。また、PKCS規格には、RSA署名の安全性を高めるための処理方式として、RSA-PSS(Probabilistic Signature Scheme for RSA)などがある。
メッセージの署名
アリスがボブの公開鍵を使って彼に暗号化されたメッセージを送ったとします。メッセージの中で、彼女はアリスだと主張することができますが、 誰でもボブの公開鍵を使って暗号化されたメッセージを送ることができるので、 ボブはそのメッセージが本当にアリスからのものかどうかを確認する手段がありません。ですから、メッセージの出所を確認するために、 RSA はメッセージに署名するのにも使われます。
アリスが署名されたメッセージをボブに送りたい場合を考えてみよう。アリスはメッセージのハッシュ値を生成し、(メッセージを復号するときと同じように) d mod nの累乗に上げて、それをメッセージに「署名」として添付する。署名されたメッセージを受け取ったボブは、署名をe mod nのべき乗にし(メッセージを暗号化するときと同じ)、得られたハッシュ値とメッセージの実際のハッシュ値とを比較する。もしこの二つが一致すれば、ボブはメッセージの作者がアリスの 秘密鍵を持っていて、それ以降メッセージが改竄されていないことを知ります。
RSA-PSSのような安全なパディング方式は、メッセージの暗号化と同様に署名の安全性にも不可欠であり、同じ鍵を暗号化と署名の両方の目的で使用してはならないことに注意すること。
質問と回答
Q:RSAとは何ですか?
A: RSA (Rivest-Shamir-Adleman) は、現代のコンピュータがメッセージの暗号化と復号化に使用するアルゴリズムです。非対称暗号アルゴリズムの1つです。
Q:非対称とはどういう意味ですか?
A:非対称とは、公開鍵と秘密鍵の2つの異なる鍵が存在することを意味します。
Q:RSAアルゴリズムの基本は何ですか?
A:このアルゴリズムは、大きな合成数の因子を見つけることが困難であるという事実に基づいています。因子が素数の場合、この問題は素因数分解と呼ばれます。
Q:RSAはどのように機能するのですか?
A:RSAには、公開鍵と秘密鍵があります。公開鍵は誰でも知ることができ、メッセージを暗号化するのに使われます。公開鍵で暗号化されたメッセージは、秘密鍵を用いてのみ復号化することができます。公開鍵から秘密鍵を計算するのは非常に困難です。
Q:この種の暗号に他の名称はありますか?
A: この種の暗号は、鍵の一方を誰にも渡さず、もう一方を秘密にできることから、公開鍵暗号とも呼ばれています。
Q:RSAは鍵のペアを生成するのですか?
A: はい、RSAは公開鍵と秘密鍵のペアを生成し、それぞれ暗号化と復号に使用します。
百科事典を検索する