第12章中国商用密码算法标准由于密码算法对国家安全和社会稳定的高度敏感性,我国已建立了具有自主知识产权的密码算法体系。中国商用密码(SM)算法标准是由中国国家商用密码管理办公室权威发布的、面向商业应用的密码算法规范,在提供信息安全保障的同时,为信息安全产品生产商提供产品和技术的标准定位以及标准化的参考,以提高信息安全产品的可信性与互操作性。–祖冲之序列密码算法–SM2椭圆曲线公钥密码算法–SM3杂凑算法–SM4对称密码算法12.1祖冲之序列密码算法祖冲之序列密码算法(即ZUC算法)是第3代合作伙伴计划(3GPP)所规范的机密性算法128-EEA3和完整性算法128-EIA3的核心,是中国自主设计的序列密码算法。2009年5月祖冲之序列密码算法获得3GPP安全算法组(SA)立项,正式申请参加3GPPLTE第三套机密性和完整性算法标准的竞选工作。经过评估,于2011年9月正式被3GPPSA全会通过,成为3GPPLTE第三套加密标准核心算法祖冲之序列密码算法是中国第一个成为国际密码标准的密码算法。12.1.2算法描述祖冲之序列密码算法是一个面向字(word)的序列密码算法,它采用128比特的初始密钥和一个128比特的初始矢量(IV)作为输入,并输出以32比特的字为单位的密钥流(每32比特的字被称为一个密钥字)。密钥流可用于对明文进行加密/解密祖冲之序列密码算法的执行分为两个阶段:–初始化阶段:对密钥和初始矢量进行初始化,不产生输出;–工作阶段:每一个时钟脉冲产生一个32比特的密钥输出算法结构线性移位反馈寄存器LFSR具有16个31比特的单元(S0,S1,…,S15),每个单元均在集合{1,2,3,…,231-1}中取值。LFSR有两种模式的操作,即初始化模式和工作模式。初始化模式工作模式比特重组祖冲之序列密码算法的中间层是比特重组,从LFSR的单元中提取128比特的输出并形成4个32比特的字,前三个字(X0,X1,X2)将用于最底层的非线性函数中,而最后一个字(X3)会在密钥流的产生中用到。非线性函数F非线性函数有两个32位的存储单元,即R1和R2。令F的输入为X0,X1和X2,即为比特重组的前三个输出,函数F输出一个32位字W。S0盒S1盒S盒的使用方法线性变换函数密钥加载密钥的加载过程将把初始密钥和初始矢量扩展为16个31比特的整数作为LFSR的初始状态。设K为128比特的初始密钥,IV为128比特的初始矢量K和IV按如下步骤被载入LFSR的16个寄存器中01215,,,,ssss密钥流生成示例12.2SM2椭圆曲线公钥密码算法SM2椭圆曲线公钥密码算法以椭圆曲线及其相关运算为基础当使用有限域GF(p)时,要求奇素数p2191;当使用有限域GF(2m)时,要求m192且为素数SM2椭圆曲线公钥密码算法内容包括数字签名算法、密钥交换协议和公钥加密算法三个部分12.2.2数字签名算法图12.3数字签名算法生成流图12.4数字签名验证算法流程数字签名生成与验证示例GF(p)上的椭圆曲线数字签名12.2.3密钥交换协议SM2椭圆曲线公钥密码算法的密钥交换协议适用于商用密码应用中的密钥交换,可满足通信双方经过两次或可选三次信息传递过程,计算获取一个由双方共同决定的共享秘密密钥(会话密钥)密钥交换协议流程密钥交换与验证示例具体内容见教材12.2.4公钥加解密算法SM2椭圆曲线公钥密码算法适用于中国国家商用密码应用中的消息加解密,消息发送者可以利用接收者的公钥对消息进行加密,接收者用对应的私钥进行解密,获取消息加密算法及流程解密算法及流程消息加密与解密示例详见教材内容12.2.5推荐的曲线参数12.3SM3杂凑算法SM3杂凑算法适用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求SM3杂凑算法规定数据在内存中的表示为“左高右低”SM3杂凑算法可以作用于任意有限长度的比特串,输出杂凑值长度为256比特的比特串处理过程中所涉及字的长度为32比特算法中涉及的常数与函数12.3.2算法描述1.概述对长度为l(l264)比特的消息,SM3杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特。2.填充假设消息的长度为l比特。首先将比特“1”添加到消息的末尾,再添加k个“0”,k是满足l+1+k=448mod512的最小的非负整数。然后再添加一个64位比特串,该比特串是长度l的二进制表示。填充后的消息的比特长度为512的倍数。3.迭代压缩(1)迭代过程(2)消息扩展(3)压缩函数(4)杂凑值输出256比特的杂凑值nABCDEFGHVyABCDEFGH12.3.3示例设输入消息为“Appliedcryptography”,其ASCII码表示为:4170706c6965642063727970746f677261706879。根据本书附录C语言程序实现的SM3杂凑算法的计算过程如图12.9所示,所得其杂凑值为:e9cbdad7ceb64a2744e99c85b416b6a520982494c579145b0d8c8d7e1829c993。12.4SM4对称密码算法SM4密码算法是中国国家密码管理权威机构发布的国内第一个面向无线局域网WAPI产品使用的商用分组密码算法该算法的分组长度和密钥长度都是128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。12.4.1算法描述SM4算法以32位二进制数为一个字;以8位二进制数为一个字节。在SM4算法中采用了两个基本运算:⊕(32比特按位异或)和(32比特循环左移位)。SM4算法的加密密钥长度为128比特,SM4算法的加密密钥由4个32位的字组成。轮密钥由加密密钥基于相应的密钥扩展算法生成。密钥扩展算法中涉及到两类参数的使用:FK为系统参数,CK为固定参数,均使用32比特的字。i轮函数F01230123,,,,FXXXXrkXTXXXrk..TL01230123,,,,,,bbbbASboxaSboxaSboxaSboxa2101824CLBBBBBBS盒加密流程密钥扩展算法12.4.2加密示例以下为SM4算法ECB工作方式的两个运算示例,用以验证密码算法实现的正确性。其中,数据均采用16进制表示。示例一:对一组明文用密钥加密一次明文:0123456789abcdeffedcba9876543210加密密钥:0123456789abcdeffedcba9876543210密文:681edf34d206965e86b3e94f536e4246。示例二:利用相同加密密钥对一组明文反复加密1000000次明文:0123456789abcdeffedcba9876543210加密密钥:0123456789abcdeffedcba9876543210密文:595298c7c6fd271f0402f804c33d3f66。