【发布时间】:2013-10-05 02:10:03
【问题描述】:
我正在尝试实施 RSA 加密方案。它是这样的:
encrypted data = ((message)^e) % n 和 decrypted data = ((encrypted data)^d) % n
我尝试在 c 中实现这一点。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
long int num = 3255859;
long int encrypt =(int)pow((double) num,3) % 33;
printf("%ld\n",encrypt);
return 0;
}
我使用gcc -Werror -g -o encrypt encrypt.c -lm编译了这个
这是我得到的输出 =-2,这显然是错误的。当我为较小的数字尝试此代码时,我得到了正确的结果。例如:
当我设置num = 2 时,我得到了正确的结果,即8
我知道我要么类型转换错误,要么我在某处用完了边界。我确实需要使用此代码来加密像上面代码中的大数字。
请你指出我哪里出错了。
谢谢
编辑:
好的,根据@Micael Oliver 的建议,这里是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
unsigned long long num = 3255859;
long long encrypt =(long long)pow((double) num,3) % 33;
printf("%llu\n",encrypt);
long long decrypt =(long long)pow((double) encrypt,7) % 33;
printf("%llu\n",decrypt);
return 0;
}
这是这段代码的输出:
Notra:Desktop Sukhvir$ gcc -Werror -g -o encrypt encrypt.c -lm
Notra:Desktop Sukhvir$ ./encrypt
18446744073709551608
18446744073709551614
这显然是错误的,因为第二个输出应该是 3255859
【问题讨论】:
-
尝试使用
long long,但前提是您希望您的数字保持在 2^63 以下,无论是正数还是负数。 -
我在 num 和 encrypt 上都尝试了 long long int ... 结果仍然相同 = -2 :(
-
使用
long long int有点不合标准。通常人们只使用long long。此外,如果您只想要正数,请使用unsigned long long。对于long long,您可以使用%lld,对于未签名版本使用%llu。 -
你应该使用
long long encrypt =(long long)pow((double) num,3) % 33; -
您的解决方案仍然存在问题。
pow返回一个double,它通常只有 15 位精度(可靠),即使数字可能比这更大。然后,当您将其转换为long long时,您将无法重新获得丢失的数字,因此您的 mod 最终可能会出错。
标签: c gcc encryption int pow