SM3和SM4密钥

一. 概述

国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主要使用公开的SM2SM3SM4三类算法,分别是非对称算法哈希算法对称算法

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

SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。

二. 实现

(1) SM3

参数为要加密的内容和秘钥;

import java.io.UnsupportedEncodingException;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import sun.misc.BASE64Encoder;

public class SM3Util {	
	
	/**
	* 
	* @param message 需要进行签名的内容
	* @param secret hmac秘钥
	* @return
	*/
	public static String getSignatureBySM3(String message, String secret) {
	    String signature = null;
	    KeyParameter keyParameter;
	    try {
	        keyParameter = new KeyParameter(secret.getBytes("UTF-8"));
	        SM3Digest digest = new SM3Digest();
	        HMac mac = new HMac(digest);
	        mac.init(keyParameter);
	        mac.update(message.getBytes("UTF-8"), 0, message.length());
	        byte[] byteSM3 = new byte[mac.getMacSize()];
	        mac.doFinal(byteSM3, 0);
	        signature = new BASE64Encoder().encode(byteSM3);
	    } catch (UnsupportedEncodingException e) {
	        System.out.println("getSignatureBySM3 error :");
            e.printStackTrace();
	    }
	    return signature;
	}
}

(2) SM4

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import org.apache.commons.codec.binary.Hex;
import com.huawei.crypto.provider.SMS4KeySpec;
import sun.misc.BASE64Decoder;

/**
 * sm4工具类
 * 秘钥不得小于16位
 * @author hWX588043
 *
 */
public class SM4Util {
	
	static {
		Security.addProvider(new com.huawei.crypto.provider.HWJCE());  
	}
	
    public static String decode(String encrypted, String secretKey) throws Exception {
        // 加密结果转码
        byte[] data = Hex.decodeHex(encrypted.toCharArray());
        // 用户密钥处理
        SecretKey key = getKey(secretKey);

        // 解密
        Cipher cipher = Cipher.getInstance("SMS4");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] reclaimedBytes = cipher.doFinal(data);

        // 将解密结果输出
        return new String(reclaimedBytes, "utf-8");
    }

    /**
     * @param source    待加密字符串
     * @param secretKey 加密秘钥
     * @return 加密结果
     */
    public static String encode(String source, String secretKey)
            throws Exception {
        // 字符串转byte[]
        byte[] data = source.getBytes("utf-8");
        // 密钥处理
        SecretKey key = getKey(secretKey);

        // 加密
        Cipher cipher = Cipher.getInstance("SMS4");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedBytes = cipher.doFinal(data);

        // 将加密结果转16进制输出
        return Hex.encodeHexString(encryptedBytes);
    }

    /**
     * 对secretKey进行加密
     *
     * @param secretKey 密钥
     * @throws Exception
     */
    private static SecretKey getKey(String secretKey) throws Exception {
        byte[] keyBytes = new BASE64Decoder().decodeBuffer(secretKey);
        SMS4KeySpec sms4KeySpec = new SMS4KeySpec(keyBytes);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("SMS4");
        return keyFactory.generateSecret(sms4KeySpec);
    }
    
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用Bouncy Castle库来实现SM3算法以生成密钥对。可以按照以下步骤进行操作: 1. 首先,确保你的Java开发环境中已经添加了Bouncy Castle库的依赖。 2. 在代码中导入相关的类库,比如`org.bouncycastle.jce.provider.BouncyCastleProvider`、`java.security.KeyPair`和`java.security.KeyPairGenerator`等。 3. 添加Bouncy Castle作为安全提供者,可以使用`Security.addProvider(new BouncyCastleProvider())`。 4. 使用`KeyPairGenerator`类来生成密钥对,指定使用SM3算法,可以使用`KeyPairGenerator.getInstance("SM3WithSM2", "BC")`。接下来,使用`KeyPairGenerator`的`generateKeyPair()`方法生成密钥对。 5. 最后,你可以通过`KeyPair`对象获取生成密钥对,分别是公钥和私钥。 参考文献: 国密是咱大中国的国家密码局认定和颁发的密码算法标准,SM 是一个系列,常用的包括SM1、SM2、SM3SM4。 一般说商密是指商用密码。更多是我们更加耳熟能详的的密码学标准。诸如AES、DAS、RSA、ECC椭圆曲线系列等加密... SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。 国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主要使用公开的SM2、SM3SM4三类算法,分别是非对称算法、哈希算法和对称算法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java实现sm2、sm3sm4国密算法,完美实现,轻松调用](https://download.csdn.net/download/qq_30308931/11865460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SM3SM4密钥](https://blog.csdn.net/Swofford/article/details/129507950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值