发明名称 一种生成消息认证码的方法
摘要 本发明公开了一种生成消息认证码的方法,属于密钥算法领域。所述方法包括:对缓冲区和字变量进行初始化,通过多次循环计算中间量和字变量,并根据中间量和字变量得到消息认证码。本发明不需要在密钥生成设备内部单独分配RAM,用于全局缓存密钥的填充、数据流的补位、补长度等操作,不需要在整个散列函数运算中全局缓存,大大降低了在运算过程中所需的RAM资源,能够广泛应用于RAM资源很少的低成本密钥生成设备中,有利地降低设备成本,提高了设备应用的竞争力。
申请公布号 CN101227286B 申请公布日期 2010.04.14
申请号 CN200810057285.7 申请日期 2008.01.31
申请人 北京飞天诚信科技有限公司 发明人 陆舟;于华章
分类号 H04L9/32(2006.01)I;H04L29/06(2006.01)I;H04L12/56(2006.01)I 主分类号 H04L9/32(2006.01)I
代理机构 北京三高永信知识产权代理有限责任公司 11138 代理人 何文彬
主权项 一种生成消息认证码的方法,其特征在于,所述方法包括:步骤A1:把数据流存入中间数据流缓冲区,用预先规定的常量分别初始化字变量1、字变量2、字变量3、字变量4和字变量5;步骤A2:将所述字变量1、字变量2、字变量3、字变量4和字变量5分别赋给预先设定的字变量6、字变量7、字变量8、字变量9和字变量10;步骤A3:对于计数变量取值0到79,循环计算中间量、字变量6、字变量7、字变量8、字变量9和字变量10;其中,所述计数变量的初始值为0,每循环计算一次,所述计数变量加1;每循环一次,根据当前中间量按照预设规则修改所述字变量6、字变量7、字变量8、字变量9和字变量10;所述中间量分如下两步计算:1)如果所述计数变量取值0到15,根据预设共享密钥、所述共享密钥的长度、预设常数1和所述计数变量,计算所述中间量,具体过程如下:步骤B1:如果计数变量的取值大于等于0且小于所述共享密钥的长度的四分之一时,把所述共享密钥分成多个字,所述多个字的个数为所述共享密钥的长度的四分之一对应的值,则当前中间量为所述多个字中所述计数变量的当前值对应的字;如果计数变量等于所述共享密钥的长度的四分之一且所述共享密钥的长度是4的整数倍,则当前中间量为0;如果计数变量等于所述共享密钥的长度的四分之一且所述共享密钥的长度不是4的整数倍,在所述共享密钥的尾部补0,使所述共享密钥的长度能够被4整除,则当前中间量为补0后的共享密钥的最后一个字;如果计数变量取值大于所述共享密钥的长度的四分之一且小于等于15,则当前中间量为0;步骤B2:把当前中间量的每一个字节与预设常量1相异或,结果赋给当前中间量;2)如果所述计数变量取值16到79,根据待计算的当前中间量的前16个中间量,计算所述当前中间量,具体过程如下;步骤B1′:在中间缓冲区中缓存当前中间量的前16个中间量,依次从0至15编号,提取所述中间缓冲区中的第0、2、8、13个编号对应的中间量;步骤B2′:对提取出的中间量进行异或运算,对异或运算的结果做循环左移1位运算,将运算后的结果作为当前中间量;步骤B3′:用所述当前中间量更新所述中间缓冲区,使其缓存所述当前中间量及所述当前中间量的前15个中间量;步骤A4:所述计数变量等于80时,根据如下公式:字变量1=字变量1+字变量6,字变量2=字变量2+字变量7,字变量3=字变量3+字变量8,字变量4=字变量4+字变量9,字变量5=字变量5+字变量10;计算当前字变量1、字变量2、字变量3、字变量4和字变量5,并将所述计数变量归0;步骤A5:将当前的字变量1、字变量2、字变量3、字变量4和字变量5分别赋给所述字变量6、字变量7、字变量8、字变量9和字变量10;步骤A6:对于计数变量取值0到79,循环计算中间量、字变量6、字变量7、字变量8、字变量9和字变量10;其中,所述中间量分如下两步计算:1)如果所述计数变量取值0到15,根据所述中间数据流缓冲区中的中间数据流、所述中间数据流的长度和所述计数变量,计算所述中间量,具体如下:如果计数变量的取值大于等于0且小于所述中间数据流的长度的四分之一时,把所述中间数据流分成多个字,所述多个字的个数为所述中间数据流的长度的四分之一对应的值,则当前中间量为所述多个字中所述计数变量的当前值对应的字;如果计数变量等于所述中间数据流的长度的四分之一且所述中间数据流的长度是4的整数倍,则当前中间量为0X80000000;如果计数变量等于所述中间数据流的长度的四分之一且所述中间数据流的长度不是4的整数倍,在所述中间数据流的尾部先补1,再补0,使所述中间数据流的长度能够被4整除,则当前中间量为补位后的中间数据流的最后一个字;如果计数变量取值大于所述中间数据流的长度的四分之一且小于15,则当前中间量为0;如果计数变量取值等于15,则当前中间量为所述中间数据流的长度乘以8加上512的结果;2)如果所述计数变量取值16到79,根据待计算的当前中间量的前16个中间量,计算所述当前中间量,具体过程如下;步骤B1′:在中间缓冲区中缓存当前中间量的前16个中间量,依次从0至15编号,提取所述中间缓冲区中的第0、2、8、13个编号对应的中间量;步骤B2′:对提取出的中间量进行异或运算,对异或运算的结果做循环左移1位运算,将运算后的结果作为当前中间量;步骤B3′:用所述当前中间量更新所述中间缓冲区,使其缓存所述当前中间量及所述当前中间量的前15个中间量;步骤A7:所述计数变量等于80时,根据所述步骤A1中计算出的字变量1、字变量2、字变量3、字变量4和字变量5,以及所述步骤A6中计算出的字变量6、字变量7、字变量8、字变量9和字变量10,根据如下公式:字变量1=字变量1+字变量6,字变量2=字变量2+字变量7,字变量3=字变量3+字变量8,字变量4=字变量4+字变量9,字变量5=字变量5+字变量10;计算当前字变量1、字变量2、字变量3、字变量4和字变量5;并将所述计数变量归0;步骤A8:将当前的字变量1、字变量2、字变量3、字变量4和字变量5分别装载到所述中间数据流缓冲区,用所述预先规定的常量分别初始化当前的字变量1、字变量2、字变量3、字变量4和字变量5;步骤A9:将当前的字变量1、字变量2、字变量3、字变量4和字变量5分别赋给所述字变量6、字变量7、字变量8、字变量9和字变量10;步骤A10:对于计数变量取值0到79,循环计算中间量、字变量6、字变量7、字变量8、字变量9和字变量10;其中,所述中间量分如下两步计算:1)如果所述计数变量取值0到15,根据预设共享密钥、所述共享密钥的长度、预设常数2和所述计数变量,计算所述中间量,具体过程如下:步骤B1″:如果计数变量的取值大于等于0且小于所述共享密钥的长度的四分之一时,把所述共享密钥分成多个字,所述多个字的个数为所述共享密钥的长度的四分之一对应的值,则当前中间量为所述多个字中所述计数变量的当前值对应的字;如果计数变量等于所述共享密钥的长度的四分之一且所述共享密钥的长度是4的整数倍,则当前中间量为0;如果计数变量等于所述共享密钥的长度的四分之一且所述共享密钥的长度不是4的整数倍,在所述共享密钥的尾部补0,使所述共享密钥的长度能够被4整除,则当前中间量为补0后的共享密钥的最后一个字;如果计数变量取值大于所述共享密钥的长度的四分之一且小于等于15,则当前中间量为0;步骤B2″:把当前中间量的每一个字节与预设常量2相异或,结果赋给当前中间量;2)如果所述计数变量取值16到79,根据待计算的当前中间量的前16个中间量,计算所述当前中间量具体过程如下;步骤B1′:在中间缓冲区中缓存当前中间量的前16个中间量,依次从0至15编号,提取所述中间缓冲区中的第0、2、8、13个编号对应的中间量;步骤B2′:对提取出的中间量进行异或运算,对异或运算的结果做循环左移1位运算,将运算后的结果作为当前中间量;步骤B3′:用所述当前中间量更新所述中间缓冲区,使其缓存所述当前中间量及所述当前中间量的前15个中间量;步骤A11:所述计数变量等于80时,根据所述步骤A1中计算出的字变量1、字变量2、字变量3、字变量4和字变量5,以及所述步骤A10中计算出的字变量6、字变量7、字变量8、字变量9和字变量10,根据如下公式:字变量1=字变量1+字变量6,字变量2=字变量2+字变量7,字变量3=字变量3+字变量8,字变量4=字变量4+字变量9,字变量5=字变量5+字变量10;计算当前字变量1、字变量2、字变量3、字变量4和字变量5;并将所述计数变量归0;步骤A12:将当前的字变量1、字变量2、字变量3、字变量4和字变量5分别赋给所述字变量6、字变量7、字变量8、字变量9和字变量10;步骤A13:重复执行所述步骤A6;步骤A14:所述计数变量等于80时,根据所述步骤A1中计算出的字变量1、字变量2、字变量3、字变量4和字变量5,以及所述步骤A13中计算出的字变量6、字变量7、字变量8、字变量9和字变量10,根据如下公式:字变量1=字变量1+字变量6,字变量2=字变量2+字变量7,字变量3=字变量3+字变量8,字变量4=字变量4+字变量9,字变量5=字变量5+字变量10;计算当前字变量1、字变量2、字变量3、字变量4和字变量5;步骤A15:将当前的字变量1、字变量2、字变量3、字变量4和字变量5作为消息认证码。
地址 100083 北京市海淀区学院路40号研7楼5层