web-dev-qa-db-ja.com

RSAでn、e、p、qからdを計算しますか?

これが暗号化の質問をするのに適切な場所かどうかはわかりませんが、ここに行きます。

RSAで「d」を計算しようとしています。p、q、e、n、ø(n)を計算しました。

p = 79, q = 113, e = 2621

n = pq                   ø(n) = (p-1)(q-1)
n = 79 x 113 = 8927      ø(n) = 78 x 112 = 8736

e = 2621
d = ???

私はdを見つけることができないようです、dはその値であることが意図されていることを知っています... ed modø(n)= 1。

たとえば、e = 17、d = 2753、ø(n)= 3120

17 * 2753 mod 3120 = 1
11
user3423572

e(modn)のモジュラーインバースを探しています。これは拡張ユークリッドアルゴリズムを使用して計算できます。

_function inverse(x, m)
    a, b, u := 0, m, 1
    while x > 0
        q := b // x # integer division
        x, a, b, u := b % x, u, x, a - q * u
    if b == 1 return a % m
    error "must be coprime"
_

したがって、例では、inverse(17, 3120) = 2753およびinverse(2621, 8736) = 4373です。アルゴリズムを実装しない場合は、 Wolfram | Alpha と尋ねることができます。答えのために。

10
user448810

たとえば、次にdを取得する必要があります。
* d = 1(mod 9167368)

これは等しくです:
* d = 1 + k * 9167368、ここでk = 1、2、3、...

それを書き直してください:
d =(1 + k * 9167368)/ 3

Dはlowest kの整数でなければなりません。
式を書きましょう:
d =(1 + k * fi)/ e

public static int MultiplicativeInverse(int e, int fi)
        {
            double result;
            int k = 1;
            while (true)
            {
                result = (1 + (k * fi)) / (double) e;
                if ((Math.Round(result, 5) % 1) == 0) //integer
                {
                    return (int)result;
                }
                else
                {
                    k++;
                }
            }
        } 

このコードをテストしましょう:

Assert.AreEqual(Helper.MultiplicativeInverse(3, 9167368), 6111579); // passed
3
Yuliia Ashomok

必要なアルゴリズムは 拡張ユークリッドアルゴリズム です。これにより、2つのゼロ以外の整数abには整数xyが存在することを示すベズーの単位の係数を計算できます。そのような:

_ax + by = gcd(a,b)
_

これはすぐには役に立たないかもしれませんが、eφ(n)は互いに素であるgcd(e,φ(n)) = 1であることはわかっています。したがって、アルゴリズムは次のようなxおよびyを提供します。

_ex + φ(n)y = gcd(e,φ(n))
           = 1
Re-arrange:
ex = -φ(n)y + 1
_

これはex mod φ(n) = 1と言うのと同じなので、_x = d_と言います。

3
Iridium