2017-03-02 5 views
1

AES 암호화 성능을 테스트하려고합니다. 하지만 코드를 실행할 때마다 결과가 달라집니다. 왜요? 여기 ++ 암호화를 사용하여 C의 코드 ++의 :왜 Crypto ++의 AES 코드가 다른 성능 결과를 제공합니까?

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

byte key[AES::DEFAULT_KEYLENGTH]; 
prng.GenerateBlock(key, sizeof(key)); 

byte iv[AES::BLOCKSIZE]; 
prng.GenerateBlock(iv, sizeof(iv)); 

CBC_Mode<AES>::Encryption e; 
e.SetKeyWithIV(key, sizeof(key), iv); 

CBC_Mode<AES>::Decryption d; 
d.SetKeyWithIV(key, sizeof(key), iv); 

시간 테스트는 여기에 있습니다 :

clock_t startTime, finishTime;  
std::string plain = "AES CBC Test"; 
std::string cipher, encoded, recovered; 
startTime = clock();  
try 
{ 

    // The StreamTransformationFilter removes 
    // padding as required. 
    StringSource s(plain, true, 
     new StreamTransformationFilter(e, 
      new StringSink(cipher) 
     ) // StreamTransformationFilter 
    ); // StringSource 

} 
catch(const CryptoPP::Exception& e) 
{ 
    cerr << e.what() << endl; 
    exit(1); 
}  
    // save current time just after finishing the encryption loop 
finishTime = clock(); 

내 테스트 결과는 여기에 있습니다 :

enter code heredouble executionTimeInSec = double(finishTime - startTime)/CLOCK_TICKS_PER_SECOND;  

std::cout << "Encryption loop execution time: " << executionTimeInSec * 1000.0 << " microseconds." << std::endl; 

std::cout << "Plain text size: " << plain.size() << " bytes." << std::endl; 

double data_rate_MiBps = ((double)plain.size()/1048576)/((double)executionTimeInSec) ; 

std::cout << "Encryption/decryption loop execution time MB/S: " << data_rate_MiBps << " MB/S." << std::endl; 
return 0;} 

타이밍 최적화되지 않은 디버그 빌드. 컴파일 된 결과 1 :

암호화 루프 실행 시간 : 0.041 마이크로 초.

컴파일 result2 :

암호화 루프 실행 시간 : 0.057 마이크로.

+0

이 답변의 기회를 도움이 될 것이다. –

+0

최적화 된 빌드, 릴리스 빌드 또는 최적화되지 않은 "디버그"빌드의 타이밍을 게시해야합니다. 후자의 경우 이러한 타이밍은 의미가 없습니다. – PaulMcKenzie

+0

[Crypto ++ 라이브러리 벤치 마크 테스트에서 어떻게 실행합니까?] (http://stackoverflow.com/q/29264531/608639) 및 [AES/CBC 암호화 및 암호 해독 간의 속도 차이가 있습니까?] (http : // stackoverflow. co.kr/q/20164502/608639) – jww

답변

1

0.041 마이크로 초는 테스트하기에는 너무 짧은 시간입니다. 신뢰할 수있는 측정 값을 얻으려면 테스트 반복을 많이 수행 한 다음 총 시간을 수행 한 반복 횟수로 나누어야합니다.

  1. 시스템의 시계의 해상도 것은 충분히 높게 측정에 상대적으로 큰 점프를 제공하지 않을 수도 있습니다 :

    너무 짧은 시간에 측정하는 여러 가지 요인이 엉망 당신의 타이밍 수도 프레임.
  2. CPU에서 실행되는 실제 시간이 아니라 측정 만 경과하는 시간입니다. 하나의 테스트에서 다른 테스트와 달리 CPU를 할당하는 OS의 영향은 측정에서 큰 변화를 가져옵니다. 많은 반복 작업을 수행 할 때 많은 반복에서이 임의의 영향을 부드럽게 처리하여 기회의 영향을 제거합니다. 암호화 ++ 벤치마킹에 관련
0

이 라이브러리는 cryptest.exe의 벤치 마크 스위트를 제공합니다. 당신은 아래처럼 그것을 호출합니다. b벤치 마크을 의미합니다. 3은 3 초 동안 테스트를 실행한다는 것을 의미합니다. 2.4은 CPU 주파수가 2.4GHz임을 의미합니다.

./cryptest.exe b 3 2.4 

명령 아래 produces output similar to.

소스 코드는 bench1.cppbench2.cpp입니다. AES의 경우 bench2.cpp을 확인하고 싶습니다. 여기에 코드 번호를 생성하기위한 책임이 :

void BenchMark(const char *name, StreamTransformation &cipher, double timeTotal) 
{ 
    const int BUF_SIZE=RoundUpToMultipleOf(2048U, cipher.OptimalBlockSize()); 
    AlignedSecByteBlock buf(BUF_SIZE); 
    Test::GlobalRNG().GenerateBlock(buf, BUF_SIZE); 

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

    clock_t start = ::clock(); 
    do 
    { 
     blocks *= 2; 
     for (; i<blocks; i++) 
      cipher.ProcessString(buf, BUF_SIZE); 
     timeTaken = double(::clock() - start)/CLOCK_TICKS_PER_SECOND; 
    } 
    while (timeTaken < 2.0/3*timeTotal); 

    OutputResultBytes(name, double(blocks) * BUF_SIZE, timeTaken); 
} 

전에 StreamTransformationBenchMark를 호출에, 팩토리 메소드는 AES 객체를 생성하고 테스트를 키가.


최근에 일부 벤치마킹 코드가 변경되었지만 대부분 미용적인 것이 었습니다. 가장 큰 변화는 난수 생성기를 추가하여 성능을 테스트하는 것입니다. 사용자 목록에서 RNG Benchmarks and rework of RDRAND/RDSEED을 참조하십시오.


벤치마킹 할 때 Turbo Boost 및 기타 관련 기술의 영향에 유의해야합니다. CPU가 3.5GHz에서 실행되지만 3.8GHz에서 터지면 예상 처리량에 영향을줍니다. 때로는 벤치 마크가 움직이는 표적이되고, 다른 시간에 이론적 인 최대 값을 초과하는 이유를 설명 할 수도 있습니다.

버스트는 내부 오버 클러킹입니다. 인텔은 수년간 그것을 해왔다. 그들은 이전 P5 펜티엄에서 NetBurst라고 불렀습니다. 하드웨어 사용자와 게이머는 오버 클러킹을 지원하는 마더 보드와 프로세서를 사용하여 오랫동안이를 해왔습니다. 코드가 실제로 컴파일 된 경우


enter image description here