Я пытаюсь внедрить схему шифрования RSA. Это звучит примерно так:функция pow и long int вызывает проблемы
encrypted data = ((message)^e) % n
и decrypted data = ((encrypted data)^d) % n
Я пытался осуществить это в с. Вот код:
#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
Я знаю, что я либо тип литья неправильно или я бегу из границ где-то. Мне нужно использовать этот код для шифрования больших чисел, подобных тому, который указан в приведенном выше коде.
Не могли бы вы указать, где я ошибаюсь.
Благодаря
EDIT:
Ok согласно предложению от @Micael Оливер здесь модифицированный код:
#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, положительными или отрицательными. –
Я пробовал с длинным длинным int на num и encrypt ... все тот же результат = -2 :( – sukhvir
Это немного не соответствует стандарту 'long long int'. Обычно люди используют только' long long'. Кроме того, если вы только Для 'long long' вы можете использовать'% lld', а для неподписанной версии используйте '% llu'. –