gpt4 book ai didi

delphi - 如何从 SynCrypto 选择 AES 加密版本?

转载 作者:行者123 更新时间:2023-12-03 15:53:50 27 4
gpt4 key购买 nike

SynCrypto 是 this pack. 中包含的用于数据加密的开源库。

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

AES128 cypher 84 MB/s uncypher 81 MB/s asm version
AES128 cypher 57 MB/s uncypher 57 MB/s pascal version
AES192 cypher 72 MB/s uncypher 70 MB/s asm version
AES192 cypher 48 MB/s uncypher 48 MB/s pascal version
AES256 cypher 62 MB/s uncypher 61 MB/s asm version
AES256 cypher 42 MB/s uncypher 42 MB/s pascal version

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

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

我使用此代码来加密和解密:

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

...和 ​​Delphi 2009。

最佳答案

简短回答:将始终为您使用最快的代码,具体取决于编译器和计算机。

长答案:

一次只能编译一个代码版本,要么是 pascal,要么是优化的 asm。它取决于在单元中运行时的条件定义,根据您的编译器版本(从 Delphi 5 到最新的 Delphi 或 FPC 版本)和 CPU 平台(如果有 Intel 或 ARM)自动设置。然后在运行时,在 Intel 上,可以检测和使用 AES-NI 硬件操作码,或者在 VIA 上,可以检测和使用 Padlock 硬件操作码。甚至 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 时,该单元有六种不同版本的算法:帕斯卡滚动、帕斯卡展开、不带 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 key 。我们建议使用 PBKDF2_HMAC_SHA256 来实现此目的(具有较高的整数)。

一些数字:

使用现代 CPU(包括 AES-NI),您将获得惊人的性能。当然,这是 Delphi/FPC 中最快的 native 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 上都非常快。

关于delphi - 如何从 SynCrypto 选择 AES 加密版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45352220/

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