如何在不使用fpga除法的情况下找到数字的模乘法逆?

时间:2017-01-11 18:55:29

标签: algorithm cryptography rsa fpga

这个问题的规范答案是"使用扩展的欧几里德算法"然而,它利用了分频和乘法运算,这对FPGA上的大数字很难实现。我想在RSA密钥生成中使用它。

2 个答案:

答案 0 :(得分:2)

给定n,让Φ(n)为小于n的整数,并且相对于它是素数。

https://en.wikipedia.org/wiki/Euler%27s_theorem开始,如果mn的相对素数,则m^(Φ(n)-1)m的乘法逆。这可以使用O(log(n))次乘法计算。

答案 1 :(得分:2)

我推荐binary euclidean algorithm

  

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

     

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

我找到了二进制扩展欧几里德算法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