gpt4 book ai didi

c++ - 在Visual Studio 2017中计算AES/CCM的时间加密

转载 作者:行者123 更新时间:2023-11-28 01:39:22 25 4
gpt4 key购买 nike

我正在使用库 Crypto++ 5.6.5 和 Visual Studio 2017。

如何计算 AES-CCM 的加密时间?

最佳答案

I would like to know how to calculate the encryption time for AES-CCM.

Crypto++ wiki 提供了一篇文章 Benchmarks .它提供了很多关于库性能、吞吐量计算方式的详细信息,甚至还引用了测量实际吞吐量的源代码。信不信由你,对 clock 的简单调用就可以很好地测量批量加密。另见 Benchmarks | Timing Loop在同一篇维基文章中。

要对 AES/CCM 进行基准测试,请执行如下操作。它基于 Crypto++ 基准测试代码,但它使用 ThreadUserTimer 而不是直接调用 clockThreadUserTimer 适用于所有操作系统和所有版本的 C++。

您需要在 cpuFreq 上拨入您的处理器速度。您应该还运行./governor.sh perf将 CPU 从空闲或 C 级 sleep 状态移开,但你不能这样做,因为它是一个 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 的 Core i5-6400 上运行它会产生:

$ 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 模式,然后:

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)

关于c++ - 在Visual Studio 2017中计算AES/CCM的时间加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47956337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com