杨元原博士国密课堂 · 第二期 | 商用密码应用安全性评估:Part2. 商用密码算法
本期主讲人
杨元原 博士 国家网络与信息系统安全产品质量监督检验中心(公安部第三研究所)商用密码应用安全性评估负责人
对称密码算法
(1)分组密码算法及工作模式
(1.1)分组密码算法
SM1密码算法:SM1算法是国家密码管理局认可的一种分组密码算法,分组长度、密钥长度都是128bit,但是算法不公开,仅以IP核的形式存在于芯片中,需要通过加密芯片的接口进行调用。
采用该算法的密码产品包括安全芯片、智能IC卡、智能密码钥匙、加密卡、加密机等,该算法广泛应用于电子政务、电子商务及国民经济的各个领域。
SM4密码算法:算法采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
SM4密码算法于2012年3月21日发布,相关的标准包括:《GM/T 0002-2012 SM4分组密码算法》、《GB/T 32907-2016 信息安全技术 SM4分组密码算法》。该算法的基本原理如下图所示(图1):
(图1)
算法采用了典型的Feistel密码结构,采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭代运算均为一轮变换函数F。
算法原理如下图所示(图2):
(图2)
SM7对称密码:SM7算法是一种分组密码算法,分组长度为128比特,密钥长度为128比特。SM7的算法目前没有公开发布。SM7适用于非接IC卡应用,包括身份识别类应用(门禁卡、工作证、参赛证),票务类应用(大型赛事门票、展会门票),支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通、公交一卡通)。
(1.2)分组密码工作模式
即使有了安全的分组密码算法,也需要采用适当的工作模式来隐蔽明文的统计特性、数据的格式等,以提高整体的安全性,降低删除、重放、插入和伪造成功的机会。因此,分组密码有不同的工作模式,包括电码本(ECB)模式、分组链接(CBC)模式、密码反馈(CFB)模式、输出反馈(OFB)模式、计数器(CTR)模式、分组连接(BC)模式等工作模式。分组密码的工作模式依据的标准为:《GB/T 17964-2008 信息安全技术 分组密码算法的工作模式》。其中比较常见的是电码本模式和分组链接模式。
电码本模式:电码本模式直接利用加密算法分别对分组数据组加密。在给定的密钥下同一明文组总产生同样的密文组。这种方式会暴露明文数据的格式和统计特征,由于重要的数据常常在同一位置上出现,使密码分析者可以对其进行统计分析、重传和代换攻击(图3)。
(图3)
分组链接模式:在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。密文分组像链条一样相互连接在一起(图4)。
(图4)
各种工作模式的比较如下表所示(图5):
(图5)
(1.2)SM4密码算法示例
SM4密码算法的分组长度为128比特,密钥长度为128比特。但是由于密钥需要保密,因此SM4密码算法无法从正向进行验证,只能通过特征比对(如加密数据长度)的方式进行算法验证,并结合其他证据,如密码机的算法调用日志、密码机Wireshark数据包抓包等,来验证算法的合规性。由于SM4密码算法的分组长度为128比特,因此SM4密文长度必然是128比特的倍数,如下图所示(图6)。
(图6)
(2)流密码算法
(2.1)祖冲之算法(ZUG)
祖冲之密码算法主要用于下一代移动通信中,可用来对语音或视频数据加密。祖冲之密码算法(ZUC)的名字源于我国古代数学家祖冲之,能够实现加密和完整性保护。ZUC算法由3个基本部分组成,依次为:1、比特重组;2、非线性函数F;3、线性反馈移位寄存器(LFSR)。具体算法可查看《GM/T 0001.1-2012 祖冲之序列密码算法:第1部分:算法描述》、《GM/T 0001.2-2012 祖冲之序列密码算法:第2部分:基于祖冲之算法的机密性算法》、《GM/T 0001.3-2012 祖冲之序列密码算法:第3部分:基于祖冲之算法的完整性算法》等标准。
非对称密码算法
(1)SM2密码算法
(1.1)SM2密码算法原理
SM2算法采用ECC椭圆曲线密码机制,但在签名、密钥交换方面不同于ECDSA、ECDH等国际标准,而是采取了更为安全的机制。国密SM2算法标准《GB/T 32918 信息安全技术 SM2椭圆曲线公钥密码算法》共包括5个部分,第1部分为总则,主要介绍了ECC基本的算法描述,包括素数域和二元扩域两种算法描述;第2部分为数字签名算法,包括数字签名生成算法和验证算法;第3部分为密钥交换协议,可满足通信双方经过两次或三次信息传递,计算获取一个共享秘密密钥;第4部分为公钥加密算法,包括加密算法和解密算法;第5部分为参数定义,主要规定了SM2椭圆曲线公钥密码算法的曲线参数。
SM2加密算法:根据《GB/T 32918.4-2016信息安全技术 SM2椭圆曲线公钥密码算法 第4部分:公钥加密算法》的要求,SM2加密算法流程如下。
设需要发送的消息为比特串,为的比特长度。为了对明文进行加密,加密方应实现以下运算步骤:(图7)。
(图7)
SM2签名算法:根据《GB/T 32918.2-2016信息安全技术 SM2椭圆曲线公钥密码算法 第2部分:数字签名算法》的要求,SM2签名算法流程如下。
设待签名的消息为,为了获取消息M的数字签名,签名方A应实现以下运算步骤(图8):
(图8)
(1.2)SM2密码算法示例
SM2公钥加密算法验证:根据SM2加密算法的工作原理,SM2加密算法每次加密数据时都会产生随机数k,而k的值外部无法获知,因此无法对算法进行正向验证。因此,只能通过特征比对(加密数据长度)的方式进行算法验证,并结合其他证据,如密码机的算法调用日志、密码机Wireshark数据包抓包等,来验证算法的合规性。
此外,由于每次加密都会生成不同的随机数k,因此,即使相同的明文,每次生成的密文也不相同。
根据《GB/T 36322-2018 信息安全技术 密码设备应用接口规范》要求,ECC加密数据的结构为(图9):
(图9)
在示例中,待加密的明文数据为:123。
在密文中,X分量和Y分量的值为:
000000000000000000000000000000000000000000000000000000000000000016B929CCC3A2C98C688784A89CF85B8DEA40EA5227D81C6118ED22C0789D88C30000000000000000000000000000000000000000000000000000000000000000180B26547035F156C28921E7AFBB32AF5975DEC56B485E26879B680116E92F4A,长度为1024字节。
明文的杂凑值为:
34D08BB25CA811482A4B3B51B491DFDA0569A9D6A7C50651313ED5F134BC6A4B,长度为256字节。
密文数据长度为:
03000000
密文数据为:
96E7E200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000。
SM2签名算法验证:由于待签名数据、SM2公钥和签名数据都能够获取,因此可以使用合规的工具,对SM2签名算法进行正向验证。
根据《GB/T 36322-2018 信息安全技术 密码设备应用接口规范》要求,ECC签名数据的结构为(图10):
(图10)
(2)SM9密码算法
SM9是基于标识密码算法,标准为《GM/T 0044 SM9 标识密码算法》,共包含5个部分,包括总则、数字签名算法、密钥交换协议、密钥封装机制和公钥加密算法、参数定义。SM9不同于传统意义上的SM2算法,它利用椭圆曲线对的双线性性质,构造出安全性和实现效率兼顾的标识密码,也就是公钥与用户的身份标识相关,省去了证书管理。
SM9数字签名算法适用于接收者通过签名者的标识验证数据的完整性和数据发送者的身份,也适用于第三方确定签名及所签数据的真实性。密钥交换协议可以使用通信双方通过双方的标识和自身的私钥经过两次或者可选三次信息传递过程,计算获取一个由双方共同决定的共享秘密密钥。公钥加密和解密算法基于标识的非对称秘密算法,该算法使消息发送者可以利用接收者的标识对消息进行加密,唯有接收者可以用相应的私钥对该密文进行解密。
(3)杂凑算法
(3.1)SM3密码算法原理
SM3密码算法能够产生256比特的杂凑值。该算法为不可逆的算法。《GB/T 32905-2016 信息安全技术 SM3密码杂凑算法》给出了杂凑函数算法的计算方法和计算步骤,并给出了运算示例。该算法适用于数字签名和验证、消息认证码的生成与验证等,可满足多种密码应用的安全需求。SM3算法对输入长度小于2的64次方的比特消息,经过填充和迭代压缩,生成长度为256比特的杂凑值,其中使用了异或、模、模加、移位、与、或、非运算,由填充,迭代过程,消息扩展和压缩函数所构成。
SM3算法包括预处理、消息扩展和计算Hash值三部分。预处理部分由消息填充和消息分组两部分组成。首先将接收到的消息末尾填充一个“1”, 再添加若干个“0”,使得填充后的数据成为满足length = 448mod512bit的数据长度,再在末尾附上64bit消息长度的二进制表示数, 然后将消息分成512bit的子块,最后将每个512bit的消息子块扩展成132个字用于Hash值的计算。SM3算法计算流程图如图所示(图11)。
(图11)
SM3算法的Hash运算主要是在压缩函数部分,压缩函数共包含64轮,每轮包括12步运算,64轮循环计算结束后,再将计算结果与输入到本轮计算的初始数据进行异或运算,即上一次Hash运算的Hash值输出与输入到本轮计算的初始数据异或得到本次Hash值输出。
(3.2)SM3密码算法示例
对于任意长度的输入,SM3杂凑算法将产生256比特的杂凑值。因此,可以进行正向的比对验证,确认是否使用了SM3算法进行保护(图12)。
(图12)
但是,如果仅仅使用SM3算法,无法防止数据被篡改,因此通常使用HMAC-SM3对数据进行完整性保护。由于HMAC算法需要使用密钥,因此,无法通过正向进行验证,只能通过特征比对(杂凑数据长度)的方式进行算法验证,并结合其他证据,如密码机的算法调用日志、密码机wireshark数据包抓包等,来验证算法的合规性。由于SM3密码算法的杂凑数据长度为256比特,因此HMAC-SM3杂凑数据的长度也是256比特。
(来源:国家网安检测中心)