2013-09-10 30 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的余数余数,您还需要