公開鍵暗号方式による通信
高校生の太郎さんと花子さんは、情報セキュリティの授業で、インターネット上で安全にデータをやり取りするための「公開鍵暗号方式」について学んでいる。先生は、その代表的なアルゴリズムであるRSA暗号を簡略化した例で説明した。
【鍵の生成】
この結果、2種類の鍵が生成される。
【暗号化と復号】
太郎:「 というデータを送る場合、 を計算するんだね。でも、 を受け取ったとき、復号するには の計算が必要だけど、 はものすごく大きな数になってしまう。」
先生:「そうだね。そこで、コンピュータでは のような計算(べき乗の剰余)を、桁あふれ(オーバーフロー)せずに効率よく行うためのアルゴリズム(プログラム1)が使われるよ。」
プログラム1:べき乗の剰余を計算する手続き(繰り返し二乗法)
// base の exp 乗を mod で割った余り (base^exp mod mod) を計算する
手続 ModPowFast(base, exp, mod)
result = 1
temp_base = base % mod
temp_exp = exp
// temp_exp が 0 になるまで繰り返す
反復 (temp_exp > 0)
// (1) temp_exp を 2 で割った余りが 1 か (exp の 2進数表現で、現在のビットが 1 か)
もし (temp_exp % 2 == 1) ならば
result = (result * temp_base) % mod
// (2) 次のビットの準備
temp_base = (temp_base * temp_base) % mod
temp_exp = temp_exp // 2 // "//" は整数除算(商の整数部分)
戻る result
花子さんが太郎さんに、この公開鍵暗号方式を使って暗号化したデータを送りたい。 このとき、花子さん(送信者)が暗号化に使う鍵と、太郎さん(受信者)が復号に使う鍵の組み合わせとして、最も適切なものを次のA〜Dのうちから一つ選べ。
平文 を、公開鍵 を使って暗号化するため、ModPowFast(2, 7, 55) を実行した。
このとき、手続きが 戻る で返す値(暗号文 )はいくつか。その値を整数で答えよ。
ヒント: 整数で答えよ
太郎さんが、問2で得られた暗号文 を秘密鍵 を使って復号するため、ModPowFast(18, 23, 55) を実行した。実行途中の反復ループ(temp_exp > 0 の間)における、各ループの終了直前(temp_exp が // 2 で更新される直前)の変数の値が(表1)のようになっている。
表1:ModPowFast(18, 23, 55) のトレース
| ループ回数 | ループ開始時 temp_exp | temp_exp % 2 == 1? | result の値 (行(1)の後) | temp_base の値 (行(2)の後) |
|---|---|---|---|---|
| 1 | 23 | 真 | 18 | 49 |
| 2 | 11 | 真 | 2 | 36 |
| 3 | 5 | 真 | 17 | 31 |
| 4 | 2 | 偽 | 17 | 【 イ 】 |
| 5 | 1 | 真 | 【 ウ 】 | 16 |
表1の 【 イ 】 と 【 ウ 】 に入る値の組として、最も適切なものを次のA〜Hのうちから一つ選べ。
このRSA暗号方式の安全性を支えている、コンピュータによる計算の難しさ(困難性)とは何か。最も適切なものを次のA〜Dのうちから一つ選べ。
プログラム1の ModPowFast 手続きは、単純な繰り返し(result = (result * base) % mod を exp 回繰り返す)よりも、乗算(*)の回数が少ないため効率的である。
問3でトレースした ModPowFast(18, 23, 55) を実行した際、反復ループ(temp_exp > 0 の間)の中で、乗算(*)が実行される回数は合計で何回か。
その回数を整数で答えよ。
(注: result = (result * temp_base) % mod と temp_base = (temp_base * temp_base) % mod の両方の * を数えること)
ヒント: 整数で答えよ