NTRUEncrypt中计算逆多项式的算法

问题描述

我正在代码中实现一种用于计算 NTRU 密码系统中的逆多项式的算法,并且我正在使用 Joseph H. Silverman 的论文“几乎逆和快速 NTRU 密钥创建”。我将第二个伪代码实现为:

int inverse_mod_p(polynomial *r,polynomial *a)
{
    int k;
    int16_t b[NTRU_N + 1],c[NTRU_N + 1],f[NTRU_N + 1],g[NTRU_N + 1];
    int i;
    int16_t aux;
    int zero_f;
    int constant_f;
    int deg_fg;

    memset(b,(NTRU_N + 1) * sizeof(int16_t));
    b[0] = 1;

    memset(c,(NTRU_N + 1) * sizeof(int16_t));

    memcpy(f,a->coeffs,NTRU_N * sizeof(int16_t));
    f[NTRU_N] = 0;

    memset(g,(NTRU_N + 1) * sizeof(int16_t));
    g[0] = -1;
    g[NTRU_N] = 1;

    while (1)
    {
        zero_f = 1;
        for (i = 0; i < NTRU_N + 1; i++)
        {
            if (f[i] != 0)
            {
                zero_f = 0;
                break;
            }
        }

        if (zero_f)
            return 1;

        while (f[0] == 0)
        {
            for (i = 0; i < NTRU_N; i++)
            {
                f[i] = f[i + 1];
                c[NTRU_N - i] = c[NTRU_N - i - 1];
            }
            f[NTRU_N] = 0;
            c[0] = 0;

            k++;
        }

        constant_f = 1;
        for (i = 1; i < NTRU_N + 1; i++)
        {
            if (f[i] != 0)
            {
                constant_f = 0;
                break;
            }
        }

        if (constant_f)
            break;

        deg_fg = 0;
        for (i = NTRU_N; i >= 0; i--)
        {
            if (f[i] == 0 && g[i] != 0)
            {
                deg_fg = 1;
                break;
            }
            else if (f[i] != 0 && g[i] == 0)
            {
                break;
            }
        }

        if (deg_fg)
        {
            for (i = 0; i < NTRU_N + 1; i++)
            {
                aux = f[i];
                f[i] = g[i];
                g[i] = aux;

                aux = b[i];
                b[i] = c[i];
                c[i] = aux;
            }
        }

        if (f[0] == g[0])
        {
            for (i = 0; i < NTRU_N + 1; i++)
            {
                f[i] = (f[i] - g[i] + 3) % 3;
                b[i] = (b[i] - c[i] + 3) % 3;
            }
        }
        else
        {
            for (i = 0; i < NTRU_N + 1; i++)
            {
                f[i] = (f[i] + g[i] + 3) % 3;
                b[i] = (b[i] + c[i] + 3) % 3;
            }
        }
    }

    k = k % NTRU_N;

    for (i = NTRU_N - 1; i >= 0; i--)
    {
        if (i - k < 0)
            r->coeffs[i - k + NTRU_N] = b[i] * f[0];
        else
            r->coeffs[i - k] = b[i] * f[0];
    }

    for (i = 0; i < NTRU_N; i++)
        r->coeffs[i] = (r->coeffs[i] + 3) % 3;

    return 0;
}

但这似乎是错误的。我使用维基百科中的示例 giveng 对其进行了测试: https://en.wikipedia.org/wiki/NTRUEncrypt 。多项式 -1 + x + x^2 - x^4 + x^6 + x^9 - x^10 应该是多项式 1 + 2x + 2x^3 + 2x^4 + x^5 + 2x^ 的逆7 + x^8 - x^10 ,但我得到以下结果:

Polinomial:
    -1  1  1  0  -1  0  1  0  0  1  -1  
Inverse polinomial:
    0  2  2  1  0  2  1  2  0  1  2  

实现中的错误在哪里?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)