信息安全如此重要,国密算法(SM3)终于支持

作者简介

惠春阳
Intel 软件工程师,主要从事spdk,isa-l开发和存储
软件性能优化的工作。


















· · ·

国密算法.SM3

生活在信息时代的我们, 无时无刻不在产生和消费数据,而这些数据又无时无刻不处于被窃取和窥探的威胁之下。个人信息安全,关乎个人财产, 信用,社会关系,甚至生命。对于个人如此,信息安全对于国家更是至关重要。基于我国还没有独立自主的密码标准的背景下,自2012年以来,国家密码管理局以《中华人民共和国密码行业标准》的方式,陆续公布了SM2/SM3/SM4等密码算法标准及其应用规范。本文主要介绍SM3, 并会围绕以下几个方面展开:

  1. 关于SM3 密码标准

  2. 关于ISA-L 和 ISA-L Crypto

  3. ISA-L Crypto对SM3和其他哈希算法的支持

· · ·

◆ ◆ ◆ ◆

SM3密码标准

1

◆ ◆ ◆ ◆

SM3是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布,相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。2016年,成为中国国家密码标准(GB/T 32905-2016)。

“SM” 是“商密”的拼音首字母组合,表示它是仅用于商用加密场合等不涉及国家机密的密码加密标准。而本文主角SM3 则是商密算法中的单向散列哈希算法(HASH), 用以替代国际上的MD5/SHA 等哈希算法。

那么什么是哈希算法呢?哈希算法又可以称为散列算法,杂凑算法等。可以指任何用于将任意大小的数据映射到固定长度数据的算法。哈希算法主要用于数据加密,数据一致性检验和数据去重。加密的实现依赖于哈希算法的特性之一 – 单向性,即通过哈希函数处理,可以很容易地验证某些输入数据映射到的哈希值与期望的哈希值是否一致。但是如果输入数据未知,要通过已知的哈希值重建输入数据会变得非常困难。很多web服务通过哈希函数来对用户密码进行加密,这个时候获得的哈希值也称为指纹(fingerprint)。密码服务器只保存指纹,而不保存用户的密码。这样即使密码服务器被攻破,攻击者也无法获得用户的密码。数据去重和数据一致性检验的思路类似。就是对每个块数据产生一个短摘要, 对短摘要进行比对,如果短摘要相同,则表明数据相同。目前市面上使用较多的哈希算法包括MD5,SHA1,SHA256,SHA512等。

