RSA暗号単語

9件
アールエスエーアンゴウ
3.7千文字の記事
  • 23
  • 0pt
掲示板へ

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のハッシュ値が等しいか検証する。等しければその署名が妥当なものであることを信じる。

関連項目

【スポンサーリンク】

  • 23
  • 0pt
記事編集 編集履歴を閲覧

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

壱百満天原サロメ (単) 記事と一緒に動画もおすすめ!
提供: ヤーヤー
もっと見る

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

RSA暗号

21 ななしのよっしん
2015/02/02(月) 21:45:22 ID: 633HoyWSOD
>>20
復号の方法をよく見てみよう
p, q, dはいずれも秘密にしなければいけない情報だが、復号の際に必要になる情報(=秘密)はdとnだけ

まあ、nはすでに開しているから秘密はdだけと考えることもできるけど、どちらにしろp, qはばれるとまずい(dがわかってしまうため)情報ではあるが、そもそもp, qは生成の過程で一時的に必要になるだけであって、保管しておく必要自体ないわけだ
👍
高評価
0
👎
低評価
0
22 ななしのよっしん
2015/04/26(日) 12:12:18 ID: N5A2CBRgN5
記事の p = 5,q = 7,n = 35,e = 5,d = 5 のところ
中途半端にスペース入れてあって見づらいと思います。
入れるなら p = 5 , q = 7 , n = 35 , e = 5 , d = 5 で良いのでは。
👍
高評価
0
👎
低評価
0
23 ななしのよっしん
2015/04/26(日) 12:15:59 ID: N5A2CBRgN5
p = 5, q = 7, n = 35, e = 5, d = 5 や
p=5, q=7, n=35, e=5, d=5 のほうが自然かな。
ともかく、イコールの前後に入れて、コンマの後に入れないのは変に思える。
👍
高評価
0
👎
低評価
0
24 ななしのよっしん
2016/02/05(金) 00:37:11 ID: DhlCZGjEY9
くっ
👍
高評価
0
👎
低評価
0
25 ななしのよっしん
2017/05/29(月) 20:54:27 ID: rM4gVhqFIV
素数3つだと、ダメなのは何故?別に説明見る限りでは特に問題なさそうだし、そっちの方が安全性も上がりそうだけど…
👍
高評価
0
👎
低評価
0
26 ななしのよっしん
2017/10/05(木) 12:07:55 ID: GzjXURTEyt
>>25
実際に計算してみれば確かに素数3つでもよいが、2つに定着したのは安全さのためじゃないかと思う
なぜなら、300桁の合成数の場合、素数2つの積である時、小さい方の因数は最大150桁なのに対し、素数3つだと一番小さい因数は最大100桁しかない
つまり、素数2つの積の方が素因数分解されにくいということによるとおもう
👍
高評価
0
👎
低評価
0
27 ななしのよっしん
2019/05/27(月) 05:27:13 ID: LYOTwCvlqQ
pq を法としたただの合同算術って考えるとすんなり腑に落ちてしまう。(p-1)(q-1)乗が1になるのもちょっと数学やった身だとああそうだよねって思えるようになる。

>>13 >>14
桁の数に平方根記号をかぶせたものから素因数の二乗(専門的には方因子という)を括り出す、中高でおなじみのアレなら、素因数分解を兼ねてるから、当たらずと言えども遠からずって感じ……? 小数で計算するのは楽勝だもんね
👍
高評価
0
👎
低評価
0
28 ななしのよっしん
2021/02/22(月) 02:09:37 ID: Uha69xF7JV
RSA暗号は二つの数が必要で準指数関数的時間で解けるアルゴリズムがある
楕円曲線暗号は一つの数でよくてまだ指数関数時間アルゴリズムしか見つかっていない
なので同じ強度にするのに必要とされる桁数が楕円曲線暗号の方が大幅に少なく済む
👍
高評価
0
👎
低評価
0
29 ななしのよっしん
2022/05/23(月) 12:56:47 ID: N4sWgsS9Xa
👍
高評価
0
👎
低評価
0
30 ななしのよっしん
2022/06/05(日) 17:52:25 ID: 6UAqU0+U1w
>>20, >>21
(p, n), (q, n), (p, q), (d, n) いずれでも情報としては足りてますが、実運用上は計算時間の削減のため (n, d, p, q, d mod (p-1), d mod (q-1), q^{-1} mod p) みたいなとりあえず色々入れとけみたいなデータ構造になってます
>>25, >>26
「最小の素因数の大きさ」によって計算時間が決まる素因数分解アルゴリズムがあるので、それへの耐性は大きい方から 2 番素数の大きさで決まります。なので同じ大きさの素数 2 個の方がよいですし、どうしても素数 3 個を使うなら 3 × (150 桁の素数) × (150 桁の素数) とするのが多分最善でしょう (一番小さい素数の大きさは適当でもいいです)
👍
高評価
0
👎
低評価
0