问题描述
我正在使用Crypto ++ 5.6.5和Visual Studio 2017库.
I am using the library Crypto++ 5.6.5 and Visual Studio 2017.
如何计算AES-CCM的加密时间?
How can I calculate the encryption time for AES-CCM?
推荐答案
Crypto ++ Wiki提供了文章基准.它提供了许多有关库性能,如何计算吞吐量的详细信息,甚至引用了测量实际吞吐量的源代码.信不信由你,简单地调用clock
可以很好地测量批量加密.另请参见基准|同一篇Wiki文章中的Timing Loop .
The Crypto++ wiki provides an article Benchmarks. It provides a lot of details regarding library performance, how throughput is calculated, and it even references the source code where the actual throughput is measured. Believe it or not, a simple call to clock
works just fine to measure bulk encryption. Also see Benchmarks | Timing Loop in the same wiki article.
要对AES/CCM进行基准测试,请执行以下操作.它基于Crypto ++基准测试代码,但是它使用ThreadUserTimer
而不是直接调用clock
. ThreadUserTimer
可在所有操作系统和C ++的所有版本中使用.
To benchmark AES/CCM, do something like the following. It is based on the Crypto++ benchmarking code, but it uses a ThreadUserTimer
instead of a direct call to clock
. ThreadUserTimer
works across all OSes and all versions of C++.
您需要以cpuFreq
拨入处理器速度.您应该还运行 ./governor.sh perf
将CPU从空闲或C级睡眠状态移开,但是您不能这样做,因为它是Linux脚本.您可以在TestScript/
文件夹中找到它.
You need to dial-in your processor speed at cpuFreq
. You should also run ./governor.sh perf
to move the CPU from an idle or C-level sleep state, but you can't because it is a Linux script. You can find it in the TestScript/
folder.
#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的Core i5-6400上运行它会导致:
Running it on a Core i5-6400 at 2.7 GHz results in:
$ 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)
通常,您以CTR模式对库进行基准测试.例如,所有 SUPERCOP 基准都是使用该模式执行的.您可以通过包含"modes.h"
,然后切换到CTR模式:
Usually you benchmark a library with CTR mode. For example, all of the SUPERCOP benchmarks are performed using the mode. You can switch to CTR mode by including "modes.h"
, and then:
CTR_Mode<AES>::Encryption cipher;
cipher.SetKeyWithIV(key, key.size(), key);
最后,使用CTR模式进行相同的测试:
Finally, the same test using CTR mode:
$ ./bench.exe
AES/CTR benchmarks...
2.7 GHz cpu frequency
0.568922 cycles per byte (cpb)
4525.97 MiB per second (MiB)
这篇关于在Visual Studio 2017中计算AES/CCM的时间加密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!