guanzhi / GmSSL

支持国密SM2/SM3/SM4/SM9/SSL的密码工具箱
http://gmssl.org
Apache License 2.0
4.97k stars 1.64k forks source link

SM4 cbc performance issue #1710

Open zhanghaiyang9999 opened 3 weeks ago

zhanghaiyang9999 commented 3 weeks ago

我用sm4_cbc_padding_encrypt测试了一下性能,和openssl的aes 256(EVP_aes_256_cbc)的性能进行了比较,每次加密的数据块大小为256K,在同一台机器上,同样的数据进行测试,先测试openssl,再测试sm4_cbc_padding_encrypt。 openssl的aes 256 cbc花费了2分30秒,sm4_cbc_padding_encrypt花费了5分57秒,都是经过三次测试,取平均值。

有办法进行提高性能吗? sm4_cbc_padding_encrypt的代码如下:

SM4_KEY key;
unsigned char ivec[16] = {0};
sm4_set_encrypt_key(&key, aeskey);
sm4_cbc_padding_encrypt(&key, ivec, indata, in_len, outdata, &out_len);

openssl aes256的代码如下: unsigned char ivec[16] = { 0 }; EVP_CIPHER_CTX* ctx = NULL; int len = 0; if (!(ctx = EVP_CIPHER_CTX_new())) { return false; } if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, aes_key, ivec)) { EVP_CIPHER_CTX_free(ctx); return false; }

if (1 != EVP_EncryptUpdate(ctx, outdata, &len, indata, in_len))
{
    EVP_CIPHER_CTX_free(ctx);

    return false;

}
out_len = len;

if (1 != EVP_EncryptFinal_ex(ctx, outdata + len, &len))
{
    EVP_CIPHER_CTX_free(ctx);

    return false;

}
out_len += len;

/* Clean up */
EVP_CIPHER_CTX_free(ctx);
emmansun commented 3 weeks ago

首先你要了解以下事实:

zhanghaiyang9999 commented 3 weeks ago

首先你要了解以下事实:

  • 目前大部分通用CPU架构都支持AES-NI,但是目前绝大部分通用CPU架构下尚没有SM4-NI 。纯软件实现达不到CPU指令级别实现的性能。
  • CBC加密是串行加密方法,现有的的一些优化方法(利用AES-NI、位切片等)大都是并行优化。

感谢! 除了cbc慢之外,别的sm4方式会不会快一些?

emmansun commented 3 weeks ago

首先你要了解以下事实:

  • 目前大部分通用CPU架构都支持AES-NI,但是目前绝大部分通用CPU架构下尚没有SM4-NI 。纯软件实现达不到CPU指令级别实现的性能。
  • CBC加密是串行加密方法,现有的的一些优化方法(利用AES-NI、位切片等)大都是并行优化。

感谢! 除了cbc慢之外,别的sm4方式会不会快一些?

你参考项目首页性能测试部分吧,也可以参考https://github.com/guanzhi/GmSSL/blob/e7354c1faa0aff418e180032f8e01cb39454bf20/INSTALL.md?plain=1#L75 自己编译测试。粗略看了一下源代码,目前好像就ECB、CTR、CTR32以及应用CTR32的GCM有优化。