openssl椭圆曲线:EC_POINT_add返回错误

openssl椭圆曲线:EC_POINT_add返回错误,openssl,elliptic-curve,Openssl,Elliptic Curve,我试图用c语言中的Pollard rho攻击来解决椭圆曲线离散对数问题。由于目标椭圆曲线是在二进制字段F2^113上定义的,因此我需要在程序中执行大量的EC_POINT_add操作。不幸的是,EC_POINT_add总是返回0,程序在大约7x(10^7)个循环后停止。这是我的测试代码,我很困惑为什么EC_POINT_add总是在大约7x(10^7)个循环后返回0和程序停止。我真的需要你的帮助,因为这个问题困扰了我整整一周。谢谢大家! /*X1 is a elliptic point, Tx,Ty

我试图用c语言中的Pollard rho攻击来解决椭圆曲线离散对数问题。由于目标椭圆曲线是在二进制字段F2^113上定义的,因此我需要在程序中执行大量的EC_POINT_add操作。不幸的是,EC_POINT_add总是返回0,程序在大约7x(10^7)个循环后停止。这是我的测试代码,我很困惑为什么EC_POINT_add总是在大约7x(10^7)个循环后返回0和程序停止。我真的需要你的帮助,因为这个问题困扰了我整整一周。谢谢大家!

/*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);
}

现在,我将回答我自己的问题,因为我在最后的代码中找到了调试。我测试了所有潜在的错误,最后发现函数“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确实是调试代码的有用工具。

我认为它可能是层叠式的,但我不知道如何处理它。