2017-12-23 8 views
0

私は2017年計算時間の暗号化2017

がどのように私はAES-CCMの暗号化時間を計算することができます暗号++ 5.6.5およびVisual Studioライブラリを使用していますか?

+1

ことができないだけで、時間関数の呼び出しあなたは? – user3532232

+0

詳細を教えてください – Peace

+0

開始時間を取得して保存し、多くの繰り返しのループで機能を実行し、終了時間を取得し、開始時間を減算し、繰り返し数で除算することが望ましいです。数回これを行い、平均を取得します。 – zaph

答えて

2

AES-CCMの暗号化時間を計算する方法を知りたいと思います。

Crypto ++ wikiは、記事Benchmarksを提供します。ライブラリのパフォーマンス、スループットの計算方法、実際のスループットが測定されるソースコードを参照する方法など、多くの詳細を提供します。信じられないかもしれませんが、clockへの簡単な呼び出しは大量の暗号化を測定するのに有効です。同じwiki記事のBenchmarks | Timing Loopも参照してください。

AES/CCMをベンチマークするには、次のようにします。これはCrypto ++ベンチマークコードに基づいていますが、clockへの直接呼び出しの代わりにThreadUserTimerを使用します。 ThreadUserTimerは、すべてのOSとすべてのバージョンのC++で動作します。

プロセッサ速度をcpuFreqにダイヤルインする必要があります。 は、アイドル状態またはCレベルのスリープ状態からCPUを移動するために./governor.sh perfを実行する必要がありますが、Linuxスクリプトであるため、実行できません。これはTestScript/フォルダにあります。

#include "cryptlib.h" 
#include "secblock.h" 
#include "hrtimer.h" 
#include "osrng.h" 
#include "modes.h" 
#include "aes.h" 
#include "ccm.h" 
#include <iostream> 

const double runTimeInSeconds = 3.0; 
const double cpuFreq = 2.7*1000*1000*1000; 

int main(int argc, char* argv[]) 
{ 
    using namespace CryptoPP; 
    AutoSeededRandomPool prng; 

    SecByteBlock key(16); 
    prng.GenerateBlock(key, key.size()); 

    CCM<AES>::Encryption cipher; 
    cipher.SetKeyWithIV(key, key.size(), key); 

    const int BUF_SIZE=RoundUpToMultipleOf(2048U, 
     dynamic_cast<StreamTransformation&>(cipher).OptimalBlockSize()); 

    AlignedSecByteBlock buf(BUF_SIZE); 
    prng.GenerateBlock(buf, BUF_SIZE); 

    double elapsedTimeInSeconds; 
    unsigned long i=0, blocks=1; 

    ThreadUserTimer timer; 
    timer.StartTimer(); 

    do 
    { 
     blocks *= 2; 
     for (; i<blocks; i++) 
      cipher.ProcessString(buf, BUF_SIZE); 
     elapsedTimeInSeconds = timer.ElapsedTimeAsDouble(); 
    } 
    while (elapsedTimeInSeconds < runTimeInSeconds); 

    const double bytes = static_cast<double>(BUF_SIZE) * blocks; 
    const double ghz = cpuFreq/1000/1000/1000; 
    const double mbs = bytes/1024/1024/elapsedTimeInSeconds; 
    const double cpb = elapsedTimeInSeconds * cpuFreq/bytes; 

    std::cout << cipher.AlgorithmName() << " benchmarks..." << std::endl; 
    std::cout << " " << ghz << " GHz cpu frequency" << std::endl; 
    std::cout << " " << cpb << " cycles per byte (cpb)" << std::endl; 
    std::cout << " " << mbs << " MiB per second (MiB)" << std::endl; 
    // std::cout << " " << elapsedTimeInSeconds << " seconds passed" << std::endl; 
    // std::cout << " " << (word64) bytes << " bytes processed" << std::endl; 

    return 0; 
} 

で2.7 GHzの結果でコアi5-6400上でそれを実行:CTRモードで

$ g++ bench.cxx ./libcryptopp.a -o bench.exe 
$ ./bench.exe 
AES/CCM benchmarks... 
    2.7 GHz cpu frequency 
    3.00491 cycles per byte (cpb) 
    856.904 MiB per second (MiB) 

通常あなたがベンチマークのライブラリを。たとえば、SUPERCOPベンチマークのすべてがモードを使用して実行されます。その後、"modes.h"を含むことにより、CTRモードに切り替える、とすることができます

CTR_Mode<AES>::Encryption cipher; 
cipher.SetKeyWithIV(key, key.size(), key); 

を最後に、CTRモードを使用して同じテスト:

$ ./bench.exe 
AES/CTR benchmarks... 
    2.7 GHz cpu frequency 
    0.568922 cycles per byte (cpb) 
    4525.97 MiB per second (MiB) 
+0

これを閉じるのに使用した複製は一般的すぎますか?これを再開するか、dup-listをより具体的な複製に編集する必要がありますか?とても一般的に見える質問には良い答えがあるとは思っていませんでしたが、今ではあなたは研磨の価値があるかもしれないと書いています。 –

+0

@PeterCordes - 良い質問です。もともと私はあなたにpingをして、あなたにそのことを再考するように頼んでいた。私が質問を読んだとき、私は2つの部分があることを見た。最初に、基本的な「ベンチマーク」の部分が何度も尋ねられ、答えられました。もう一つはCrypto ++の部分です。この答えは、ブロックを処理する 'BlockTransformation'クラスの' ProcessString'やCrypto ++ 'ThreadUserTimer'を使ってすべてのOSとすべてのバージョンのC++でうまく動作するタイマーを得るような、Crypto ++の部分に焦点を当てています。 'ThreadUserTimer'は完璧ではありませんが、OSやC++の移植性に関しては、たくさんのことが言えます。 – jww

+0

私は間違いであることが判明した場合、それが逆転する可能性があることを知っているので、重複して質問をクローズしています。もし私が正しいことをしたと思っていない、あるいは再開するために投票したら、私はpingをしなければなりません。 –