bte365娱乐线

HMAC原理及SM3-HMAC实现

发布时间 2025-09-16 01:49:22 作者 admin 阅读 9877

HMAC原理

一、定义

MAC(Message Authentication Code,消息认证码算法),MAC是含有密钥的散列函数算法,因此也MAC算法也通常被称为HMAC,其中HMAC中的H就是Hash的意思。使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512。

二、实现原理

实现原理图:

以摘要算法为MD5实现的HMAC为例(MD5将原文以64字节分组来进行分别计算,最终输出一个16字节的散列值),如上图所示,HMAC的计算公式为:

HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M)),其中,

B为计算hash过程中对信息分组时,每个信息块的长度(MD5算法中B=64);

L为哈希算法计算出的信息摘要长度(MD5算法中L=16);

K为任意长度的密钥,一般为了安全强度考虑,K的长度不小于L;

Ipad为00110110(16进制为0x36)重复B次;

Opad为01011100(16进制为0x5c)重复B次;

M 代表一个消息输入,即待加密原文;

H为哈希函数(例如MD5)。

根据上面的算法表示公式,我们可以描述HMAC算法的运算步骤:

(1)检查密钥K的长度。如果K的长度大于B则先使用摘要算法计算出一个长度为L的新密钥。如果后K的长度小于B,则在其后面追加0来使其长度达到B。

(2)将上一步生成的B字长的密钥字符串与ipad做异或运算,得到比特序列ipadkey。

(3)将ipadkey附加在消息M的开头;

(4)使用哈希函数H计算第3步中生成的数据流的信息摘要值。

(5) 将第1步生成的B字长密钥字符串与opad做异或运算,得到opadkey。

(6)再将第4步得到的结果填充到opadkey之后。

(7)使用哈希函数H计算第6步中生成的数据流的信息摘要值,输出结果就是最终的HMAC值。

SM3-HMAC实现示例

public static byte[] SM3HashMac(String text,String key){

//1.填充0至key,或者hashkey,使其长度为sm3分组长度

/** BLOCK_LENGTHSM3分组长度 ,64个字节,512位*/

byte[] sm3_key;

byte[] structured_key=new byte[BLOCK_LENGTH];

byte[] IPAD=new byte[BLOCK_LENGTH];

byte[] OPAD=new byte[BLOCK_LENGTH];

if(StringUtil.base64Decode(key).length>BLOCK_LENGTH){

sm3_key= sm3Hash(StringUtil.base64Decode(key));

System.arraycopy(sm3_key,0,structured_key,0,sm3_key.length);

}else {

System.arraycopy(StringUtil.base64Decode(key),0,structured_key,0,StringUtil.base64Decode(key).length);

}

//2.让处理之后的key 与ipad (分组长度的0x36)做异或运算

for(int i=0;i

IPAD[i]=0x36;

OPAD[i]=0x5c;

}

byte[] ipadkey=XOR(structured_key,IPAD);

//3.将2的结果与text拼接

int textLen=text.getBytes().length;

byte[] t3=new byte[BLOCK_LENGTH+textLen];

System.arraycopy(ipadkey,0,t3,0,ipadkey.length);

System.arraycopy(text.getBytes(),0,t3,ipadkey.length,text.getBytes().length);

//4.将3的结果sm3 哈希

byte[] t4=sm3Hash(t3);

//5.让处理之后的key 与opad(分组长度的0x5c)做异或运算

byte[] opadkey=XOR(structured_key,OPAD);

//6.4的结果拼接在5之后

byte[] t6=new byte[BLOCK_LENGTH+t4.length];

System.arraycopy(opadkey,0,t6,0,opadkey.length);

System.arraycopy(t4,0,t6,opadkey.length,t4.length);

//7.对6做hash

return (sm3Hash(t6));

}

参考文档

https://www.cnblogs.com/foxclever/p/8593072.html

https://blog.csdn.net/chengqiuming/article/details/82822933

相关推荐

哈士奇狗一年打针要需要多少钱?

选择自己喜欢的犬类品种很重要,可是这几个小知识点,也应当知道选择自己喜欢的犬类品种很重要,可是这几个小知识点,也应当知道今天,

09-13 分类 super365体育官网下载

如何判断函数极值点与拐点

一、极值点 极值的必要条件:极值的第一充分条件:且在两侧变号极值的第二充分条件:且(为极小值,为极大值)极值的第三充分条件:设在处

07-20 分类 bte365娱乐线

命运2能运营多久游戏

命运2是一款备受玩家喜爱的多人在线角色扮演游戏(MMORPG),其独特的游戏机制、丰富的游戏内容和精彩的游戏剧情吸引了无数玩家。然而,对

08-08 分类 bte365娱乐线

农行掌上银行有什么用?有哪些功能?

农业银行掌上银行的功能是非常全面的,具体如下: 【1】信用卡业务:可以通过掌上银行申请信用卡,还可以查询信用卡的账单、对信用卡还

06-27 分类 bte365娱乐线

孔子名人故事 16

孔子哲学家名人故事 推荐度: 相关推荐 孔子名人故事(通用16个) 孔子是我们儒家教派的一代圣人,他的许多精神都值得我们去学习。以下是

08-27 分类 365bet世界杯

dnf剑魂心剑技能介绍

dnf中有很多角色,每一位角色都会有不同的技能,会随着等级的提升而增加,今天要给大家介绍的是剑魂的心剑技能,这个技能有很多玩家都不

09-07 分类 365bet世界杯