SM3 实现例子

39 阅读2分钟
package com.utils.sign;

import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;

import java.nio.charset.StandardCharsets;
import java.util.AbstractQueue;
import java.util.Arrays;

public class TestSM3 {
    //    SM3 是哈希算法,类似于 SHA-256

    /**
     * 计算哈希值
     * (无密钥,任何人可计算)
     * @param data 待计算哈希值的字节数组
     * @return
     */
    public static String getSM3Hash(byte[] data){
        // 1、创建SM3哈希算法实例
        SM3Digest sm3Digest = new SM3Digest();
        // 2、传入待计算哈希值的数据
        sm3Digest.update(data,0,data.length);
        System.out.println("sm3Size>"+sm3Digest.getDigestSize());
        // 3、创建存储 SM3 哈希结果的字节数组
        byte[] result = new byte[sm3Digest.getDigestSize()];
        // 4、完成 SM3 哈希值计算,并写入 result 数组
        sm3Digest.doFinal(result,0);
        // 6、转成十六进制字符串
        return Hex.toHexString(result);
    }

    /**
     * SM3 HMAC 计算(必须使用共享密码计算)
     * 是一种基于哈希函数和共享密钥的消息认证码机制,用于验证数据完整性和身份认证。
     *
     * @param data 待认证的字节数组
     * @param key   密钥
     * @return
     */
    public static String getSM3Hmac(byte[] data,byte[] key){
        // 1、初始化HMac,绑定SM3算法
        HMac hMac = new HMac(new SM3Digest());
        // 2、设置密钥
        hMac.init(new KeyParameter(key));
        // 3、传入消息数据
        hMac.update(data,0,data.length);
        // 4、创建存储 SM3 哈希结果的字节数组
        byte[] bytes = new byte[hMac.getMacSize()];
        // 5、完成哈希值计算,并写入 bytes 字节数组
        hMac.doFinal(bytes,0);
        // 6、转成十六进制
        return Hex.toHexString(bytes);
    }

    public static void main(String[] args) {
        // <Sign>026957ed5c75ca21e35cbb3285393502c103f07f66bc1d438a4245eeacaabc4d</Sign>
        String sign0 = "3d71731082429fc53d1ca4c55d73c8f1e88c5d223fd86dd8baf7d6cb376d1b1c";

        String data = "卡送领导看我老公卢卡斯;类的看法;类的看法二;绿卡;类的封口费";

        String result = TestSM3.getSM3Hash(data.getBytes());
        System.out.println("result0>"+result);

        String fff = "-73-28-30-1140-142-850499269-4610310090-52-79-48494-13105-89-2639126-2178-1205996";
        System.out.println(fff.length());

        String secretKey = "1234567890abcdef1234567890abcdef";
        byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8);
        System.out.println("keyBytes>"+Arrays.toString(keyBytes));

        String ret = getSM3Hmac(data.getBytes(StandardCharsets.UTF_8),keyBytes);
        System.out.println("ret>>>"+ret);
    }
}