标准内容
ICS35.040
中华人民共和国国家标准
GB/T15852.3—2019
信息技术
安全技术
消息鉴别码
第3部分:采用泛杂函数的机制
Information technology-Security techniques-Message authenticationcodes(MACs)Part 3:Mechanisms usinga universal hash-function(ISO/IEC9797-3:2011,MOD)2019-08-30发布
国家市场监督管理总局
中国国家标准化管理委员会
2020-03-01实施
GB/T15852.3-2019
规范性引用文件
术语和定义
4符号和缩略语
缩略语
一般模型
Badger
Poly1305
附录A(资料性附录)
附录B(资料性附录)
附录C(资料性附录)
参考文献
测试向量
泛杂凑函数的安全性信息
ZUC和SM4算法的抗攻击能力
GB/T15852《信息技术安全技术消息鉴别码》分为以下3个部分:第1部分:采用分组密码的机制;第2部分:采用专用杂凑函数的机制;第3部分:采用泛杂凑函数的机制。本部分为GB/T15852的第3部分。本部分按照GB/T1.1一2009给出的规则起草。GB/T15852.3—2019
本部分使用重新起草法修改采用ISO/IEC9797-3:2011《信息技术安全技术消息鉴别码第3
部分:采用泛杂凑函数的机制》。本部分与ISO/IEC9797-3:2011相比存在结构变化,将6.3.3.1调整为6.3.3,6.5.3.1调整为6.5.3。本部分与ISO/IEC9797-3:2011的主要技术性差异及其原因如下:关于规范性引用文件,本部分做了具有技术性差异的调整,以适应我国的技术条件,调整的情况集中反映在第2章“规范性引用文件”中,具体调整如下:·用等同采用国际标准的GB/T15852.1一2008代替了ISO/IEC9797-1;·删除了ISO/IEC18031、ISO/IEC18033-3、ISO/IEC18033-4;·增加了GB/T32907--2016、GB/T33133.1-—2016、GB/T36624—2018。在第3章中删除了密钥、素数两个常规性术语和定义。在第4章中增加缩略语部分。
在6.3.1中根据ZUC算法对初始向量的要求,将Badger的64位全1初始向量修改为128位全1初始向量。
删除规范性附录A对象标识符(因为缺少国内相关对象标识符定义)。本部分做了下列编辑性修改:
调整资料性附录B为资料性附录A,列举了在底层采用ZUC或SM4算法的MAC算法所生成的测试向量;
调整资料性附录C为资料性附录B,介绍了泛杂函数的安全性信息;增加资料性附录C,介绍了ZUC和SM4算法的抗攻击能力。请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。本部分由全国信息安全标准化技术委员会(SAC/TC260)提出并归口。本部分起草单位:中国科学院软件研究所、中国科学院数据与通信保护研究教育中心、北京邮电大学、成都卫士通信息产业股份有限公司。本部分主要起草人:张立廷、吴文玲、张蕾、睦晗、温巧燕、王鹏、金正平、彭真、秦体红。I
1范围
信息技术安全技术消息鉴别码
第3部分:采用泛杂凑函数的机制GB/T15852.3—2019
GB/T15852的本部分规定了4种采用泛杂漆函数的消息鉴别码算法:UMAC、Badger、Poly1305和GMAC。这些算法基于GB/T.33133.1—2016中规定的序列密码算法和GB/T32907—2016中规定的分组密码算法,或符合国家规定的其他序列密码算法和分组密码算法,使用一个密钥和一个泛杂凑函数处理一个长度为m位的比特串,输出一个长度为n位的比特串作为MAC。本部分适用于安全体系结构、进程及应用的安全服务。这些算法可以作为数据完整性机制,用于检“验数据是否在未经授权的方式下被更改。也可以作为消息鉴别机制,确保消息来自于拥有密钥的实体。数据完整性机制和消息鉴别机制的强度由以下指标决定:密钥的长度(按比特)与保密性、泛杂凑函数产生的杂凑码的长度(按比特)、泛杂函数的强度、MAC的长度(按比特),以及具体的机制。注;提供完整性服务的一般框架在ISO/IEC10181-6中指定。2规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。GB/T15852.1一2008信息技术安全技术消息鉴别码:第1部分:采用分组密码的机制(ISO/IEC9797-1:1999,IDT)
GB/T329072016信息安全技术SM4分组密码算法GB/T33133.1一2016信息安全技术祖冲之序列密码算法第1部分:算法描述GB/T36624-2018·信息技术安全技术·可鉴别的加密机制3术语和定义
GB/T15852.1一2008界定的以及下列术语和定义适用于本文件。3.1
空串emptystring
长度为零的比特串。
临时值nonce
使用一次的值,用于向MAC算法提供新鲜输入。3.3
标签tag
MAC算法的结果,附加一个可能的加密消息以提供完整性保护。3.4
universalhash-function
泛杂凌函数
由密钥确立的映射,将一定范围内任意长比特串映射到定长比特申,满足:对于所有不同的输入,其1
GB/T15852.3—2019
输出在密钥均匀随机的前提下发生碰撞的概率极小。注:泛杂凑函数由Carter和Wegman提出[\,其在MAC算法中的应用最早由Wegman和Carter描述(]4
符号和缩略语
4.1符号
下列符号适用于本文件。
bit(S,n)
bitlength(S)
bitstr2uint(S)
若比特串S的第n个比特是1则输出整数1,否则输出整数0(索引从1开始)
比特串S的比特长度
-个非负整数,其二进制表示为比特串S。形式化地,若S的长度为t比特,则bitstr2uint(S)=2*-1*bit(S,1)+2*-2*bit(S,2)+..+2*bit(S,t-1)+bit(S,t)
注1:比特申是以高位顺序排列的,也就是说,第一个比特为最高位。blocklen
Enc(K,X)
keylen
octetlength(S)
octetstr2uint(S)
底层分组密码的分组长度(按字节计)向上取整操作,也就是说,若是个浮点数,则ceil(z)是满足n≥工的最小的整数n
明文分组X在密钥K的作用下通过分组密码Enc进行加密向下取整操作,也就是说,若是一个浮点数,则floor(z)是满足n≤工的最大的整数n
杂凑值
主密钥
加密密钥
杂凑密钥
分组密码的密钥长度(按字节计)二进制对数函数
指定参数中的最大值
临时值
比特串S按字节计的长度(假定S的比特长度是8的倍数)定义为S[0]+28*S[1]+21*S[2]++2%-8*S[n-1]的非负整数,其中n=octetlength(S)
注2:字节串是以低位顺序排列的,即第一个字节为最低位prime(n)
对任意正整数n,小于2\的最大素数值注3:本部分使用的素数如表1所示。2
prime(n)
23-—5
218159
2130——5
素数值
GB/T15852.3—2019
prime(n)的十六进制表示
0xFFFFFFFB
0x0000000FFFFFFFFB
0xFFFFFFFFFFFFFFC5
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF610x00000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB比特串S的第i个字节(索引从0开始)注4:6.2中关于UMAC的条款使用了一个起始为1而不是0的索引。S[ij]
taglen
uint2bitstr(,n)
uint2octetstr(r,n)
zeropad(S,n)
由S的第i个到第i个字节组成的子串标签的字节长度
长度为n的字节串S,满足bitstr2uint(S)=长度为n的字节串S,满足r=octetstr2uint(S)比特分组X的左截断:若X的比特长度大于或等于s,则XI,是由X最左侧的s个比特组成的长度为s位的比特分组比特分组X的右截断:若X的比特长度大于或等于s,则X是由X最右侧的s个比特组成的长度为s位的比特分组比特分组X右移一位:Y=X》1最左侧的比特恒为0X的比特长度
对于非负整数n,用零比特对比特串S进行填充,直到其长度是最接近的n个字节的整数倍。形式化地,zeropad(S,n)=ST,其中T是满足SIT非空并且n可以整除octetlength(ST)的最短的零比特串(T可能为空)
比特串的比特级逻辑异或运算。若A,B是长度相等的比特串,则A④B表示A和B的比特级逻辑异或所形成的比特串比特串的比特级逻辑与运算。若A,B是长度相等的比特串,则AΛB表示A和B的比特级逻辑与所形成的比特串两个32位的比特串的加法运算,得到一个32位的比特申。形式化地,S+T=uint2bitstr(bitstr2uint(S)+bitstr2uint(T)mod2,4)两个64位的比特串的加法运算,得到一个64位的比特串。形式化地,S+T=uint2bitstr(bitstr2uint(S)+bitstr2uint(T)mod2*,8)整数的乘法运算
两个64位的比特串的乘法运算,得到一个64位的比特串。形式化地,ST=uint2bitstr(bitstr2uint(S)*bitstr2uint(T)mod2,8)注5:十a,十6和*运算与在现代计算机上可以高效执行的加法和乘法运算有着很好的对应。3
GB/T15852.3—2019
两个比特串的级联。若A和B分别是长度为α位和6位的比特串,则AⅡB是长度为(a十b)位的比特串,其中最左侧的α位是比特串A,最右侧的b位是比特串B
由n个0组成的比特串
由n个1组成的比特串
域GF(212)上的乘法,定义GF(2128)的多项式为1十α十α十α\十α128注6:令U和V是两个128位的比特串。则128位的比特串W=U·V可以如下计算;a)令W=0\,Z=U.
b)对于i=1,2,,128,执行以下两个步骤;1)若bit(V,i)=1,则令W=WZ;
2)若bit(Z,128)=0,则令Z=Z》1;否则令Z=(Z》1)(1110000101\)。4.2缩略语
下列缩略语适用于本文件。
ENH:增强的非线性杂凑函数(EnhancedNon-linearHash-function)GMAC:伽罗华消息鉴别码(GaloisMessageAuthenticationCode)KDF:密钥流生成函数(key-derivationfunction)MAC:消息签别码(MessageAuthenticationCode)NH:非线性杂漆函数(Non-linearHash-function)PDF:填充生成函数(pad-derivationfunction)UMAC:泛杂凑消息鉴别码(Universal-HashMessageAuthenticationCode)一般模型
采用泛杂凑函数的消息鉴别码算法使用了一种加密算法(分组密码算法、序列密码算法或伪随机生成器算法)。这类消息鉴别码算法具有一个特性,即:在假定加密算法安全的前提下,可以证明这类消息鉴别码算法的安全性。
附录A列举了在底层采用ZUC或SM4算法的MAC算法所生成的测试向量,附录B给出了泛杂函数的安全性信息,附录C给出了加密算法ZUC和SM4算法的安全性说明。采用泛杂凑函数的MAC算法需要一个主密钥K,一个消息M和一个临时值N作为输人。依照下列步骤序列可以计算得到MAC:密钥预处理。利用主密钥K生成一个杂凑密钥K和一个加密密钥K。其中,在UMAC和a)
Badger中还使用临时值N作为输人。消息预处理。将输人的消息M编码为杂凑函数所需的输人格式。b)
消息杂凑。编码后的消息在杂凌密钥K的控制下经一个泛杂凑函数进行杂凑。其结果为个固定且长度较短的杂凑值H。
终止化操作。将杂凑值H在加密密钥K的控制下进行加密,其结果即为消息鉴别码MAC。d
其中,在Poly1305和GMAC中还使用临时值N作为输人,对于本部分中提出的所有机制,默认输入消息的长度是字节的整数倍。对于所有采用泛杂凌函数的MAC算法,最重要的是,当使用相同的密钥时,鉴别每个新消息应使用不同的临时值。如果该安全性要求没有满足,算法的安全性将严重降低。4
6机制
6.1概述
GB/T15852.3—2019
本章规范了四种采用泛杂凑函数的消息鉴别码算法。凡涉及密码算法的相关内容,按国家有关法规实施;凡涉及采用密码技术解决保密性、完整性、真实性、不可否认性需求的应遵循密码相关国家标准和行业标准。
6.2.1UMAC的描述
UMAC是一个由4个MAC算法组成的算法族,它们针对不同的输出比特长度做了效率优化,分别是UMAC-32、UMAC-64、UMAC-96和UMAC-128。UMAC使用一个长度为128比特的密钥K,并且临时值N的长度介于8比特和128比特之间。根据使用的UMAC族中算法的不同,产生的MAC的长度分别为32比特、64比特、96比特或128-比特。该指标由参数taglen表示,相应地为4个、8个、12个或16个字节。输人消息的长度应小于27个字节。输人UMAC函数的消息应包含整数个字节,也就是说,其比特长度应是8的倍数。若其比特长度不是8的倍数,则该机制不适用。附录A的A.1中列举了在底层采用SM4算法的UMAC所生成的测试向量。注1:这里指定的UMAC的版本避免与UMAC算法较早的版本(如参考文献[2]等)相混淆,注2:若MAC函数的输人包含整数个字节,则这里指定的UMAC函数与IETFRFC4418[]中描述的函数相同。6.2.2要求
在使用UMAC之前,需要首先协商以下参数:分组密码算法,具体分组密码算法的选择决定了密钥长度|K和分组长度|B|。标签长度,taglen,应为4、8、12或16之一(以字节计)。临时值的长度,应介于8比特和128比特之间。6.2.3符号和辅助函数
6.2.3.1比特串操作
关于UMAC的条款在对序列中的元素标记时使用以1为起始的索引。从而,对于UMAC,S[订定义为比特串S的第i个字节,其中≥1。辅助函数KDF
该密钥流生成函数输出伪随机比特。它返回长度为numoctets的字节串作为输出。输入:
输出:
主密钥K(长度为keylen字节的比特串)inder(小于2的非负整数)
numoctets(小于2的非负整数)Y(长度为numoctets字节的比特串)n=ceil(numoctets/blocklen)。b)将Y设为空串。
对于i=1到n,令:
1)T=uint2bitstr(indez,blocklen-8)luint2bitstr(i,8);2)T=Enc(K,T);
GB/T15852.3—2019
3)Y=YIT。
Y-Y[1..*numoctets]此内容来自标准下载网
输出Y。
注:根据GB/T17964一2008中的定义,密钥流生成函数KDF采用CTR模式调用一个分组密码算法。6.2.3.3
辅助函数PDF
该填充生成函数调用一个密钥和一个临时值,返回一个用以生成标签的伪随机填充序列,长度为4个、8个、12个或16个字节。
输人:
输出:
PDFnonce=N。
主密钥K(长度为keylen字节的比特串)临时值N(长度介于1和blocklen之间的字节串)标签长度taglen(整数4、8、12或16)Y(长度为taglen字节的比特串)若(taglen=4或taglen=8):
1)indez=bitstr2uint(N)mod(blocklen/taglen);2)PDFnonce=Nuint2bitstr[indexoctetlength(N)]。c)
padlen=blocklen-octetlength(PDFnonce)。d)
PDFnonce=PDFnonceloradle·s
K'=KDF(K,O,keylen)。
T=Ene(K',PDFnonce)。
若(taglen=4或taglen=8):
Y=T[(index*taglen)+1-(index*taglen)+taglen]。其他情况:
Y=T[i..taglen]。
输出Y。
注:若使用的临时值只有最后一个比特(当生成长度为8字节的填充时)或最后两个比特(当生成长度为4字节的填充时)不同,则生成的填充序列可由相同的分组密码加密获得。从面,连续的临时值可以通过缓存和共享同一次分组密码调用生成填充序列。6.2.3.4
辅助函数NH
NH(非线性杂凑函数)是一个泛杂凑函数。注1:非线性杂资函数NH由Black等提出输入:
输出:
Key(长度为1024字节的比特串)Msg(字节串,其长度是32的倍数并且小于或等于1024)Y(长度为8字节的比特串)
将Msg和Key分割成长度为4的字节分组:a)t=octetlength(Msg)/4。
将Msg分割成长度为4的字节串M,M2,,M,,从而Msg=M,IMIM,。b)
令K,K.,,K,为长度为4的字节串,即K,lK,K,是Key的一个前缓(Key最左侧的4t个字节)。
Y=054。
e)i=l。
当(i1)Y=Y+[(M;++aKi+o) e(Mi++saK+)];2)Y=Y+[(M;++aK,+) (M,++K,+s)];3)Y=Y+[(M++aK,+2)(M;++aK;+)];4) Y=Y+[(M;++a2K;+) 6(Mi++a2K;+)];5)i=i+8。
g)返回Y。
GB/T15852.3——2019
注2:这一程序直接作用于输人数据的每一个比特,所以对该程序的优化实现将产生极大的效益。该程序可作用于长度为4的字节分组,也可以作用于乘法中的两个字,这两个字宜各分为4个部分以便于向量并行化操作。
辅助函数ENDIAN-SWAP
函数ENDIAN-SWAP将一个长度为4的字节串从按低位排序转换为按高位排序,或反之。输入:
输出:
S(长度可被4个字节整除的比特串)T(每4个字节尾数逆转的比特串S)n=octetlength(S)/4。
令S.,S,,S.为长度为4的字节串,满足S,IS.ⅡS,=S。将T设为空串。
对于i=1到n:
1)令W,,Wz,W,W。为字节,满足W,lWzW。llW=S。SResuradW,llW,llWzlW,。
3) T=TIISRrered。
输出T。
辅助杂凌函数POLY
函数POLY是一个多项式杂凑函数,于第二层杂凑函数L2-HASH中使用,参见6.2.7.2。输人:
输出:
wordbits(整数64或128)
mawordrange(小于2werdli的正整数)key[取值范围为Oprime(wordbits)-1的整数」Msg[长度可被(wordbits/8)个字节整除的比特串]y(取值范围为Oprime(wordbits)-1的整数)wordoctets=wordbits/8。
p=prime(wordbits)。
offset=2werdin-p。
marker=p-1。
n=octetlength(Msg)/wordoctets.令M,,Mz,,M,为长度为wordoctets的字节串,满足Msg=M,M,\.M.yl。
对于i=1到n:
1)m=bitstr2uint(M,);
2)若(m≥marwordrange),则:i)y=(key*y+marker)modp;
ii)y=(key*y+(m-offset))modp。GB/T15852.3—2019
3)其他情况:
y=(key*y+m)modp。
输出y。
密钥预处理
UMAC使用的分组密码算法应当满足其分组长度blocklen至少为16,并且是2的方幂。注;如果有若干个消息需要进行鉴别,杂凑密钥K将被重复使用,缓存该密钥是有必要的。只有加密密钥K在每次处理新消息时被重新计算。输入:
输出:
iters=taglen/4。
主密钥K(长度为keylen字节的比特串)临时值N(长度介于1和blocklen之间的字节串)标签长度taglen(整数4、8、12或16)杂密钥K=(L1Key,L2Key,L3Key1,L3Key2)(任意长度的比特串)
加密密钥K(长度为taglen字节的比特串)L1Key=KDF[K,1,1024+(iters—1)*16]。L2Key=KDF(K,2,iters*24)。
L3Key1=KDF(K,3,iters*64)。
L3Key2=KDF(K,4,iters *4)。
Kg=PDF(K,N,taglen)。
输出Kn=(L1Key,L2Key,L3Keyl,L3Key2),K。消息预处理
在需要被杂凑的消息右侧填充零串使其达到字节长度整数倍。消息一且被填充,所有的比特串都被视为字节串。
注;在按低位顺序排列的计算机上,消息数据按从低位顺序排列读取以加速标签的生成。6.2.6消息杂渍
输人:
输出:
将H设为空串。
杂凑密钥K=(L1Key,L2Key,L3Keyl,L3Key2)(任意长度的比特串)
加密密钥Kg(长度为taglen字节的比特串)消息M(长度小于27字节的比特串)taglen(整数4、8、12或16)
标签H(长度为taglen字节的比特串)对于i=1到(taglen/4),令:
L1Key:=L1Key[(i—1)*16+1(i—1)*16+1024];1)
L2Key;=L2Key[(i-1)*24+1.-i*24];L3Keyl,=L3Key1[(i--1)64+1--i*64];L3Key2,=L3Key2[(i—1)*4+1-*i*4];A=Li-HASH(L1Key,M);
若(bitlength(M)<=bitlength(L1Key)),则:B=054IIA;
小提示:此标准内容仅展示完整标准里的部分截取内容,若需要完整标准请到上方自行免费下载完整标准文档。