山东大学软件工程应用与实践——GMSSL开源库(十二)——浅尝SM3

2021SC@SDUSC

先介绍一下HASH吧

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。(来自百度百科)

哈希函数由于其特性,在密码学中占有重要地位
由于具有前图像抗性和抗碰撞性,因此哈希函数非常适合用于存储密码。 因此,存储在数据库中的值是原始形式的用户ID和密码的哈希值。 因此,每当您将Id和密码输入系统时,它都会搜索user-Id(如果可用),它将与输入密码的哈希值和数据库中已经存在的密码匹配。 如果两者相同,则授予访问权限。

为了保持数据完整性,发送方将消息及其哈希值发送给用户。 然后,接收方检查消息的哈希值是否与发送方发送的哈希值相同。 这样可以确保在发送时未对数据进行任何修改。 完整性检查过程可以在电子邮件系统,消息传递应用程序等中看到。但是,由于一切都在后端进行,因此用户无法识别此过程。

签名通常用于将签名者绑定到消息。 因此,数字签名是将个人或实体绑定到数字数据的技术。 此绑定确保发送数据的人对此负全责,并且此绑定可以由接收方和第三方验证。 此数字签名也使用哈希函数存储,因此任何人的签名都不会被盗用或滥用。

SM3算法大致过程

简单来说就是:填充->迭代压缩->输出选裁,之后生成长度为256bit的杂凑值。

以下SM3算法过程来源于GMT 0004-2012 SM3密码杂凑算法.pdf

1、填充
在这里插入图片描述
在这里插入图片描述
2、迭代压缩
在这里插入图片描述
其中CF压缩函数内容比较复杂,也是SM3算法的主题内容之一。下面为CF函数的实现过程。在这里插入图片描述
在这里插入图片描述

GMSSL中SM3算法的实现

GMSSL中在实现了SM3散列函数的同时,也把SM3算法集成进了MAC即消息认证码中实现了基于SM3的HMAC函数。

\GmSSL-master\crypto\sm3\sm3.c文件定义了算法中的一系列函数,用于压缩函数的实现与计算。
在这里插入图片描述
经过一层层封装调用,最后集成了一个void sm3函数,其中实现了对消息块进行压缩的函数、CF函数的实现等底层函数,不再在此赘述。

void sm3(const unsigned char *msg, size_t msglen,
	unsigned char dgst[SM3_DIGEST_LENGTH])
{
	sm3_ctx_t ctx;

	sm3_init(&ctx);
	sm3_update(&ctx, msg, msglen);
	sm3_final(&ctx, dgst);

	memset(&ctx, 0, sizeof(sm3_ctx_t));
}

简单介绍一下消息认证码
消息认证码MAC可以简单的理解成带有密钥的哈希函数:密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。构造方法由M.Bellare提出,安全性依赖于Hash函数,故也称带密钥的Hash函数。消息认证码是基于密钥和消息摘要所获得的一个值,可用于数据源发认证和完整性校验。
在发送数据之前,发送方首先使用通信双方协商好的散列函数计算其摘要值。在双方共享的会话密钥作用下,由摘要值获得消息验证码。之后,它和数据一起被发送。接收方收到报文后,首先利用会话密钥还原摘要值,同时利用散列函数在本地计算所收到数据的摘要值,并将这两个数据进行比对。若两者相等,则报文通过认证。

一般的HMAC函数是基于MD5、SHA-1等国际主流HASH函数,王小云院士破解了MD5算法之后,基于MD5的MAC函数、签名等便不再安全。于是以王小云、李铮为主设计了SM3哈希算法,并基于SM3构造了SM3-HMAC函数,作为国密的MAC函数。
下面为HMAC的伪代码:

HMAC_k(m) = H((k ^ opad), H((k ^ ipad), m))
    function hmac(key, message)
  	opad = [0x5c * blocksize]
  	ipad = [0x36 * blocksize]
  	if (length(key) > blocksize) then
 		key = hash(key)
	end if
 	for i from 0 to length(key) - 1 step 1
 		ipad[i] = ipad[i] XOR key[i]
 		opad[i] = opad[i] XOR key[i]
 	end for
 	return hash(opad || hash(ipad || message))
  end function

与SM3算法的实现差不多,也是由init update final三个主要函数构成。整体架构并没有与国际上通用的HMAC函数有比较大的差别,就是把国际上的MD5和SHA-1算法换成了SM3算法,并嵌入了GMSSL中,可以与OPENSSL通用。

小结

由于MD5和SHA-1的破解,对新型更加安全的密码杂凑算法的需求更加迫切。美国在2010年之前逐步替换MD5和SHA-1,改用新型的SHA-224、SHA-256、SHA-384及SHA-512函数,而我国,经过王小云院士的努力,SM3应运而生。
SM3是我国自主研发的一种新型的哈希算法,打破了西方国家在哈希密码上的垄断。2018年11月22日,国家密码管理局公布我国的SM3杂凑密码算法已经进入到国际标准中,我国SM2/3/9密码算法正式成为ISO/IEC国际标准。
SM3算法适用于商用密码应用中的数字签名和验证,是在SHA-256基础上改进实现的一种算法。SM3算法采用Merkle-Damgard结构,消息分组长度为512位,摘要值长度为256位。SM3算法的压缩函数与SHA-256的压缩函数具有相似的结构,但是SM3算法的设计更加复杂,比如压缩函数的每一轮都使用2个消息字。现今为止,SM3算法的安全性相对较高。

哈希函数在密码学中的地位不必多说,而纯国产哈希函数SM3对于我国密码行业更是非常重要。在对GMSSL中SM3实现的源代码的分析以及上网搜集资料并学习的过程中,使我对SM3有了初步的认识,对于以后基于GMSSL编程的学习有一定的帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值