Я пытаюсь внедрить схему шифрования 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
что явно неверно, так как 2-й выход должен был быть 3255859
long long
, но только если вы ожидаете, что ваши числа останутся меньше 2^63, положительных или отрицательных. - person Michael Oliver   schedule 29.09.2013long long int
несколько нестандартно. Обычно люди используют толькоlong long
. Кроме того, если вам нужны только положительные числа, используйтеunsigned long long
. Дляlong long
можно использовать%lld
, а для неподписанной версии использовать%llu
. - person Michael Oliver   schedule 29.09.2013long long encrypt =(long long)pow((double) num,3) % 33;
- person Michael Oliver   schedule 29.09.2013pow
возвращаетdouble
, который обычно имеет только 15 цифр точности (надежно), даже если число может быть больше этого. Затем, когда вы конвертируете его вlong long
, вы не восстановите те цифры, которые вы потеряли, поэтому ваш мод может оказаться неправильным. - person Michael Oliver   schedule 29.09.2013%llu
следует использовать только для беззнаковых. Что касается решения другой проблемы, то в C нет ничего встроенного. Вот статья в Википедии, в которой показан быстрый способ реализацииpow
: en.wikipedia.org/wiki/Exponentiation_by_squaring В противном случае вы можете изучить библиотеки, поддерживающие большие числа. - person Michael Oliver   schedule 29.09.2013