如何创建具有某些要求的素数序列?

时间:2019-05-29 15:00:15

标签: c++ openssl cryptography sequence primes

有一种Asmuth-Bloom算法,它使用中文提醒定理和必须满足要求的素数序列。

要求:1)每个素数必须大于某个素数(P)。 2)每个素数必须大于先前的素数。 3)子序列长度为m的元素相乘(m-可以恢复秘密的用户数)必须大于以索引begin = length_of_all_sequence-m + 2开头并以索引end =结束的另一个子序列元素的相乘last_element_in_sequence和素数(P)。

Requirements

这是我的代码,无法正常工作:

    Asmuth_Bloom::Asmuth_Bloom(int size_of_P, int num_of_d, string& message) {
    P = BN_new();
    size = size_of_P / 8;
    if (!BN_generate_prime_ex(P,size_of_P, 0, nullptr,
                              nullptr, nullptr)){
        throw "Error creating prime P";
    }

    for (int i = 0; i < num_of_d; i++){
        d.push_back(BN_new());
    }

    int size = 1;
    BN_CTX * ctx = BN_CTX_new();
    BIGNUM * left = BN_new();
    BIGNUM * right = BN_new();
    do {
        for (int i = 0; i < num_of_d; i++) {
                if (i) {
                    (i % (num_of_d / 3) == 0) ? size += 1 : size;
                    do {
                        if (!BN_generate_prime_ex(d[i], size_of_P + size, 0, nullptr,
                                                  nullptr, nullptr)) {
                            throw "Error creating prime d_i";
                        }
                    } while (BN_cmp(d[i], d[i - 1]) != 1 || BN_cmp(d[i], P) != 1);

                } else {
                    do {
                        if (!BN_generate_prime_ex(d[i], size_of_P, 0, nullptr,
                                                  nullptr, nullptr)) {
                            throw "Error creating prime d";
                        }
                    } while (BN_cmp(d[i], P) != 1);
                }


        }
        BN_dec2bn(&left, "1");
        int m = 5;
        for (int i = 1; i <= m; i++){
            BN_mul(left, d[i - 1], d[i], ctx);
        }
        BN_dec2bn(&right, "1");
        for (int i = d.size() - m + 2; i < d.size(); i++){
            BN_mul(right, d[i - 1], d[i], ctx);
        }
        BN_mul(right, right, P, ctx);
    }while (BN_cmp(left, right) != 1);
}

说明:d-质数向量(质数序列的向量); P-一些质数; BN_generate_prime_ex()-创建素数的函数; BN_cmp()比较两个大数字:如果left_value> right_value ---> 1,如果left_value -1,如果left_value == right_value-> 0; BN_dec2bn()-初始化数字的函数; BN_mul()-两个bignum的乘法。

此代码不起作用,因为外部循环不会停止。因为左侧总是小于右侧。如何使左侧大于右侧?

0 个答案:

没有答案