RSA计算d

时间:2014-04-24 20:33:27

标签: encryption cryptography rsa public-key-encryption

不确定这是否是提出加密问题的正确位置,但现在就去了。

我想在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应该是一个值... edmodø(n)= 1.任何帮助将不胜感激

编辑:一个例子是e = 17,d = 2753,øn= 3120

17 * 2753 mod 3120 = 1

3 个答案:

答案 0 :(得分:8)

您正在寻找 e (mod n )的模块化逆,可以使用扩展的欧几里德算法计算:

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询问答案。

答案 1 :(得分:4)

您需要的算法是Extended Euclidean Algorithm。这允许您计算Bézout身份的系数,该系数表明对于任何两个非零整数ab,存在整数xy,这样: / p>

ax + by = gcd(a,b)

这似乎没有立即有用,但我们知道eφ(n)是互质的,gcd(e,φ(n)) = 1。因此,该算法为我们提供了xy

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

这相当于说ex mod φ(n) = 1,所以x = d

答案 2 :(得分:2)

例如,您需要在下一个中获得: 3 * d = 1(mod 9167368)

这同样是:
3 * d = 1 + k * 9167368,其中k = 1,2,3,...

重写它:
d =(1 + k * 9167368)/ 3

你的d必须是最低 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