【问题标题】:How do I find modular multiplicative inverse of number without using division for fpga?如何在不使用 fpga 的除法的情况下找到模乘法倒数?
【发布时间】:2017-01-11 18:55:28
【问题描述】:

这个问题的标准答案是“使用扩展欧几里得算法”,但是它使用除法和乘法运算,这对于在 FPGA 上实现非常大的数字来说是很痛苦的。我想在 RSA 密钥生成中使用它。

【问题讨论】:

  • 你确定有 一种不那么痛苦的方法吗?生成 RSA 密钥预计是一项昂贵的操作。
  • 你也可以看看蒙哥马利模乘法。
  • 我想,我不能使用它,因为模数必须是奇数和。
  • RSA 模数总是奇数。您可以计算逆 mod phi(n)/4,并使用一些简单的技巧来获得您想要的逆。

标签: algorithm cryptography rsa fpga


【解决方案1】:

我推荐binary euclidean algorithm

它用算术移位、比较和减法代替除法

Knuth 给出了一个扩展的二进制 GCD,类似于扩展的欧几里得算法,并提供了指向其他版本的指针。

我找到了二进制扩展欧几里得算法here的Python实现:

def strip_powers_of_two(c, p, q, gamma, delta):
    c = c / 2
    if (p % 2 == 0) and (q % 2 == 0):
        p, q = p//2, q//2
    else:
        p, q = (p + delta)//2, (q - gamma)//2
    return c, p, q

def ext_bin_gcd(a,b):
    u, v, s, t, r = 1, 0, 0, 1, 0
    while (a % 2 == 0) and (b % 2 == 0):
        a, b, r = a//2, b//2, r+1
    alpha, beta = a, b
    while (a % 2 == 0):
        a, u, v = strip_powers_of_two(a, u, v, alpha, beta)
    while a != b:
        if (b % 2 == 0):
            b, s, t = strip_powers_of_two(b, s, t, alpha, beta)
        elif b < a:
            a, b, u, v, s, t = b, a, s, t, u, v
        else:
            b, s, t = b - a, s - u, t - v
    return (2 ** r) * a, s, t

【讨论】:

    【解决方案2】:

    给定n,令Φ(n) 为小于n 且与它互质的整数个数。

    https://en.wikipedia.org/wiki/Euler%27s_theorem,如果mn 互质,那么m^(Φ(n)-1)m 的乘法逆。这可以用O(log(n)) 乘法计算。

    【讨论】:

    • 此解决方案存在一个问题。它需要计算 m^(phi(n)-1) 模 MOD,因此它涉及到求余数并使用除法。
    • 用例的好答案——通常只适用于可以预先计算 Φ(n) 的常数模数,但由于这是用于 RSA 密钥生成,因此可以很容易地计算出 Φ(n) n 的因数,已知。
    • @kraskevich 我认为这不是我要寻找的 Φ(n)。在生成私钥时,必须找到 d ≡ e^(−1) (mod φ(n)),所以我的 φ(n) 实际上是 e^((φ(φ(n))-1) mod φ(n ). 另外,由于 φ(n) 等于 (p-1)(q-1) 并且它们都是素数,所以我不能使用我的 Montgomery 快速求幂核心,因为它仅在模数为奇数时才有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2014-03-13
    • 2013-06-04
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多