mod n
にマップしModulus
、にマップし、暗号化指数はにマップし、復号化指数はにマップします。p
-1
mod q
InverseQ
Exponent
D
暗号化指数e
と復号化指数d
は、e * d = 1 mod(p-1)(q-1)によって関連付けられます。したがって、それらが1つある場合は、System.Numerics.BigIntegerクラスからいくつかのメソッドを使用してもう1つを簡単に派生させることができます。
var Pminus1 = BigInteger.Subtract(P, BigInteger.One);
var Qminus1 = BigInteger.Subtract(Q, BigInteger.One);
var Phi = BigInteger.Multiply(Pminus1, Qminus1);
var PhiMinus1 = BigInteger.Subtract(Phi, BigInteger.One);
// var D = BigInteger.ModPow(E, PhiMinus1, Phi);
特にJavaのBigIntegerクラスに慣れている場合は、.NETBigIntegerを作成するときに注意が必要です。詳細については、この質問を参照してください。
編集 :
CodeInChaosが指摘しているように、最後の行は間違っています。
間違い!間違い!間違い!
恥ずかしいです。悪の勢力に屈するために、BigIntegerクラスにはモジュラ逆数法も拡張ユークリッドアルゴリズム法もありません。それでも、「c#拡張ユークリッドアルゴリズム」をグーグルで検索すると、多くの実装を見つけることができます。拡張ユークリッドアルゴリズムは、1 = e * x + phi*yとなる整数xとyを提供します。xはemodphiの逆であるため、D = xmodphiを設定する必要があります。