RSA暗号 単語

9件

アールエスエーアンゴウ

3.7千文字の記事
  • twitter
  • facebook
  • はてな
  • LINE

RSA暗号とは、暗号のひとつであり、現在インターネットで広く使われている暗号である。

概要

大きな数を素因数分解するのは、現代の技術をもってしても非常に時間がかかる。RSA暗号はこれを利用しているのである。どんなに大きな数でも素因数分解不可能ではないので、いつかは解読されてしまう。しかし、その頃には情報としての価値はなくなっているので、暗号としての役割を果たす。

方法

鍵生成

まず、暗号で用いるを次のようにして用意する。

  1. 異なる2つの素数p,qを適当にとる。
  2. n = pqとする。
  3. 自然数eを、(p-1)(q-1)との最大公約数が1となるように適当にとる。
  4. 自然数dを、edを(p-1)(q-1)で割った余りが1となるように適当にとる。
  5. (e,n)をとし、(d,n)を秘密とする。

dをめる際には、ユークリッドの互除法を応用することで簡単にめることができる。詳しく説明すると長くなるのでここでは割愛する。eとnはなので開するものだが、p,q,dはいずれも他人に知られてはならない。

暗号化

文xを暗号化し、暗号文yを得る方法。ここでxは1以上n未満の自然数とする。xがn以上であれば、分割して複数のn未満の数にする。自然数以外の情報を扱う場合、適当自然数に対応させてから暗号化する。

  1. xをe乗する。
  2. それをnで割った余りをyとする。

これで完成ね、簡単でしょ?

復号

秘密暗号文yを復号し、文xを得る方法。

  1. yをd乗する。
  2. それをnで割った余りをxとする。

