Как мне выполнить побитовое И из двух BIGNUM?

Я работаю с openssl BIGNUM библиотека в C ++.

У меня проблема в том, что мне нужно вычислить побитовый and из двух BIGNUM значения а и б, но я не могу понять, как это сделать. Я некоторое время искал в Интернете, но не могу найти ничего полезного.

2

Решение

В OpenSSL нет побитовой функции и функции для BIGNUM. Вот как я делаю поразрядно — и вы можете использовать его, пока не найдете подходящее решение.

BN_ULONG bn_and_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n)
{
BN_ULONG l,t;

if (n <= 0) return((BN_ULONG)0);

while(n)
{
t=a[0];
l=(t&b[0]);
l=(t&b[0])&BN_MASK2;
r[0]=l;
a++; b++; r++; n--;
}
return((BN_ULONG)*r);
}

Вышеуказанная внутренняя функция bn_and_words используется в этой функции:

int BN_bitwise_and(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
{
int max,min,dif;
BN_ULONG *ap,*bp,*rp;
const BIGNUM *tmp;

bn_check_top(a);
bn_check_top(b);

if (a->used< b->used)
{ tmp=a; a=b; b=tmp; }
max = a->used;
min = b->used;
dif = max - min;

if (bn_wexpand(r,max+1) == NULL)
return 0;

r->used=max;

ap=a->d;
bp=b->d;
rp=r->d;

bn_and_words(rp,ap,bp,min);
rp+=min;
ap+=min;
bp+=min;

while (dif)
{
*(rp++) = *(ap++);
dif--;
}
r->neg = 0;
bn_check_top(r);
return 1;
}

Результат r из a AND b это первый аргумент и возвращаемое значение функции BN_bitwise_and,

Вот тест:

int test_and()
{
BIGNUM *a,*b,*r;
a=BN_new();
b=BN_new();
r=BN_new();

if (!BN_hex2bn(&a, "1234567890ABCDEF")) return -1;
if (!BN_hex2bn(&b, "FEDCBA0987654321")) return -1;

BN_bitwise_and(r,a,b);
BN_print_fp(stdout, r);

BN_free(a);
BN_free(b);
BN_free(r);
}

Результат r напечатано на стандартный вывод

1214120880214121

Надеюсь это поможет.

3

Другие решения

Похоже, что нет функции сделать это напрямую, поэтому вам придется придумать что-то, основанное на функциональности, которая там есть. Что-то вроде:

BIGNUM *a, *b, *result;
unsigned current = 0;

//Creation of a, b, result

while(!BN_zero(a) && !BN_zero(b)) {
if(BN_is_bit_set(a, current) && BN_is_bit_set(b, current)) {
BN_set_bit(result, current);
} else {
BN_clear_bit(result, current);
}
++current;
BN_rshift1(a, a);
BN_rshift1(b, b);
}

Обратите внимание, что для этого может потребоваться вручную установить биты более высокого порядка на 0, если длина a больше, чем b или наоборот. Однако этого должно быть достаточно, чтобы начать.

0

По вопросам рекламы [email protected]