1.公開鍵と秘密鍵の生成:

  • (1) ランダムに2つの大きな素数pとqを選び、n = p*qを構成する;
  • (2)オイラー関数φ(n) = (p-1) * (q-1) を計算する;
  • (3) e をランダムに選び、gcd(e, φ(n)) = 1 となるようにする。すなわち、e と φ(n) は互いに素である。gcd は最大公約数を求めることを指す。
  • (4) e*d ≡ 1 (mod φ(n)) となるように d を計算する。すなわち、d は e の乗法逆元である。

2. 暗号化プロセス:

  • (1) 暗号化する情報(平文)はmであり、m < n;(モジュロ演算を行うため、mがnより大きい場合、後の演算は成立しない。したがって、情報がnより大きい場合は、ブロックに分けて暗号化すべきである)

  • (2))暗号文 c の生成は $$ c = m^e mod (n) $$

3.解密

$$ c^d mod (n) = (m^e)^d mod (n) = m^(d*e) mod (n) ; $$

3.解密

$$ c^d mod (n) = (m^e)^d mod (n) = m^(d*e) mod (n) ; $$

なぜ復号できるのか?

オイラーの定理を使用する必要がある(実際にはフェルマーの小定理の一般化である)

a^φ(n) ≡ 1 (mod n),

さらに一般化:a^(φ(n)k) ≡ 1 (mod n),

得到 a^(φ(n)k+1) ≡ a (mod n)

注意到 ed ≡ 1 mod φ(N),即:ed = 1 + k*φ(N)。

因此,$$ M^(de) mod N = M^1 + kφ(N) mod N = M $$

4. コードは以下の通りです。

实例

#coding=utf-8 #__author__ = 'ralph' import random def extendedGCD(a, b): #a*xi + b*yi = ri if b == 0: return (1, 0, a) #a*x1 + b*y1 = a x1 = 1 y1 = 0 #a*x2 + b*y2 = b x2 = 0 y2 = 1 while b != 0: q = a / b #ri = r(i-2) % r(i-1) r = a % b a = b b = r #xi = x(i-2) - q*x(i-1) x = x1 - q*x2 x1 = x2 x2 = x #yi = y(i-2) - q*y(i-1) y = y1 - q*y2 y1 = y2 y2 = y return(x1, y1, a) def computeD(fn, e): (x, y, r) = extendedGCD(fn, e) #y maybe < 0, so convert it if y < 0: return fn + y return y def keyGeneration(p,q,e): #generate public key and private key n = p * q fn = (p-1) * (q-1) d = computeD(fn, e) return (d,n) p_v = int(raw_input('pの値を入力してください(10進数)\n')) q_v = int(raw_input('qの値を入力してください(10進数)\n')) e_v = int(raw_input('eの値を入力してください(10進数)\n')) c_v = int(raw_input('暗号文cの値を入力してください(10進数)\n')) (d,n) = keyGeneration(p_v,q_v,e_v) # dとnを生成 m = pow(c_v,d,n) print ("得られた平文mは:"+str(m))

p 値:18443,q 値:49891,e 値:19 を入力すると、

密文c值:

70479679275221115227470416418414022368270835483295235263072905459788476483295235459788476663551792475206804459788476428313374475206804459788476425392137704796792458265677341524652483295235534149509425392137428313374425392137341524652458265677263072905483295235828509797341524652425392137475206804428313374483295235475206804459788476306220148

得られた結果が表示されます。

得られた平文mは: 88455713