前項でのxと本項でのxは一致する。ね、簡単で(ry

実際にやってみよう

暗号化してみよう

暗号化なら文を適当に用意すれば可だけど、見るだけでいいという人のためにひとつ例をあげよう。尚、計算を簡単にするために次の定理を用いるよ。

余りが等しい2つの数は、同じだけ累乗しても同じ数を掛けても余りは等しい」

p = 5 , q = 7 , n = 35 , e = 5 , d = 5とし、12を暗号化する。
125 = (122)2×12 = 1442×12
144を35で割った余りは4なので、1442×12と42×12は余りが等しい。
42×12 = 192であり、これを35で割った余りは17
よって暗号文17を得る。

復号も同じ要領でやればおk。ちゃんと12になるか確かめてみよう。

解読してみよう

今度はこちらで作成した暗号文だけを見せるので、元の数を当ててみよう。

(e,n) = (27,123)
暗号105

正解は72でした。ちなみにdの値は3。dはこれである必要はないけど、一番小さいのがこれ。小さいほうが計算少なくて済むね。

解説(選択して読んでね)

秘密がわかればよいので、ここではdの値をめることを的とする。eの値は既にわかっているので、生成の方法から、(p-1)(q-1)の値がわかればdの値をめることができる。(p-1)(q-1)の値は、nを素因数分解すればめられる。

n = 123 = 3×41なので、(p-1)(q-1) = 2×40 = 80
よって、27dを80で割って1余ればよい。つまり、27d = 1,81,161,・・・のいずれか。
dは適当にひとつ選べばよいので、例えばd = 3をとればよい。d = 83等でもかまわない。 

あとは、105を3乗して123で割った余りめるだけ。

安全性

前項で解読した方は、「あれっ、簡単じゃないか?」と思った方が多いのではないだろうか。実際、nを素因数分解できればdの値をめることができ、簡単に文が得られる。一方、素因数分解を用いるよりも効率的かつ実用的な解読法は現在のところ考え出されていない。つまり、RSA暗号の解読が容易であるか困難であるかは素因数分解のそれに依存するのである。現在RSA暗号において実際に使われているnの値は300桁以上である。これを素因数分解するのに、いかに時間がかかるかおわかりだろうか。

このページを開いた方の中には、現在でも使われている暗号なだけあって、難解なことでもするのかと思った方もいらっしゃるかもしれない。しかし、暗号化や復号のやりかただけ見れば、さほど難しいことではない。最悪、累乗余りの知識さえあれば十分である。暗号本質的価値は解読困難さにあり、暗号そのもののわかりにくさは関係ない。また、実際に暗号を運用するにあたって、正規の方法による暗号化や復号は高速かつ容易に行う必要がある。RSA暗号はそれらを満たす、優れた暗号であった。

しかし、注意深く実装しないと脆弱性を含めてしまうことになりかねないこと、より短い長で同等以上のセキュリティを実現できる楕円曲線暗号方式の広まりなどもあり、第一線からは引退しつつある。今後新しく暗号方式を実装するときは、楕円曲線暗号方式や耐量子暗号方式を第一に考えるべきであろう。

証明

暗号化する前と復号した後が一致することを明する。

まず、記号を準備する。ここで扱う記号と|である。どちらも2つの整数の関係性を表す記号である。ab (mod n)は、「aとbはnで割った余りが等しい」という意味である。詳しくはの記事を参照されたし。a|bは、「aはbの約数である」という意味である。「bはaの倍数である」とも言う。ab (mod n)とn|a-bは同値である。というかこれが合同関係の定義。また、この明はフェルマーの小定理を前提とする。

文をx,暗号文をy,それを復号したものをzとする。z = xを示す。

暗号化の方法より、yxe (mod n)
復号の方法より、zyd (mod n)
よって、z(xe)dxed (mod n)

生成の方法より、ed1 (mod (p-1)(q-1))
よって、(p-1)(q-1)|ed-1
p-1|(p-1)(q-1)なので、p-1|ed-1
q-1|(p-1)(q-1)なので、q-1|ed-1
よって、ed1 (mod p-1) かつ ed1 (mod q-1)

xとpが互いに素であれば、フェルマーの小定理よりxp-11 (mod p)
ed1 (mod p-1)より、ある整数kが存在し、ed = k(p-1)+1
よって、xedxk(p-1)+1(xp-1)kx1kxx (mod p)
xとpが互いに素でなければ、pは素数なのでp|x
よって、x0 (mod p)したがって、xed0 (mod p)

いずれにせよ、xedx (mod p)が成り立つ。
qに関しても同様に、xedx (mod q)
よって、p|xed-x かつ q|xed-x
pとqは互いに素なので、pq|xed-x
n = pqより、xedx (mod n)
よって、zx (mod n)
どちらも0以上n未満なので、z = x 

認証

秘密(d,n)を先に使うことで、秘密の所持を明することができる(RSA署名)。これにより、秘密にも明かさずに本人確認ができる。

  1. 生成は暗号化の時と同じ。(e,n)を本人確認したい相手に渡しておく。
  2. 本人確認したい相手は、一時的な値cをランダムに生成し、秘密(d,n)の所持者に渡す。
  3. 秘密(d,n)の所持者は、cを受け取るとs=(cdをnで割った余り)を相手に渡す。このsは署名と呼ばれる。
  4. 本人確認したい相手は、署名sを受け取ると(seをnで割った余り)を計算し、それがcと等しければsを送ってきた相手が本人であることを信じる。

sの値を使い回されてなりすましされるのを防ぐために、cは毎回異なる値を選ばなければならない。(ランダムに選んでいるのであれば問題はない。)

このプロセス自体は暗号プロセスを一切含まない。この通信自体を暗号化すべきかどうかは全く状況により、暗号化する場合は別の手段を用いる必要がある。

実例

自分の書いたメッセージに、自分が書いたことの証明をつけたい場合

(RSASSA-PSS というアルゴリズムの概説を書く。詳しい仕様RFC 8017を参照。)

メッセージmに本人確認(署名)をつけることを考える。あらかじめ以下のものを固定しておく。

署名を作る側は以下のような手順を踏む。

  1. ハッシュ値H(m)を計算する。
  2. 乱数rを選ぶ。
  3. c=f(r || H(m))とする。r || H(m)はrとH(m)を並べたデータである。fを挟むのはパターンを不規則にして安全性を増すため。
  4. 署名s=(cdをnで割った余り)を計算する。(この場合、ランダムにcを選んでくれる第三者が存在しないので、ハッシュ関数を挟んで擬似的にcをランダム化するイメージ)

署名を検証する側は、以下のような手順を踏む。

  1. c=(seをnで割った余り)を計算する。
  2. c=f(r || H(m))という式から、fの逆関数を計算してrとH(m)を割り出す。
  3. H(m)と、こちらでめて計算したmのハッシュ値が等しいか検証する。等しければその署名が妥当なものであることを信じる。

関連項目

この記事を編集する

掲示板

おすすめトレンド

ニコニ広告で宣伝された記事

記事と一緒に動画もおすすめ!
山口剛央[単語]

提供: Pyun Pyun

もっと見る

急上昇ワード改

最終更新:2024/04/25(木) 19:00

ほめられた記事

最終更新:2024/04/25(木) 19:00

ウォッチリストに追加しました!

すでにウォッチリストに
入っています。

OK

追加に失敗しました。

OK

追加にはログインが必要です。

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

ほめるの取消しに失敗しました。

OK

ほめるにはログインが必要です。

タグ編集にはログインが必要です。

タグ編集には利用規約の同意が必要です。

TOP