Gmssl库的aes算法效率问题
aes的算法效率问题总结
GmSSL 本身是基于 OpenSSL 的一个国密改造版,但它并不是 OpenSSL 的完整克隆,而是有以下几个特点,正是这些导致了它 “比 OpenSSL 慢” 的根本原因:
🚧 GmSSL 为什么比 OpenSSL 慢?
🧱 1. GmSSL 移除了硬件加速相关代码
-
GmSSL 项目主打国密算法(如 SM2、SM3、SM4 等),为简化结构或规避某些合规风险,有意移除了与 Intel AES-NI、ARM Crypto Extensions 等相关的硬件加速指令代码。
-
所以哪怕你的 CPU 支持
aes
指令集,GmSSL 也不会调用硬件加速逻辑,而是回退到纯 C 实现。
📌 这与 OpenSSL 完全不同:OpenSSL 会根据 CPU 特性启用如 aesni-x86_64.asm
、vpaes
等汇编优化模块,极大提升性能。
🔄 2. 缺少平台优化汇编
-
GmSSL 移除了大量 OpenSSL 中用于 x86_64 和 ARM 的手写汇编优化代码,例如:
-
aesni-x86_64.s
-
aes_core.c
中与平台高度相关的代码段
-
-
这意味着 AES 加解密在 GmSSL 中走的只是一个最基本的 C 语言参考实现。
🧪 3. 主要开发目标不是 AES,而是国密算法
-
GmSSL 的目标用户是对国密(SM 系列)算法有需求的单位或个人。
-
AES 在 GmSSL 中是“兼容保留”的,更多是为了兼容 OpenSSL 接口或做国密混合应用,不是性能优化重点。
解决方法建议
✔️ 方案一:混用 OpenSSL 和 GmSSL
-
使用 OpenSSL 执行高性能 AES 加解密。
-
使用 GmSSL 执行 SM2/SM4 等国密操作。
(两者 API 接口类似,代码切换成本不高。)
✔️ 方案二:在 GmSSL 中补回 AES-NI 支持
-
如果愿意折腾,可以从 OpenSSL 中复制
aesni.c
、vpaes
等文件,按平台条件重新集成回 GmSSL。 -
然后用
-maes
编译并手动链接。
⚠️ 但这会引入一些“非国密合规”模块,可能违背使用 GmSSL 的初衷。
好吧,用屁股想了一下,决定使用方案一!~操作之前如果有xp需求,请看一下末尾,免得白费力气
具体操作
先封装一下aes的ctr模式用法
gmssl_use.h
#ifndef _GMSSL_USE_H_
#define _GMSSL_USE_H_#include <stddef.h>
#include "ztype.h"#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/rand.h>typedef enum AES_