我在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
答案 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