У меня просто был быстрый вопрос, чтобы проверить правильность моего программирования и математики. Извините заранее, если это не в тему, я не могу попросить, чтобы получить качественные ответы;) Как я могу дважды проверить правильность ответа? БлагодаряC программирование для расчета с использованием модульного возведения в степень
Это моя проблема:
Если криптосистема имеет 2^48 возможных ключей, и у вас есть 1000 компьютеров, каждый из которых может испытать 500.000 ключей шифрования в секунду, через сколько дней вы сможете восстановить правильный ключ в худшем случае, при условии поиска грубой силы и что вы можете сразу распознать правильный ключ, когда вы пробовали расшифровать его? (Напомним, есть 86400 секунд в день.)
Вот мой вывод программы, чтобы решить эту проблему:
Number of keys: 2^48
Number of computers: 1000
Number of keys/persecond: 500000
Number of days: 647168000
Мой код выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int max_power(int base,int exp,int mod);
int main(void)
{
int num_computers=1000;
int keys_per_second= 500000;
int seconds_in_day=86400;
printf("Number of keys: 2^48\n");
printf("Number of computers: %d\n",num_computers);
printf("Number of keys/persecond: %d\n",keys_per_second);
printf("Number of days: %d\n",max_power(2,48,seconds_in_day)*num_computers*keys_per_second);
return 0;
}
int max_power(int base,int exp,int mod)
{
if (exp == 0)
return 1;
else if (exp%2 == 0) {
int mysqrt = max_power(base, exp/2, mod);
return (mysqrt*mysqrt)%mod;
}
else
return (base*max_power(base, exp-1, mod))%mod;
}
Финальный код (по-прежнему не полностью удовлетворены, но я попрошу своего профессора, если это будет приемлемо при испытании):
int main(void)
{
double num_computers=1000;
double keys_per_second= 500000;
double seconds_in_day=86400;
long double keys=pow(2.0,48);
printf("Number of keys: %.0lf\n",keys);
printf("Number of computers: %.0f\n",num_computers);
printf("Number of keys/persecond: %.0f\n",keys_per_second);
printf("============================================\n");
printf("Time to decrypt all keys: %.2f days\n",keys/(num_computers*keys_per_second*seconds_in_day));
return 0;
}
Я не смотрел, что делает ваш код, но, как насчет wolfram alpha? [(2^48)/(500000 * 1000 * 86400) = 6,5156 ... дней] (http://www.wolframalpha.com/input/?i=%282%5E48%29%2F%28500000*1000* 86400% 29). Надеюсь, я понял, в чем ваш вопрос. – Macattack
Это становится намного проще, если вы используете 64-битные целые числа, кстати. – WhozCraig
Не возражаете ли вы объяснить, что вы там делали и как это не (2^48)/(500000 * 1000 * 86400) ~ 6.5156? Или 1000 раз, если вы интерпретируете «худший случай», поскольку все компьютеры тестируют точно такие же ключи в одном порядке, пока все они не получат ответ одновременно? – brunocodutra