2013-09-10 2 views
1

У меня просто был быстрый вопрос, чтобы проверить правильность моего программирования и математики. Извините заранее, если это не в тему, я не могу попросить, чтобы получить качественные ответы;) Как я могу дважды проверить правильность ответа? Благодаря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; 
} 
+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

+0

Это становится намного проще, если вы используете 64-битные целые числа, кстати. – WhozCraig

+0

Не возражаете ли вы объяснить, что вы там делали и как это не (2^48)/(500000 * 1000 * 86400) ~ 6.5156? Или 1000 раз, если вы интерпретируете «худший случай», поскольку все компьютеры тестируют точно такие же ключи в одном порядке, пока все они не получат ответ одновременно? – brunocodutra

ответ

1

Правильный расчет был отмечен в комментариях. Однако вы все еще не знаете, как вы поступили не так.

Ваше заявление modular exponentiation здесь не совсем корректно. Модульное возведение в степень только дает вам остаток от x до y более z, вам также нужен quotient.

Смежные вопросы