C中的大数字

时间:2017-08-06 02:09:37

标签: c floating-point rsa bignum unsigned-long-long-int

我在C中实施RSA 我正在使用"unsigned long long int" (Top limit: 18446744073709551615).

当我必须计算 4294967296 ^ 2 之类的东西时会出现问题。 它应该是 18446744073709551616,,但我得到 0(溢出)。 我的意思是,我需要计算结果超出最高限度的事情。

我尝试过使用float,double,long double,但结果不正确。

示例:

4294967000.0 * 4294967000.0 the result is 18446741874686296064.0
but it should be 18446741531089000000

2 个答案:

答案 0 :(得分:1)

Openssl示例:

#include <stdio.h>
#include <openssl/bn.h>
/* compile with -lcrypto */
int main ()
{
 char p_sa[] = "4294967296";
 char p_sb[] = "4294967296";
 BN_CTX *c = BN_CTX_new();
 BIGNUM *pa = BN_new();
 BIGNUM *pb = BN_new();
 BN_dec2bn(&pa, p_sa);
 BN_dec2bn(&pb, p_sb);
 BN_mul (pa,pb, pa,c);
 char * number_str = BN_bn2hex(pa);
 printf("%s\n", number_str);
 OPENSSL_free(number_str);
 BN_free(pa);
 BN_free(pb);
 BN_CTX_free(c);
 return 0;
}

答案 1 :(得分:0)

“实施RSA”+“我必须计算像4294967296 ^ 2这样的东西”是矛盾的。要实施RSA,不需要计算。该算法不需要宽于64位的整数。

  

我尝试过使用float,double,long double,但结果不正确。

4294967000.0 * 4294967000.0 the result is 18446741874686296064.0

使用unsigned long long数学。典型的double只有53位的精度,但这个计算需要60+位才能得到精确的产品。

int main(void) {
  unsigned long x = 4294967000;
  printf("%lu * %lu the result is %lu\n", x,x,x*x);  // overflow
  printf("%lu * %lu the result is %llu\n", x,x,(unsigned long long) (x*x)); // overflow
  printf("%lu * %lu the result is %llu\n", x,x,(unsigned long long)x*x);// good 64-bit math
  return 0;
}

输出

4294967000 * 4294967000 the result is 87616
4294967000 * 4294967000 the result is 87616
4294967000 * 4294967000 the result is 18446741531089000000