問題文

現在、世界中で使用されているRSA暗号の仕組みは以下の通り。\\ 1.相異なる2つの素数p,qp,qを選び、n=pqn=pqとする。また、ϕ(n)=(p1)(q1)\phi(n)=(p-1)(q-1)とする。\\ 2.ϕ(n)\phi(n)未満の正の整数で、ϕ(n)\phi(n)と互いに素な数eeを1つ選ぶ。n,en,eは公開鍵として公開される。\\ 3.de1(mod  ϕ(n))de\equiv1({\rm mod}\ \ \phi(n))を満たすようなddを求める。このddは秘密鍵である。\\ 4.平文((暗号化する前の文))00以上nn未満の整数とし、これをaaとする。送り主は盗聴された場合に備え、aaそのものではなくaea^ennで割った余りbbを送信する。\\ 5.受け取り主は暗号文bbを受け取った上で、aea^ennで割った余りがbbとなるようなaaを計算する。これにより暗号文を平文に復号することができる。

公開鍵n,en,e及び文の長さLLを与えるので、以下の2つの問に答えられるプログラムを作成せよ。\\ 1.平文列a1,a2,,aLa_1,a_2,\cdots,a_Lが与えられたときに、各aia_iを暗号化し暗号文列b1,b2,,bLb_1,b_2,\cdots,b_Lを出力せよ。\\ 2.暗号文列b1,b2,,bLb_1,b_2,\cdots,b_Lが与えられたときに、各bib_iを復号し平文列a1,a2,,aLa_1,a_2,\cdots,a_Lを出力せよ。

制約

  • p,qp,qは相異なる素数であり、pq2×109+1000pq\leq2\times10^9+1000
  • n=pqn=pqである。また、eeϕ(n)=(p1)(q1)\phi(n)=(p-1)(q-1)と互いに素
  • 0ai,bi<n0\leq a_i,b_i<n
  • 1L1051\leq L\leq10^5

入力

入力は以下のどちらかの形式で与えられる。\\ <暗号化>

encode
n e L
a_1 a_2 ... a_L

\\ <復号>

decode
n e L
b_1 b_2 ... b_L

出力

計算結果を半角スペース区切りで出力せよ。

サンプル

入力1-A
encode
21 5 5
16 7 8 12 11
出力1-A
4 7 8 3 2

aia_iに対し、ai5{a_i}^52121で割った余りを出力すれば良い。


入力1-B
decode
21 5 5
4 7 8 3 2
出力1-B
16 7 8 12 11

bib_iに対し、ai5{a_i}^52121で割った余りがbib_iになるようなaia_iは1つに定まるので、それを出力すれば良い。


入力2-A
encode
2000000014 10001 5
314159265 358979323 846264338 327950288 419716939
出力2-A
1114575615 1064628669 1590103890 1142765810 529554705

ai10001{a_i}^{10001}を求める過程でのオーバーフローに注意せよ。


入力2-B
decode
2000000014 10001 5
1114575615 1064628669 1590103890 1142765810 529554705
出力2-B
314159265 358979323 846264338 327950288 419716939

数が大きすぎるので、210001,310001,2^{10001},3^{10001},\cdotsと1つずつ調べて行っても間に合わない。さて、どうすれば良いか?\\ \\

ヒント\\

ddの決め方から、mod n{\rm mod}\ nにおいてbdaed=al(p1)(q1)+1=aal(p1)(q1) (lb^d\equiv a^{ed}=a^{l(p-1)(q-1)+1}=a\cdot a^{l(p-1)(q-1)}\ (lは整数))と書けるのだが、2つ目の項の指数がp1p-1の倍数かつq1q-1の倍数であるということから何が言えるのだろうか?

Submit


Go (1.21)