4

SynCrypto 是这个包中包含的用于数据加密的开源库。

在本单元 (SynCrypto.pas) 中,文件开头有以下注释:

AES128 cypher 84 MB/s uncypher 81 MB/s asm 版本
AES128 cypher 57 MB/s uncypher 57 MB/s pascal 版本
AES192 cypher 72 MB/s uncypher 70 MB/s asm 版本
AES192 cypher 48 MB/s uncypher 48 MB/s pascal 版本
AES256 密码 62 MB/s uncypher 61 MB/s asm 版本
AES256 密码 42 MB/s uncypher 42 MB/s 帕斯卡版本

据我了解,这是两个版本的代码:pascal-slower 和 asm-faster。但问题是,我该如何在这两者之间进行选择?

编辑:还有一个第二个问题,如果你允许的话:我如何选择密钥的位宽:128、192 和 256?

我使用这段代码来加密和解密:

  outp := TAESCFB.SimpleEncrypt(inp,'privatekey',true,true);
  inp := TAESCFB.SimpleEncrypt(outp,'privatekey',false,true);

...和德尔福 2009。

4

1 回答 1

3

简短回答:根据编译器和计算机,将始终为您使用最快的代码。

长答案:

一次只编译一个代码版本,pascal 或优化 asm。它取决于在单元中运行时的条件定义,根据您的编译器版本(从 Delphi 5 到最新的 Delphi 或 FPC 版本)和 CPU 平台(如果它有 Intel 或 ARM)自动设置。然后在运行时,在 Intel 上,可以检测和使用 AES-NI 硬件操作码,或者在 VIA 上,挂锁硬件操作码。甚至 pascal 实现也可以滚动或展开。

{$define AES_ROLLED}
// if defined, use rolled version, which is faster (at least on my AMD CPU)

{$ifdef DELPHI5OROLDER}
  {$define AES_PASCAL} // Delphi 5 internal asm is buggy :(
  {$define SHA3_PASCAL}
{$else}
  {$ifdef CPUINTEL} // AES-NI supported for x86 and x64
    {$ifdef CPU64}
      {$ifdef HASAESNI}
        {$define USEAESNI}
        {$define USEAESNI64}
      {$else}
        {$define AES_PASCAL} // Delphi XE2/XE3 do not have the AES-NI opcodes :(
      {$endif}
      {$define AESPASCAL_OR_CPU64}
    {$else}
      {$define USEAESNI}
      {$define USEAESNI32}
    {$endif}
  {$else}
    {$define AES_PASCAL} // AES128 unrolled pascal(Delphi7)=57MB/s rolled asm=84MB/s :)
    {$define SHA3_PASCAL}
  {$endif CPUINTEL}
{$endif}

总而言之,当使用 AES 时,该单元有六个不同版本的算法:pascal rolling、pascal unrolled、没有 AES-NI 的 x86/x64 asm、带 AES-NI 的 x86/x64 asm、带挂锁的 x86、Windows API。

简单加密:

有两种重载SimpleEncrypt方法。一个具有 256 位的固定大小(您使用的那个),另一个具有KeySize参数(128、192 或 256):

class function TAESAbstract.SimpleEncrypt(const Input: RawByteString; const Key;
   KeySize: integer; Encrypt, IVAtBeginning: boolean): RawByteString;

当然,在调用函数之前,您应该首先将输入的密码文本散列为 THash128 或 THash256 密钥。我们建议PBKDF2_HMAC_SHA256用于此目的(具有高整数)。

一些数字:

使用包括 AES-NI 在内的现代 CPU,您将获得出色的性能。这肯定是 Delphi/FPC 中最快的原生 AES 实现(没有其他使用 AES-NI)。一些数字运行在我的笔记本电脑上,取自TTestCryptographicRoutines.Benchmark回归测试:

 50000 AES128CFB in 229.60ms i.e. 217764/s or 463.4 MB/s
 50000 AES128OFB in 183.66ms i.e. 272237/s or 579.3 MB/s
 50000 AES128CFBCRC in 227.61ms i.e. 219674/s or 467.5 MB/s
 50000 AES128OFBCRC in 181.18ms i.e. 275954/s or 587.2 MB/s
 50000 AES256CFB in 288.57ms i.e. 173265/s or 368.7 MB/s
 50000 AES256OFB in 243.96ms i.e. 204944/s or 436.1 MB/s
 50000 AES256CFBCRC in 294.38ms i.e. 169844/s or 361.4 MB/s
 50000 AES256OFBCRC in 244.49ms i.e. 204507/s or 435.2 MB/s
 50000 SHAKE128 in 473.34ms i.e. 105631/s or 224.8 MB/s
 50000 SHAKE256 in 596.74ms i.e. 83787/s or 178.3 MB/s

忘记 Windows API,相比之下,它的速度非常慢。该类TAES...CRC在压缩期间向输入和输出添加一个 128 位 crc32c,而不会降低速度,以验证和验证内容。我还包括了 SHAKE128/SHAKE256 加密(不兼容 AES),一步即可与 HMAC-SHA-256 + AES-256 相媲美,并且在所有没有 AES-NI 的 CPU 上都非常快。

于 2017-07-27T14:17:59.117 回答