1

プログラミングと数学が正しいかどうかを確認する簡単な質問がありました。これがトピックから外れている場合は事前に申し訳ありません。質の高い回答を得るために他に尋ねる場所はありません;)回答が正しいことを再確認するにはどうすればよいですか? ありがとう

これは私の問題です:

暗号システムに 2^48 の可能なキーがあり、1 秒あたり 500,000 の暗号化キーをテストできる 1000 台のコンピューターがある場合、ブルート フォース検索を想定した場合、最悪の場合、何日で正しいキーを回復できるでしょうか。また、復号化を試みたときに正しいキーをすぐに認識できることを確認しましたか? (1 日は 86,400 秒であることを思い出してください。)

問題を解決するための私のプログラム出力は次のとおりです。

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;
}
4

1 に答える 1

1

正しい計算はコメントで指摘されました。ただし、どのように間違ったのかはまだわかりません。

ここでの剰余累乗の適用は、まったく正しくありません。剰余累乗では、z を y で割った x の剰余のみが得られます。も必要です。

于 2013-09-11T01:51:13.693 に答える