——含GB/T 15852和HMAC 本文档对我国标准规定的消息鉴别码的生成算法进行了简要介绍,包括算法生成步骤,注意事项等。我国的相关标准包括GB/T 15852.1-2008、GB/T 15852.2-2012、GB/T15852.3(目前为草稿)。 1. 标准概述国密消息鉴别码标准GB/T15852 《消息鉴别码》由三个部分组成: l Part1 采用分组密码的机制,同等采用ISO/IEC 9797-1: 1999。 l Part2 采用专用杂凑函数的机制,修改采用ISO/IEC 9797-2: 2002。 l Part3 采用泛杂凑函数的机制(草稿),修改采用ISO/IEC9797-3: 2011。 2. 基于分组密码的MAC2.1 整体架构基于分组密码的MAC算法共六种,都按以下几个流程执行(流程图如下)。 图2.1基于分组密码的MAC算法流程 1) 数据填充(三种方案); 2) 第一个块的处理,也叫初始变换(两种方案); 3) 中间块的处理(CBC-MAC); 4) MAC输出,也叫输出变换(三种方案); 基于分组密码的MAC有六种算法。 l 六种算法的数据填充方式未做硬性规定,可选择三种中的任意一种。 l 算法1—算法4是初始变换与输出变换的组合。 l 算法5(算法6)分别是两个并行的算法1(算法4)的MAC值做异或。当然并行MAC必须用不同的KEY。 l 其中某些算法可能涉及密钥派生,但标准未对密钥派生算法做硬性规定。 l 若需截断,则截获高位数据。 标准描述道:“算法4提供了一种改进的增加密钥长度的方法,强烈建议用户采用这个MAC算法4和填充方式3。”六种算法的详细配置如下表。 表2.1基于分组密码的MAC算法的配置情况
2.2 数据填充以下三种方案都是保证填充后的长度为分组长度n的整数倍。 填充后的数据按分组长度分割为多个块。 2.2.1 数据填充方案1l 消息右侧填充比特零(可以不添加)。 l 空串需添加n个0。 l 对简单伪造攻击不安全。 填充数据:padding=0...00 填充后的消息:MSG|| 0...00 2.2.2 数据填充方案2l 消息右侧先填充一个比特1,再填充比特0(可以不添加比特0)。 填充数据:padding=10...00 填充后的消息:MSG|| 10...00 2.2.3 数据填充方案3l 先在消息右侧填充比特0(可以不添加比特0),保证填0后的长度为分组长度n的整数倍, l 再在消息左侧添加消息长度MSG_LEN(n比特,大端表示)。 填充数据:左侧为MSG_LEN,右侧为0...00 填充后的消息:MSG_LEN|| MSG || 10...00 注:如果在计算MAC前不能知道完整消息的长度,则填充方案3不可用。 2.3 初始变换初始变化对分割得到的第一个块进行处理,其结果类似后续CBC_MAC的IV。如果没后续块,则不做CBC_MAC。 2.3.1 初始变换方案1输入:D1(第一个块)、K(密钥) 输出:H1= ENCK(D1) 2.3.2 初始变换方案2输入:D1(第一个块)、K(密钥)、K**(另一个密钥) 输出:H1= ENCK**( ENCK(D1) ) 【注:需要两个密钥】 2.4 输出变换2.4.1 输出变换方案1输入:Hq(最后一个块的MAC) 输出:H= Hq(恒等变换) 【注:无需密钥】 2.4.2 输出变换方案2输入:Hq(最后一个块的MAC)、K*(密钥) 输出:H1= ENCK*(Hq) 【注:密钥是K*】 2.4.3 输出变换方案3输入:Hq(最后一个块的MAC)、K(密钥)、K*(另一个密钥) 输出:H1= ENCK (DECK*(Hq) ) 【注:先用K*解密,然后用K加密】 2.5 六种算法标准描述道:“算法4提供了一种改进的增加密钥长度的方法,强烈建议用户采用这个MAC算法4和填充方式3。” 六种算法的详细配置表如下。 表2.2基于分组密码的MAC算法的配置情况
2.5.1 算法1输入密钥:K。 诱导密钥:无。 执行步骤: CBC-MAC,IV为全零。 2.5.2 算法2输入密钥:K。 诱导密钥:K**,一种生成方式K** = SKDF(K)(见2.5.7 一种密钥衍生算法) 执行步骤: 先对所有块做CBC-MAC(密钥K), 然后再对结果加密(密钥K**)。 注意事项:K≠K**,否则存在异或伪造攻击。 2.5.3 算法3输入密钥:K和K*(K≠K*)。 诱导密钥:无。 执行步骤: 1. 先对所有块做CBC-MAC(密钥K), 2. 然后再对结果解密(密钥K*)后加密(密钥K)。 注意事项:K≠K*,否则算法3退化成算法1。 2.5.4 算法4输入密钥:K和K*。 诱导密钥:K**,一种生成方式为K**=SKDF(K*)(见章节2.5.7)。 执行步骤: 1. 先对第一个块做两次加密(先K后K**), 2. 其结果作为IV和后续块(第二个块开始)做CBC-MAC(密钥K), 3. 然后再对结果加密(密钥K*)。 注意事项:填充后的消息至少是两个块才可用。 2.5.5 算法5输入密钥:K。 诱导密钥:K1和K2,由K生成。 生成方式可以是K1=K,K2=SKDF(K)(见章节2.5.7)。 执行步骤: 1. 用密钥K1和K2分别对数据各做一次CBC-MAC(即算法1); 2. 然后将MAC值异或。 注意事项:保证K1≠K2。 2.5.6 算法6输入密钥:K和K*。 诱导密钥:(K1, K1*)和(K2, K2*),由K和K*生成。 生成方式可为(K1,K1*)=(K,K*),(K2,K2*)≠(SKDF(K), SKDF(K*))。 执行步骤: 1.用密钥(K1, K1*)和(K2, K2*)分别对数据各做一次算法4, 2. 然后将MAC值异或。 注意事项: 1. 保证K1≠K1*、K2≠K2*、(K1, K1*)≠(K2, K2*); 2. 建议算法6的6个密钥各不相同(算法4实际使用3个密钥)。 2.5.7 一种密钥衍生算法算法:简单密钥衍生算法SKDF(K) 输入:一个密钥K 输出:衍生的另一个密钥K* 步骤:从K的第一个4比特组开始,每隔4比特交替取补和不变生成K*。 2.6 测试向量参见GB/T15852.1-2008的附录A。 3. 基于专用杂凑函数的MAC3.1 三种算法基本情况介绍标准规定了三种MAC算法: l 算法1和算法3要求修改底层的HASH算法(如修改HASH算法的轮常数等),这在很有应用中无法实现,因此强烈建议舍弃这两者算法。 l 算法2为HMAC算法的微调版。可以使用。 3.2 算法2和HMAC区别仅存在密钥长度的限制 l HMAC:未限制密钥长度。 l 算法2:严格限制密钥长度为 L<= Len(K)<= B。 这里B是HASH函数的分组大小,L是HASH函数的输出杂凑值长度。 以SM3为例,算法2要求密钥长度为256~512比特,而HMAC无此要求。 3.3 HMAC (FIPS PUB 198-1)参见FIPS PUB 198-1, The Keyed-Hash MessageAuthentication Code (HMAC). 2008-07. 3.3.1 记号l B:HASH函数的分组大小,单位字节。 l L:HASH函数的输出杂凑值长度,单位字节。 l ipad:每个字节都为0x36的数据串,B字节长。 l opad:每个字节都为0x5c的数据串,B字节长。 算法表达式 HMAC(K, text) = H((K0⊕opad )|| H((K0 ⊕ipad) || text)) 3.3.2 HMAC算法流程算法:HMAC(K, text) 输入:密钥K和消息text 输出:MAC值 步骤: 步骤 1. 生成K0,长度为B。 n 若Len(K)=B,K0 = K。 n 若Len(K)>B,K0 = HASH(K)|| 00...0。 n 若Len(K)<B,K0 = K || 00...0。 步骤 2. H* = HASH( ( K0 ⊕ ipad) || text ) 。 步骤 3. H = HASH(( K0 ⊕ opad) || H* ) 。 步骤4. 返回H。 图3.1 HMAC算法流程图 4. 基于泛杂凑函数的MAC标准文档尚在设计中。略。 |
|
来自: wubi82eoepd971 > 《完整性保护》