From e3d39593edbbb3b6099c882bcc5e6ee16f58aadf Mon Sep 17 00:00:00 2001 From: zhsnew Date: Thu, 5 Dec 2024 16:23:11 +0800 Subject: [PATCH] =?UTF-8?q?SM4=E7=99=BD=E7=9B=92=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E7=AE=97=E6=B3=95=E4=BD=BF=E7=94=A8=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/features/img/wbsm4-compare.jpg | Bin 0 -> 77851 bytes docs/features/wbsm4.md | 93 ++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 docs/features/img/wbsm4-compare.jpg create mode 100644 docs/features/wbsm4.md diff --git a/docs/features/img/wbsm4-compare.jpg b/docs/features/img/wbsm4-compare.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36e08a85af70b5ddaad34f6d7723edcd80c50659 GIT binary patch literal 77851 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�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 a!Jj=LWVi+H+4MjC>oFrwe`}of=I|dwL=IH| literal 0 HcmV?d00001 diff --git a/docs/features/wbsm4.md b/docs/features/wbsm4.md new file mode 100644 index 0000000..0bfedcf --- /dev/null +++ b/docs/features/wbsm4.md @@ -0,0 +1,93 @@ +--- +sidebar_position: 20 +--- +# SM4白盒密码算法使用说明 + +## 方案说明 +SM4算法加密速度快、安全级别高,在数据安全领域应用广泛。使用SM4时需要保护好密钥,才能实现应用的数据安全,在资源受限没有硬件加密模块的终端设备中,尤其需要有技术手段保护密钥的安全性。白盒密码算法能够对密钥进行有效保护,即使攻击者对加密代码和应用运行环境完全控制情况下,也能防止原始密钥泄露。 + +SM4白盒密码算法的算法设计、密码分析国内有丰富的研究成果,铜锁参考这些研究成果确定了实现方案。2009年,肖雅莹等设计了首个SM4白盒方案(肖-来方案)[1], 2013年,林婷婷、来学嘉对该算法进行攻击分析[4], 证明了攻击过程的时间复杂度上界为247;2016 年, 白鲲鹏等构造了另外一个白盒实 +现 SM4 的方案(白-武方案)[2], 该方案与肖-来方案类似, 增大了分析的难度, 使用了更多的随机数来提高算法的混淆程度;2020年,姚思等人结合混淆密钥与查找表技术提出了一种内部状态扩充的白盒SM4实现方案 (White-box implementation of SM4 algorithm with Internal State Expansion, WSISE方案)[3],该方案显著提高了攻击者提取密钥的复杂度。2018年,潘文伦等进行了白盒方案分析[4],计算了肖-来方案、白-武方案的密钥搜索空间;2022年张跃宇进行了白盒SM4的分析与改进[5], 总结了白盒实现方案的安全性对比,参见下表[5]。 + +![image.png](img/wbsm4-compare.jpg) + +铜锁在SM4白盒算法实现选择了肖-来、白-武、WSISE三个方案,代码实现移植自Nexus-TYF的开源实现[6],对代码进行重构完成在Tongsuo内集成。原代码包含了底层的矩阵运算库,实现了三个白盒算法的block块加密接口,铜锁通过KDF接口进行加密白盒密钥产生,并通过EVP接口支持白盒密钥的加密应用,支持ECB、CBC、CFB、OFB、CTR、CTR、GCM模式。ECB、CBC、CFB、OFB模式解密数据时,仍需使用原始的SM4密钥。
+ +## 编译参数 +铜锁支持三种白盒算法模式,可根据需要通过编译参数开启:
+```shell +./config enable-wbsm4-xiaolai enable-wbsm4-baiwu enable-wbsm4-wsise +``` + +## 命令行使用 +命令行可以进行白盒密钥产生,支持ECB、CBC模式加密,支持CTR模式加密及解密:
+```shell +# 产生白盒密钥 +./apps/openssl kdf -kdfopt key:0123456789abcdeffedcba9876543210 -cipher wbsm4-xiaolai -out wbsm4.key -binary wbsm4kdf + +# ECB模式加密 +./apps/openssl enc -e -wbsm4-xiaolai-ecb -in data.bin -out data.enc -kbinary wbsm4.key +./apps/openssl enc -d -sm4-ecb -in data.enc -out data.dec -K 0123456789abcdeffedcba9876543210 + +# CTR模式解密 +./apps/openssl enc -e -sm4-ctr -in data.bin -out data.enc -K 0123456789abcdeffedcba9876543210 -iv 0123456789abcdeffedcba9876543210 +./apps/openssl enc -d -wbsm4-xiaolai-ctr -in data.enc -out data.dec -kbinary wbsm4.key -iv 0123456789abcdeffedcba9876543210 +``` + +## EVP接口使用 +通过EVP接口可以完成KDF白盒密钥产生,调用ECB、CBC、CTR、CFB、OFB、CTR、CTR、GCM等加密模式: +```c +/* KDF产生白盒密钥 */ +OSSL_PARAM params[3]; +params[0] = OSSL_PARAM_construct_utf8_string("key", "0123456789abcdeffedcba9876543210", 0); +params[1] = OSSL_PARAM_construct_utf8_string("cipher", "wbsm4-xiaolai", 0); +params[2] = OSSL_PARAM_construct_end(); + +EVP_KDF *kdf = EVP_KDF_fetch(NULL, "wbsm4kdf", NULL); +EVP_KDF_CTX *ctx = EVP_KDF_CTX_new(kdf); +rv = EVP_KDF_CTX_set_params(ctx, params); + +size_t wbsm4key_len = EVP_KDF_CTX_get_kdf_size(ctx); +unsigned char *wbsm4key = (unsigned char *)OPENSSL_malloc(wbsm4key_len); +rv = EVP_KDF_derive(ctx, wbsm4key, wbsm4key_len, NULL); + +/* CBC模式加密 */ +EVP_CIPHER *cipher = EVP_CIPHER_fetch(NULL, "wbsm4-xiaolai-cbc", NULL); +EVP_CIPHER_CTX *cipher_ctx = EVP_CIPHER_CTX_new(); +rv = EVP_CipherInit_ex(cipher_ctx, cipher, NULL, wbsm4key, iv, 1); + +rv = EVP_EncryptUpdate(cipher_ctx, out, &outlen, in, inlen); +``` + +## 性能参数 +SM4白盒密码算法密钥占用较大的存储空间,在应用过程中需要预留充足的内存、磁盘空间,参见三个算法的密钥长度:
+ +| 白盒密码算法 | 密钥长度(字节) | +|--------------|----------| +| wbsm-xiaolai | 153,248 = 150K | +| wbsm-baiwu | 34,079,776 = 32.51M | +| wbsm-wsise | 284,320 = 278K | + +相较于原生SM4算法,SM4白盒密码算法加密性能有下降明显,适合于数据量稍小的应用场景,参见如下性能对比: +```shell +./apps/openssl speed sm4 wbsm4-xiaolai wbsm4-baiwu wbsm4-wsise + +compiler: cc -fPIC -arch arm64 -O3 -Wall -DL_ENDIAN -DOPENSSL_PIC -D_REENTRANT -DOPENSSL_BUILDING_OPENSSL -DNDEBUG +CPUINFO: OPENSSL_armcap=0x7f + +The 'numbers' are in 1000s of bytes per second processed. +type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes +sm4-cbc 161737.30k 163101.08k 165667.02k 165818.14k 165284.52k 165128.87k +wbsm4-xiaolai-cbc 4489.72k 749.12k 750.45k 749.91k 747.97k 748.20k +wbsm4-baiwu-cbc 40326.22k 5084.16k 5115.89k 5154.13k 5134.38k 5133.65k +wbsm4-wsise-cbc 4366.73k 739.04k 740.51k 743.17k 745.47k 737.28k +``` +## 参考文献 +[1] 肖雅莹,来学嘉 白盒密码及SMS4算法的白盒实现
+[2] BAI Kunpeng,WU Chuankun A secure white-box SM4 +implementation
+[3] 姚思,陈杰 SM4算法的一种新型白盒实现
+[4] 林婷婷,来学嘉 对白盒SMS4实现的一种有效攻击
+[4] 潘文伦,秦体红,贾音,张立廷 对两个SM4白盒方案的分析
+[5] 张跃宇,徐东,陈杰 白盒SM4的分析与改进
+[6] https://github.com/Nexus-TYF