2016-03-24 2 views
0

Я пытаюсь решить проблему дискретного логрифма эллиптических кривых с использованием атаки Поллард-Ро в c. Поскольку целевая эллиптическая кривая определяется над двоичным полем F2^113, мне нужно выполнить большую часть операции EC_POINT_add s в моей программе. К сожалению, EC_POINT_add всегда возвращает 0 и останавливается программа после семи циклов (10^7). Вот мой тестовый код, и я очень смущен, почему EC_POINT_add всегда возвращает 0 и останавливается программа после циклов 7x (10^7). Мне действительно нужна твоя помощь, так как эта проблема путала меня всю неделю. Спасибо!openssl эллиптические кривые: ошибка возврата EC_POINT_add

/*X1 is a elliptic point, Tx,Ty,BL,c1,d1,c[i],d[i] and R[i] are BIGNUM* */ 
while(1) { 

    if(1 != EC_POINT_get_affine_coordinates_GF2m(curve,X1,Tx,Ty,ctx)) return 0; 

    BN_mod(Tx,Tx,BL,ctx); 
    i = atoi(BN_bn2dec(Tx)); 

    if(1 != EC_POINT_add(curve,X1,X1,R[i],ctx)) { 
      printf("\nb\n"); 
      return 0; 
    } 

    BN_mod_add(c1,c1,c[i],order,ctx); 
    BN_mod_add(d1,d1,d[i],order,ctx); 

    k++; 
    printf("%d ",k); 
} 
+0

Я думаю, что это может быть стек над потоком, но я не знаю, как с этим бороться. – ybshen

ответ

0

Теперь, я собираюсь ответить на свой вопрос, так как я нашел отладку в своем коде в конце. Я проверил все потенциальные ошибки и, наконец, обнаружил, что возвращаемая строка функции «BN_bn2dec()» должна быть свободной от «OPENSSL_free()», иначе это приведет к ошибке сегментации (сбрасывается ядром) после примерно 2 * 10^8 петель , Вот объяснение документации:

BN_bn2hex() and BN_bn2dec() return printable strings containing the 
    hexadecimal and decimal encoding of a respectively. For negative 
    numbers, the string is prefaced with a leading '-'. The string must be 
    freed later using OPENSSL_free(). 

Я использовал отладчик GDB, чтобы найти ошибку. GDB - действительно полезный инструмент для отладки кодов.