【烦人的加密算法】国密SM3的使用--Java版本

和 SM2 引入的包一样, SM2 为非对称算案发,SM3为散列数据(防止数据篡改和MD5加密类似),SM4 为对称算法
【烦人的加密算法】国密SM2的使用–Java版本

SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。

import lombok.extern.slf4j.Slf4j;
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.Charset;
import java.nio.charset.StandardCharsets;

/**
 * SM3国密散列算法
 *
 * @author hcf
 * @date 2022/1/4 11:35
 */
@Slf4j
public class SM3Utils {

    private static final Charset CHARSET = StandardCharsets.UTF_8;

    private static final String DEFAULT_XRO_KEY = "BC614E";

    /**
     * 16进制字符串 使用 SM3 生成 HASH 签名值算法
     *
     * @param hexString 16进制字符串
     * @return
     */
    public static String hexEncrypt(String hexString) {
        byte[] srcData = Hex.decode(hexString);
        byte[] encrypt = encrypt(srcData);
        return Hex.toHexString(encrypt);
    }

    /**
     * 16进制字符串 使用 SM3 生成 HASH 签名值算法
     *
     * @param hexKey    16进制密钥
     * @param hexString 16进制字符串
     * @return
     */
    public static String hexEncrypt(String hexKey, String hexString) {
        byte[] key = Hex.decode(hexKey);
        byte[] srcData = Hex.decode(hexString);
        byte[] encrypt = encrypt(key, srcData);
        return Hex.toHexString(encrypt);
    }

    /**
     * 普通文本 使用 SM3 生成 HASH 签名值算法
     *
     * @param plain 普通文本
     * @return
     */
    public static String plainEncrypt(String plain) {
        byte[] plainBytes = plain.getBytes();
        byte[] encrypt = encrypt(plainBytes);
        return Hex.toHexString(encrypt);
    }


    /**
     * 普通文本 使用 SM3 生成 HASH 签名值算法
     *
     * @param hexKey 密钥
     * @param plain  普通文本
     * @return
     */
    public static String plainEncrypt(String hexKey, String plain) {
        byte[] key = Hex.decode(hexKey);
        byte[] plainBytes = plain.getBytes();
        byte[] encrypt = encrypt(key, plainBytes);
        return Hex.toHexString(encrypt);
    }

    /**
     * SM3 计算 Hash数据
     *
     * @param srcData 数据
     * @return
     */
    public static byte[] encrypt(byte[] srcData) {
        SM3Digest sm3Digest = new SM3Digest();
        sm3Digest.update(srcData, 0, srcData.length);
        byte[] encrypt = new byte[sm3Digest.getDigestSize()];
        sm3Digest.doFinal(encrypt, 0);
        return encrypt;
    }

    /**
     * SM3 计算 Hash数据
     *
     * @param srcData 数据
     * @return
     */
    public static byte[] hash(byte[] srcData) {
        return encrypt(srcData);
    }

    /**
     * SM3 计算 Hash数据
     *
     * @param srcData 数据
     * @return
     */
    public static byte[] encrypt(byte[] key, byte[] srcData) {
        KeyParameter keyParameter = new KeyParameter(key);
        SM3Digest sm3Digest = new SM3Digest();
        HMac hMac = new HMac(sm3Digest);
        hMac.init(keyParameter);
        hMac.update(srcData, 0, srcData.length);
        sm3Digest.update(srcData, 0, srcData.length);
        byte[] encrypt = new byte[hMac.getMacSize()];
        sm3Digest.doFinal(encrypt, 0);
        return encrypt;
    }
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很高兴回答你的问题!以下是一个使用国密算法(SM2-SM3)的Java Demo Maven工程,供您参考: 1. 首先,在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.huawei.security</groupId> <artifactId>sm</artifactId> <version>2.0.5.300</version> </dependency> ``` 2. 创建SM2密钥对 ```java import com.huawei.security.sm.SM2KeyPair; import com.huawei.security.sm.SM2PrivateKey; import com.huawei.security.sm.SM2PublicKey; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; public class SM2Demo { public static void main(String[] args) throws NoSuchProviderException, NoSuchAlgorithmException { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); SM2KeyPair sm2KeyPair = new SM2KeyPair(); SM2PublicKey publicKey = sm2KeyPair.getPublicKey(); SM2PrivateKey privateKey = sm2KeyPair.getPrivateKey(); System.out.println("publicKey: " + publicKey.getHexString()); System.out.println("privateKey: " + privateKey.getHexString()); } } ``` 3. SM2加密和解密 ```java import com.huawei.security.sm.SM2PrivateKey; import com.huawei.security.sm.SM2PublicKey; import com.huawei.security.sm.SM2Engine; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.KeyPairGenerator; import javax.crypto.Cipher; import javax.crypto.NoSuchPaddingException; public class SM2Demo { public static void main(String[] args) throws NoSuchProviderException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, NoSuchPaddingException { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); // 创建密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); keyPairGenerator.initialize(256); SM2KeyPair sm2KeyPair = new SM2KeyPair(keyPairGenerator.generateKeyPair()); // 获取公钥和私钥 SM2PublicKey publicKey = sm2KeyPair.getPublicKey(); SM2PrivateKey privateKey = sm2KeyPair.getPrivateKey(); // 加密 SM2Engine sm2Engine = new SM2Engine(); Cipher cipher = Cipher.getInstance(sm2Engine.getAlgorithmName(), "BC"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] plaintext = "Hello, world!".getBytes(); byte[] ciphertext = cipher.doFinal(plaintext); System.out.println("ciphertext: " + new String(ciphertext)); // 解密 cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decrypted = cipher.doFinal(ciphertext); System.out.println("decrypted: " + new String(decrypted)); } } ``` 4. SM3哈希算法 ```java import com.huawei.security.sm.SM3Digest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; public class SM3Demo { public static void main(String[] args) throws NoSuchProviderException, NoSuchAlgorithmException { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); // 计算哈希值 SM3Digest sm3Digest = new SM3Digest(); byte[] plaintext = "Hello, world!".getBytes(); sm3Digest.update(plaintext, 0, plaintext.length); byte[] hash = new byte[sm3Digest.getDigestSize()]; sm3Digest.doFinal(hash, 0); System.out.println("hash: " + org.bouncycastle.util.encoders.Hex.toHexString(hash)); } } ``` 希望这个Demo工程能够帮助您使用国密算法(SM2-SM3)的Java开发。如果您有任何疑问,请随时联系我!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值