有一种Asmuth-Bloom算法,它使用中文提醒定理和必须满足要求的素数序列。
要求:1)每个素数必须大于某个素数(P)。 2)每个素数必须大于先前的素数。 3)子序列长度为m的元素相乘(m-可以恢复秘密的用户数)必须大于以索引begin = length_of_all_sequence-m + 2开头并以索引end =结束的另一个子序列元素的相乘last_element_in_sequence和素数(P)。
这是我的代码,无法正常工作:
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
此代码不起作用,因为外部循环不会停止。因为左侧总是小于右侧。如何使左侧大于右侧?