これは、暗号化の問題というよりは、実行時間や時間の複雑さに関する問題なので、読み続けてください:
大学では、ディフィー ヘルマン交換で秘密を見つけるために力ずくの離散対数アルゴリズムを実装する必要があり、データ型や大きな素数について心配する必要がないように、C++ と NTL ライブラリを使用して実装を開始しました。
私の例の数値は、25 ビットの素数を使用した次のとおりであり、離散対数を見つけたいと考えています。
p = 20084173; /* the prime */
g = 2; /* the generator */
a = 7709318; /* the logarithm of a */
b = 6676335; /* the logarithm of b */
NTL を使用して C++ で以下を実装しました。
int main() {
ZZ p, g, a, b;
// 25 Bit
p = 20084173;
g = 2;
a = 7709318;
b = 6676335;
exhaustiveSearch(p, g, a);
exhaustiveSearch(p, g, b);
return 0;
}
ZZ exhaustiveSearch(ZZ p, ZZ g, ZZ t) {
ZZ i, x;
i = 0;
x = 1;
while ((x = (x % p)) != t) {
i++;
x = x * g;
}
cout << endl << endl << "p = " << p << endl << "g = " << g << endl << "t = " << t << endl << "secret: = " << i << endl;
return i;
}
出力 (7.581 秒) :
p = 20084173
g = 2
t = 7709318
secret: = 557254
p = 20084173
g = 2
t = 6676335
secret: = 8949383
-> time: 7.581s
まあ、私はそれが本当に長いと思ったので、NTL なしでテストし、C++ で通常の long をテストしました -> すべての ZZ が long (0.124s) に置き換えられたと想像してください:
p = 20084173
g = 2
t = 7709318
Secret: = 557254
p = 20084173
g = 2
t = 6676335
Secret: = 8949383
-> time: 0.124s
なぜNTLがそれほど遅いのか、誰か説明してもらえますか? 私はこの分野の専門家ではなく、暗号化の基本とそれらを簡単な例で実装する方法を理解しようとしているだけであることを覚えておいてください.
ありがとうございました!