当前位置: 首页 > 工具软件 > sm64 > 使用案例 >

sm2,sm3,sm4国密算法实现

澹台奇略
2023-12-01

pom中引入

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15to18</artifactId>
    <version>1.71</version>
</dependency>

<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.0.3</version>
</dependency>

SM2非对称加密

package com.sm.sm2;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 描述: 国密算法生成秘钥对 - 对象 <br>
 * 时间: 2022-07-14 16:01  <br>
 * 作者:王林冲
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SM2KeyPairs {
    /**
     *公钥
     */
    private String publicKey;

    /**
     * 私钥
     */
    private String privateKey;
}
SM2非对称加密辅助类
package com.sm.sm2;

import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;

/**
 * 描述: SM2非对称加密辅助类 <br>
 * 时间: 2022-07-14 16:01  <br>
 * 作者:王林冲
 */
public class SM2Util {

    /**
     * 私钥解密
     * @param privateKey 私钥
     * @param text 加密文本
     * @return 解密后文本
     */
    public static String decrypt(String privateKey, String text){
        // 通过密钥解密
        SM2 sm2 = SmUtil.sm2(privateKey, null);
        String decryptText = sm2.decryptStr(text, KeyType.PrivateKey);
        return decryptText;
    }

    /**
     * 公钥加密
     * @param publicKey 公钥
     * @param text 预加密文本
     * @return 加密后文本
     */
    public static String encrypt(String publicKey, String text){
        // 通过密钥解密
        SM2 sm2 = SmUtil.sm2(null, publicKey);
        String encryptText = sm2.encryptBase64(text, KeyType.PublicKey);
        return encryptText;
    }

    /**
     * 获取公钥私钥
     * @return SM2KeyPairs 公私钥对象
     */
    public static SM2KeyPairs getKeyPairs(){
        SM2 sm = SmUtil.sm2();
        String privateKey = sm.getPrivateKeyBase64();
        String publicKey = sm.getPublicKeyBase64();
        SM2KeyPairs keyPairs = new SM2KeyPairs(publicKey, privateKey);
        return keyPairs;
    }


}
SM3国密算法辅助类 ,SM3加密不可逆,类似 md5
package com.sm.sm3;

import cn.hutool.crypto.SmUtil;

/**
 * 描述: SM3国密算法辅助类 ,SM3加密不可逆,类似 md5<br>
 * 时间: 2022-07-14 16:49  <br>
 * 作者:王林冲
 */
public class SM3Util {

    public static void test() {
        String encrypt = encrypt("123456");
        System.out.println(encrypt);
    }

    public static String encrypt(String text) {
        String digestHex = SmUtil.sm3(text);
        return digestHex;
    }

}
国密SM4对称加密算法辅助类
package com.sm.sm4;

import cn.hutool.crypto.symmetric.SymmetricCrypto;
/**
 * 描述: 国密SM4对称加密算法辅助类<br>
 * 时间: 2022-07-14 16:01  <br>
 * 作者:王林冲
 */
public class SM4Util {

    //key必须是16字节,即128位
    final static String key = "sm4demo123456789";

    //指明加密算法和秘钥
    static SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding", key.getBytes());

    //加密为16进制,也可以加密成base64/字节数组
    public static String encrypt(String text) {
        return sm4.encryptHex(text);
    }

    //解密
    public static String decrypt(String text) {
        return sm4.decryptStr(text);
    }

    public static void main(String[] args) {
        String text = "hello sm4";
        String encryptText = encrypt(text);
        String decryptText = decrypt(encryptText);
        System.out.println(encryptText + "\n" + decryptText);
    }
}
 类似资料: