2013-09-10 66 views
1

我只是有一個快速的問題來驗證我的編程和數學是否正確。對不起,如果這是脫離主題,我沒有其他地方要求獲得高質量的答案;)我怎麼能再檢查答案是正確的?由於使用模冪運算的C編程

這是我的問題:

如果密碼有2^48個可能的密鑰,你有1000臺計算機,每一個每秒可測試50萬個的加密密鑰,你會是多少天能在最壞的情況下恢復正確的密鑰,假設進行了強力搜索,並且在嘗試使用解密時可以立即識別出正確的密鑰? (回想一下,有86,400秒的日子。)

這裏是我的程序輸出來解決這個問題:

​​

我的代碼如下:

#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並不完全正確。模冪運算只會給出y的y的餘數餘數,您還需要