SMUtil.java 3.26 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
package io.hmit.common.utils.sm;

import io.hmit.common.utils.sm.sm2.SM2Utils;
import io.hmit.common.utils.sm.sm4.SM4Utils;

/**
 * <h1>国标商密 SM4 + SM2</h1>
 *
 * 使用说明:
 * 本工具类对加密结果、加密密钥进行解密后返回原始值。
 *
 * 前端:
 * 1. 对需要加密的 原始文本 采用 SM4 对称加密并生成 SM4 密钥 和 SM4 加密文本
 * 2. 对 SM4 密钥 采用 SM2 加密,使用 SM2 生成的公钥加密并生成 SM2 加密文本
 * 3. 将 SM4 加密文本 和 SM2 加密文本返回后端
 *
 * 后端
 * 1. 接收两端加密文本
 * 2. 对 SM2 加密文本使用本地密钥进行加密,获得被加密的 SM4 密钥
 * 3. 使用 SM4 密钥对 SM4 加密文本进行解密,最终获得被加密的 原始文本
 *
 * @author Shen && syf0412@vip.qq.com
 * @since 2022/9/22 9:50
 */
public class SMUtil {

    // 通常情况下请勿更改此处的 Key 值,除非你知晓后续的问题。
    public static final String SM4_KEY = "Hmit@2022-SM4KEY";
    public static final String SM2_PRIVATE_KEY_HEX = "1946c9950c06b773a232abc866deaa920d0862fe1fdce3ea6ce963222068d3eb";
    public static final String SM2_PUBLIC_KEY_HEX = "047b11abb349f69cc6bb099446aedf1faee1114fbcb5ad49493c39b12296e7ceb3919b3dfc3833af6383c7aa35bb01409641611e1ed894cd28e46984bb97bbc5a0c96a3ccbb9a2c939b1b005d2a51c9346e1b5a903cd61dac624784c6e8d19e5c4fcee348c3a45a2b04cbf8b47cc54e564";

    /**
     * <h2>对文本进行 SM2 解密</h2>
     * @param encryptData 加密文本
     * @return 解密文本
     */
    public static String SM2Decrypt(String encryptData) {
        return SM2Utils.decrypt(SM2_PRIVATE_KEY_HEX, encryptData);
    }

    /**
     * <h2>对文本进行 SM2 加密</h2>
     * @param plainText 原始文本
     * @return 加密文本
     */
    public static String SM2Encrypt(String plainText) {
        return SM2Utils.encrypt(SM2_PUBLIC_KEY_HEX, plainText);
    }

    /**
     * <h2>对文本进行 SM4 解密,默认密钥</h2>
     * @param encryptData 加密文本
     * @return 解密文本
     */
    public static String SM4Decrypt(String encryptData) {
        return SM4Utils.decryptData_ECB(encryptData, SM4_KEY);
    }

    /**
     * <h2>对文本进行 SM4 加密,默认密钥</h2>
     * @param plainText 被加密文本
     * @return 加密文本
     */
    public static String SM4Encrypt(String plainText) {
        return SM4Utils.encryptData_ECB(plainText, SM4_KEY);
    }

    /**
     * <h2>对文本进行 SM4 解密,自定义密钥</h2>
     * @param encryptData 加密文本
     * @param sk 密钥
     * @return 解密文本
     */
    public static String SM4Decrypt(String encryptData, String sk) {
        return SM4Utils.decryptData_ECB(encryptData, sk);
    }

    /**
     * <h2>对文本进行 SM4 加密,自定义密钥</h2>
     * @param plainText 被加密文本
     * @param sk 密钥
     * @return 加密文本
     */
    public static String SM4Encrypt(String plainText, String sk) {
        return SM4Utils.encryptData_ECB(plainText, sk);
    }

    public static String SMDecryptSM2AndSM4(String encryptSM4Key, String encryptSM4Text) {
        if (!encryptSM4Key.startsWith("04")) {
            encryptSM4Key = "04" + encryptSM4Key;
        }
        return SM4Decrypt(encryptSM4Text, SM2Decrypt(encryptSM4Key));
    }

}