SM3-HMAC



import org.apache.commons.codec.binary.Base64;


import com.sansec.impl.device.softdigest.SM3Digest;

public class SM3Hmac {
	private static final int BLOCK_LENGTH = 64;
	private static String startKey="";
	public static byte[] SM3HashMac(String text,String key){
		
		key=startKey+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( Base64.decodeBase64(key).length>BLOCK_LENGTH){
            sm3_key= sm3Hash(Base64.decodeBase64(key));
            System.arraycopy(sm3_key,0,structured_key,0,sm3_key.length);
        }else {
            System.arraycopy(Base64.decodeBase64(key),0,structured_key,0,Base64.decodeBase64(key).length);
        }
        //2.让处理之后的key 与ipad (分组长度的0x36)做异或运算
        for(int i=0;i<BLOCK_LENGTH;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));
    }
	
	private static byte[] sm3Hash(byte[] srcData) {
        SM3Digest digest = new SM3Digest();
        digest.update(srcData,0,srcData.length);
        byte[] hash = new byte[digest.getDigestSize()];
        digest.doFinal(hash,0);
        return hash;
    }

	
	/**
     * 异或算法加密/解密
     *
     * @param data 数据(密文/明文)
     * @param key 密钥
     * @return 返回解密/加密后的数据
     */
    public static byte[] XOR(byte[] key,byte[] data ) {
        if (data == null || data.length == 0 || key == null || key.length == 0) {
            return data;
        }

        byte[] result = new byte[data.length];

        // 使用密钥字节数组循环加密或解密
        for (int i = 0; i < data.length; i++) {
            // 数据与密钥异或, 再与循环变量的低8位异或(增加复杂度)
            result[i] = (byte) (data[i] ^ key[i % key.length] ^ (i & 0xFF));
        }

        return result;
    }

    public static void main(String[] args) {
		byte[] sm3HashMac = SM3HashMac("123456123456", "111111111111111111111111");
		System.out.println(Base64.encodeBase64String(sm3HashMac));
		byte[] sm3HashMac1 = SM3HashMac("123456123456", "111111111111111111111111");
		System.out.println(Base64.encodeBase64String(sm3HashMac1));
		byte[] sm3HashMac2 = SM3HashMac("1234567", "11111");
		System.out.println(Base64.encodeBase64String(sm3HashMac2));
		byte[] sm3HashMac3 = SM3HashMac("123456", "11111");
		System.out.println(Base64.encodeBase64String(sm3HashMac3));
	}
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SM3hmac是一种基于SM3哈希算法的HMAC(加密消息认证码)算法。在Java中实现SM3hmac可以使用Bouncy Castle库来完成。 首先,确保你已经引入了Bouncy Castle库的依赖。你可以通过Maven来添加以下依赖: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.69</version> </dependency> ``` 然后,你可以使用以下代码来计算SM3hmac: ```java import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.crypto.macs.HMac; import org.bouncycastle.crypto.params.KeyParameter; import java.nio.charset.StandardCharsets; public class SM3HmacExample { public static void main(String[] args) { String message = "Hello World"; byte[] key = "SecretKey".getBytes(StandardCharsets.UTF_8); byte[] hmac = calculateHmac(message.getBytes(StandardCharsets.UTF_8), key); System.out.println("SM3-HMAC: " + bytesToHex(hmac)); } public static byte[] calculateHmac(byte[] message, byte[] key) { SM3Digest digest = new SM3Digest(); HMac hmac = new HMac(digest); hmac.init(new KeyParameter(key)); hmac.update(message, 0, message.length); byte[] mac = new byte[digest.getDigestSize()]; hmac.doFinal(mac, 0); return mac; } public static String bytesToHex(byte[] bytes) { StringBuilder hex = new StringBuilder(); for (byte b : bytes) { hex.append(String.format("%02x", b)); } return hex.toString(); } } ``` 在上面的示例中,我们使用`calculateHmac`方法来计算SM3-HMAC值,传入消息和密钥。然后,我们将HMAC值转换为十六进制字符串并打印出来。 请注意,为了演示目的,这里使用了硬编码的密钥和消息。在实际应用中,你可能需要根据具体需求进行替换。 希望以上代码对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值