SM3输入长度不限,输出的杂凑值(hash value)长度为256 比特。与SHA256输出的杂凑值长度相同,并且可以认为能够提高相似的安全性(Reference: https://tools.ietf.org/id/draft-sca-cfrg-sm3-01.html)。高于MD5和SHA1的安全性。

SM3算法主要通过消息填充,消息扩展,和压缩函数来获得最终的结果。

▼ 消息填充▼

假如需要进行哈希计算的消息m的长度为l, 首先添加一个比特“1”在消息m的结尾,然后添加k个比特“0”,这里的k是满足

640?wx_fmt=png

的最小非负整数。

然后再在末尾继续添加用64比特二进制表示的消息m的原始长度l。至此,消息填充过程结束,填充后的消息表示为m',此时m' 的比特长度为512的倍数。

对消息队列的填充,各个哈希算法都是类似的,比如MD5,SHA等。

▼ 消息扩展▼

现在假设m'n 个512-bit 的块 B(0) ~ B(n-1)组成。因此每个 B(i) 可以被分成16个32-bit的word, 写作 ?0~ 15. 消息扩展就是为了从?0~ 15获得68个?, ? 0~ 67 和 64个 ?’,?’0 ~ ?’63。

这就需要利用下面的公式:

<<<<<<<<<<<<<<<

   for j = 16 to 67

       ? j = P1(? {j - 16}  XOR ? {j - 9} XOR (? {j - 3} <<< 15)) XOR (?{j - 13} <<<   7)  XOR ? {j - 6}

   end for

 

   for j = 0 to 63

     ? 'j = ? j  XOR ? {j + 4}

   end for

这里的P1 是标准里定义的置换函数。

▼ 压缩函数▼

这部分是SM3算法的核心,共64轮,运算复杂。

<<<<<<<<<<<<<<<

  for j = 0 to 63

    SS1 ← ((A <<< 12) + E + (Tj <<< (j mod 32))) <<< 7

    SS2 ← SS1 XOR (A <<< 12)

    TT1 ← FFj (A, B, C) + D + SS2 + ? 'j

    TT2 ← GGj (E, F, G) + H + SS1 + ? j

    D ← C

    C ← B <<< 9

    B ← A

    A ← TT1

    H ← G

    G ← F <<< 19

    F ← E

    E ← P0 (TT2)

  end for

这个公式里A,B,C,D,E,F,G,H都是32比特的字寄存器,SS1,SS2,TT1,TT2是32比特的中间变量。FF,GG是布尔函数,P0是置换函数。

最开始的A,B,C,D,E,F,G,H里面的值,由标准定义的IV(Initialized Value)填充,在63轮结束后获得的A,B,C,D,E,F,G,H,再与初始值做异或。这样就获得了一个B(i) 的哈希值。然后把这个获得哈希值作为IV继续计算后面B(i+1) 的哈希值直到完成。

关于标准的更多细节,本文不再展开,感兴趣的可以参考官方文档。

◆ ◆ ◆ ◆

关于ISA-L和ISA-L_crypto

2

◆ ◆ ◆ ◆

用过SPDK,DPDK的朋友们, 一定对ISA-L不陌生。SPDK在V19.01引入了ISA-L作为submodule来支持ISCSI CRC,DPDK在compress dev中也使用了ISA-L库中的IGZIP 作为默认的软件压缩方案。

ISA-L全称Intelligent Storage Acceleration Library,是一个主要面向存储领域的在IA架构上加速算法执行速度的函数库。目的在于解决特定于存储市场的计算需求。ISA-L通过使用高效的SIMD指令和专用指令,最大化的利用CPU的微架构来加速存储算法的计算过程。使用同步API,调用简单,所有性能优化都是面向单核,多线程使用简单安全。ISA-L底层函数都是使用手工汇编代码编写,调优。通过源码包中的C示例函数,可以非常容易的理解并整合到客户的软件系统中。ISA-L可以应用到多种操作系统中,它通过了在Linux,BSD以及Windows server上的测试,全面支持Intel 64位硬件平台。ISA-L中的算法函数覆盖了数据保护,数据完整性,数据安全,数据压缩以及数据加密。如纠删码erasure code的编解码运算;用于Raid的同位检查;保证数据传输一致性的CRC算法;数据加解密的AES算法;多种安全hash算法从MD5,SHA1到SHA512等。

ISA-L使用对于商业应用非常友好的BSD license, 所有代码都托管在GitHub上。而ISA-L_crypto 其实是ISA-L这个项目的一部分,只是代码分开存放了,主要是把负责加解密的AES算法和哈希算法放在一起,这部分也可以在GitHub上找到(https://github.com/intel/isa-l_crypto)。ISA-L在GitHub上(https://github.com/intel/isa-l)只存放分离了加解密相关部分的代码。因此,在GitHub上,ISA-L和ISA-L_crypto是平行的两个代码库,可以分开下载,编译,安装使用。在项目上,ISA-L_crypto是ISA-L的子集。后面如果没有特殊说明,都可以用ISA-L指代ISA-L_crypto.

◆ ◆ ◆ ◆

ISA-L Crypto 

对SM3和其他哈希算法的支持

3

◆ ◆ ◆ ◆

由于在GitHub上,ISA-L和ISA-L_crypto对应的功能不同,所以这两个发布新版本的时间也不同。在今年6月底,ISA-L v2.27发布。而ISA-L_crypto是在这个八月刚刚发布了v2.22。这次发布最重要的部分,就是加入了对于SM3哈希算法的支持。

信息安全如此重要,国密算法(SM3)终于支持_第1张图片

考虑库函数的一致性和可拓展性,SM3 的API和ISA-L提供的其他哈希函数的API使用起来完全一样。所有需要SM3来替代之前的MD5, SHA等哈希函数的应用,可以非常简单的去做API的替换。

不过需要注意的是, 这次的支持,只有对于base function的支持,并无优化,性能与openSSL所提供的并无差别。如果应用对于哈希算法的速度有更高的要求,可以考虑使用其他的哈希函数。

按照哈希算法的标准, 由于每一个块的哈希值的生成,都是通过对前一个块哈希值的异或运算得到的,因此想通过提高并行度来加速哈希计算并没有很好的办法。

ISA-L主要提供两种哈希算法的优化,一种是单核同时处理多个消息得到多个消息对应的标准哈希,另一种是快速计算单个长消息的哈希值,但是得到的不是标准哈希。

▼Multi-Buffer Hash▼

ISA-L通过使用多缓冲区哈希技术(multi-buffer hashing), 充分利用IA (Intel Architecture)架构和执行管道固有的并行性, 在单核心上同时计算多个哈希。ISA-L内部会有一个scheduler去做多工作的管理,尽量使SIMD寄存器是满的状态, 这样每次SIMD指令可以同时计算多个工作,来获得最大的性能。这样, 单次计算的时间成本, 可以获得多个消息的哈希值。ISA-L会自动根据CPUID指令,获得CPU SIMD 寄存器宽度,进而确定单次处理的最大消息数量。当然如果没有那么多需要计算的消息,哪怕只有一个消息,也会马上计算,不会盲等更多消息。

多缓冲区哈希技术获得的单个消息对应的哈希值,是标准的哈希值,与其他标准库或者工具计算得到的哈希值一样。

▼MultiHash▼

多哈希技术是为了快速计算单个长消息的哈希值。把单个长消息切割成多个数据段,假设消息长度为L, 一个数据段大小是B,并行的数据段数量为S,则L = B* S。把单个数据段,看成一个消息,这样,一个长消息,就变成了多个短消息。这个时候,对多个短消息,利用Multi-Buffer Hash技术,使用 SIMD高效处理这些短消息,产生S个哈希值,假设长度为D。我们把所有哈希值看作一个新的大小是S*D的消息,再对这个数据段进行新的哈希计算,直到生成最终的长度为D的摘要。

这种方法可以加速单个长消息的哈希运算,但是通过这种方式生成的哈希值,不是标准的哈希值,与其他标准库得到的哈希值不同。这种算法可以应用于单机哈希值计算,比如数据去重等场景。

◆ ◆ ◆ ◆

总结

4

◆ ◆ ◆ ◆

至此,我们介绍了国家商用杂凑密码算法SM3,以及ISA-L对于SM3和其他哈希算法的支持。信息安全至关重要,每个人,每个公司,每个国家在时刻面对信息安全风险的当今,都不能掉以轻心。如果对于我国商用密码感兴趣或者有更多需求,欢迎后台留言。

- END -

    转载须知   

 推荐阅读 

在虚拟机上部署SPDK NVME测试案例

SPDK NVMe Reservation使用简介

信息安全如此重要,国密算法(SM3)终于支持_第2张图片

你可能感兴趣的:(信息安全如此重要,国密算法(SM3)终于支持)