Arm64架构下的加密库
密码学是通过数学技术保护通信和数据安全的科学,确保机密性、完整性和真实性。它广泛应用于Web服务、负载均衡代理、数据库等领域。
密码学
密码学可分为三大类:
对称密钥密码学
也称为秘密密钥加密,该方法使用相同的密钥进行加密和解密。流行的对称密钥算法包括高级加密系统(AES)、数据加密系统(DES)、ChaCha20、SM1和SM4。
非对称密钥密码学
该方法使用两个密钥或密钥对:公钥和相应的私钥。公钥公开分发,任何人都可以使用它来加密消息,但只有持有相应私钥的接收者才能解密这些消息。
非对称密钥密码学中流行的算法有Rivest–Shamir–Adleman(RSA)、数字签名算法(DSA)、椭圆曲线密码学(ECC)、Diffie-Hellman(DH)和SM2。
哈希函数
哈希函数用于将任意大小的明文数据转换为固定大小的唯一密文或"指纹"。它常用于消息认证、数据完整性检查和数字签名。示例包括MD5、SHA-1、SHA-2、SHA-3和SM3。
密码套件
密码套件是通过传输层安全(TLS,也称为安全套接字层SSL)实现安全网络连接的指令集。这些套件提供了保护客户端和服务器之间通信所需的一组算法和协议。
在SSL连接初始化期间,Web服务器和客户端执行SSL握手。这涉及双方商定一个共同的密码套件,用于协商安全的HTTPS连接。
密码套件包含四个组件:密钥交换算法、认证、密钥加密算法和消息认证算法。例如,“ECDHE-ECDSA-AES256-GCM-SHA384"密码套件表示ECDHE用于密钥交换,ECDSA用于认证,AES256-GCM用于加密,SHA364用于消息完整性。
开源加密库
在本节中,我们将列出数据中心工作负载中最广泛使用的加密库。
OpenSSL
仓库: https://github.com/openssl/openssl/
OpenSSL是一个通用密码库。它是最常用的加密库,预装在大多数操作系统发行版中。它实现了基本的加密算法并支持不同的硬件架构。不同操作系统发行版提供的OpenSSL版本可能有所不同,包括1.1.1、3.0.x、3.1.x和3.2.x。当前的LTS版本是3.0。
BoringSSL
仓库: https://github.com/google/boringssl
BoringSSL是OpenSSL的一个分支,旨在满足Google的需求。它不适用于一般用途,因为不保证API或ABI稳定性。
AWS-LC
仓库: https://github.com/aws/aws-lc
AWS-LC是由AWS加密团队为AWS及其客户维护的通用密码库。它基于Google BoringSSL项目和OpenSSL项目的代码。AWS-LC为x86和Arm处理器添加了几项优化。
AArch64cryptolib
仓库: https://github.com/ARM-software/AArch64cryptolib
AArch64cryptolib是一个"从头开始"实现的密码原语,旨在在Arm A级核心上实现最佳性能。该库目前支持AES-GCM和AES-CBC优化代码。OpenSSL提供AES-GCM和AES-CBC实现,但在Arm Neoverse N1、Arm Neoverse V1、Ampere Altra和AmpereOne处理器上,AArch64cryptolib的性能同样出色。
IPSec MB
仓库: https://gitlab.arm.com/arm-reference-solutions/ipsec-mb
这是用于Arm64处理器上IPSec的多缓冲区加密库。它基于intel-ipsec-mb库,并在Arm64上提供SNOW3G和ZUC算法。这些算法广泛用于电信和5G工作负载。
在某些数据包处理工作负载的使用案例中,这些加密库与DPDK加密轮询模式驱动程序(PMD)结合使用。请参阅此调优指南了解详情。
Ampere处理器上的加密库性能
在本节中,我们将比较不同库在Ampere处理器上的性能。
Ampere Altra系列
Ampere Altra系列产品旨在满足现代云原生计算环境的需求,具有可预测的性能和从32到128不等的核心数量。这些处理器与Armv8.2+ ISA兼容。
上面列出的所有开源库都为Ampere Altra系列处理器提供了良好的支持。
让我们首先在Altra Max M128-30的单核上使用AWS-LC中提供的bssl工具比较OpenSSL 3.3.0和AWS-LC(主代码,提交ID 9921cd9)。
图1和图2显示AWS-LC可以为RSA和ECDSA签名和验证提供更好的性能。
ECDSA是非对称签名的首选。
图3和图4显示,对于小数据块(16字节、256字节、1350字节)的AES-CTR和AES-GCM,AWS-LC优于OpenSSL 3.3.0;对于ChaCha20-Poly1350和大数据块(8192字节、16384字节)的AES-GCM,OpenSSL 3.3.0更优。
AES是对称加密和解密的首选。
AmpereOne处理器系列
AmpereOne处理器提供高达192个核心,与Armv8.6+ ISA兼容。SHA3、SHA512和RNG的支持提高了密码学性能。
OpenSSL在此提交中优化了AmpereOne的性能,该优化从版本3.4.0开始。要在OpenSSL 3.2.x或3.3.x上获得更好的性能,需要进行反向移植。请参阅此存储库获取补丁。
AWS-LC库没有针对AmpereOne的特定优化。要在AmpereOne上获得更好的性能,请参阅此分支。
我们将比较三个不同的库:
- OpenSSL 3.3.0-opt:带有AmpereOne优化的OpenSSL 3.3.0
- AWS-LC:AWS-LC库,提交ID 9921cd9
- AWS-LC-opt:带有AmpereOne优化的AWS-LC库
图5和图6显示,在RSA签名方面,AWS-LC-opt提供与OpenSSL 3.3.0相当的性能,但在RSA验证和ECDSA算法方面性能更优。
图7和图8显示,对于AES-GCM和AES-CTR,AWS-LC-opt比OpenSSL-3.3.0-opt提供更好的性能。而OpenSSL-3.3.0-opt在ChaCha20-Poly1305方面表现更好。
核心数量性能扩展
在延迟敏感的用例(如Web服务器)中,每核心密码性能对于更快的TLS握手性能至关重要。同样,在处理器级别,密码的性能和可扩展性也很重要,尤其是在扩展核心数量时。
在本节中,我们将使用OpenSSL库提供的速度测试来展示AmpereOne A192-32X处理器上核心数量的性能扩展,并与类似级别的处理器比较可扩展性。
以下命令用于测试具有不同线程数的1024字节AES-128-GCM吞吐量。“numactl"用于将测试亲和性设置为等于openssl线程数的核心数。
|
|
作为参考,我们比较了AmpereOne A192-32X与AMD Genoa 9654;两种处理器都有192个线程。在AmpereOne上,每个线程都是一个物理核心,但在AMD Genoa上,有96个物理核心,每个核心有2个同步多线程(SMT)。由于底层技术限制,SMT在超过50%时可能导致扩展性不佳。
图9显示了AmpereOne处理器上核心数量的线性性能扩展。如图10所示,这种线性性能扩展使AmpereOne A192-32X的吞吐量比AMD Genoa 9654高出1.37倍。
总结
从性能角度来看,建议在数字签名中优先选择ECDSA而非RSA。ECDSA通常提供更好的性能和安全效率,特别是对于较小的密钥大小,与RSA相比可以带来更快的签名生成。
对于对称加密和解密,应优先选择AES-GCM而非ChaCha20-Poly1305。
在使用加密库时,建议使用包含AmpereOne架构优化的OpenSSL或AWS-LC版本。这些优化利用AmpereOne处理器的新特性来提升性能。
此外,应优先选择AWS-LC而非OpenSSL,因为AWS-LC通过不同的实现提供了额外的性能优势。
最后,AmpereOne上的加密性能随核心数量线性扩展。这意味着当使用更多核心时,AmpereOne可以带来更多好处。
参考文献
https://www.geeksforgeeks.org/what-is-a-symmetric-encryption/ https://www.geeksforgeeks.org/asymmetric-key-cryptography/ https://www.geeksforgeeks.org/cryptography-hash-functions/ https://amperecomputing.com/tuning-guides/dpdk-cryptography-build-and-tuning-guide https://amperecomputing.com/products/processors https://github.com/openssl/openssl https://github.com/aws/aws-lc/ https://github.com/ARM-software/AArch64cryptolib https://gitlab.arm.com/arm-reference-solutions/ipsec-mb https://github.com/AmpereComputing/openssl https://github.com/AmpereComputing/aws-lc/tree/dev-ampereone