1. paizaラーニングトップ
  2. レベルアップ問題集
  3. ユークリッドの互除法メニュー(言語選択)
  4. 問題一覧 C編
  5. RSA 暗号の基本原理

ユークリッドの互除法メニューのサムネイル
RSA 暗号の基本原理 (paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

ここまで学んできた mod や累乗の知識を利用して、今現在も活躍している暗号である RSA 暗号の基本的な原理を確かめてみましょう。
RSA 暗号とは、桁数が大きい合成数の素因数分解問題が困難であることを安全性の根拠とした公開鍵暗号の一つです。
次の問題で RSA 暗号を解読するために、その暗号化・解読方法をこの問題で検証してみましょう。

<準備>
適当な素数 p , q を用意し、 n = pq , n' = (p-1)(q-1) とおく。
e は gcd(e , n') = 1 を満たす適当な整数とし、あらかじめ de ≡ 1 (mod n') を満たす自然数 d を用意する。

<手順>
1. 受信者は n と e を公開しておく。
2. 送信者は、数値 M を送信したい時は、代わりに数値 E = M^e mod n を送信する。
3. E を受け取った受信者が、自分だけが知っている自然数 d を用いて E^d mod n を求めると、元の数値 M が得られる。

整数 p,q,e,M が与えられるので、d = e^{-1} (mod n') を求めたのち、E = M^e mod n とすると E^d mod n は M になることを確かめてみましょう。

入力される値

p q e M


・1 行で、整数 p , q , e , M が与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

d
E
E^d (mod n)


・1 行目では d = e^{-1} (mod n') の値を出力してください。
・2 行目では E = M^e (mod n) の値を出力してください。
・3 行目では E^d (mod n) の値を出力してください。
・また、出力の末尾には改行を入れてください。

条件

・1 ≦ p , q , e ≦ 100,000
・p , q は素数
・e は gcd(e , (p-1)(q-1)) = 1 を満たす
・0 < M < pq

入力例1

63113 63311 3007 248429

出力例1

866360063
189953047
248429

入力例2

19463 19469 2633 488357

出力例2

193256433
322340256
488357

問題一覧へ戻る

ページの先頭へ戻る