From 157ff131c9d708f5378834dc8817390484255da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=B2=90?= Date: Sat, 24 Feb 2024 12:20:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BD=E5=AF=86SM2=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../maku/framework/security/crypto/Sm2Util.java | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 maku-framework/src/main/java/net/maku/framework/security/crypto/Sm2Util.java diff --git a/maku-framework/src/main/java/net/maku/framework/security/crypto/Sm2Util.java b/maku-framework/src/main/java/net/maku/framework/security/crypto/Sm2Util.java new file mode 100644 index 0000000..2167edc --- /dev/null +++ b/maku-framework/src/main/java/net/maku/framework/security/crypto/Sm2Util.java @@ -0,0 +1,84 @@ +package net.maku.framework.security.crypto; + +import cn.hutool.core.util.HexUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.SmUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.SM2; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.util.encoders.Hex; + +import java.security.KeyPair; +import java.security.PrivateKey; +import java.security.PublicKey; + +/** + * 国密SM2加密算法 + * + * @author 阿沐 babamu@126.com + * MAKU + */ +public class Sm2Util { + /** + * 公钥 + */ + private final static String PUBLIC_KEY = "3059301306072a8648ce3d020106082a811ccf5501822d034200040a302b5e4b961afb3908a4ae191266ac5866be100fc52e3b8dba9707c8620e64ae790ceffc3bfbf262dc098d293dd3e303356cb91b54861c767997799d2f0060"; + /** + * 私钥 + */ + private final static String PRIVATE_KEY = "308193020100301306072a8648ce3d020106082a811ccf5501822d047930770201010420d7840173df3d6cd72cad4040dfc7dbfcde539f5b490b54f3cd5c4125544b38aea00a06082a811ccf5501822da144034200040a302b5e4b961afb3908a4ae191266ac5866be100fc52e3b8dba9707c8620e64ae790ceffc3bfbf262dc098d293dd3e303356cb91b54861c767997799d2f0060"; + + private final static SM2 sm2; + + static { + sm2 = SmUtil.sm2(PRIVATE_KEY, PUBLIC_KEY); + } + + /** + * 加密 + * + * @param data 明文 + * @return 加密后的密文 + */ + public static String encrypt(String data) { + return sm2.encryptBase64(data, KeyType.PublicKey); + } + + /** + * 解密 + * + * @param data 加密后的密文 + * @return 解密后的明文 + */ + public static String decrypt(String data) { + return sm2.decryptStr(data, KeyType.PrivateKey); + } + + public static void main(String[] args) { + KeyPair keyPair = SecureUtil.generateKeyPair("SM2"); + System.out.println("privateKey:" + HexUtil.encodeHexStr(keyPair.getPrivate().getEncoded())); + System.out.println("publicKey:" + HexUtil.encodeHexStr(keyPair.getPublic().getEncoded())); + + PublicKey publicKey = keyPair.getPublic(); + if (publicKey instanceof BCECPublicKey) { + // 获取65字节非压缩缩的十六进制公钥串(0x04) + String publicKeyHex = Hex.toHexString(((BCECPublicKey) publicKey).getQ().getEncoded(false)); + System.out.println("SM2公钥:" + publicKeyHex); + } + PrivateKey privateKey = keyPair.getPrivate(); + if (privateKey instanceof BCECPrivateKey) { + // 获取32字节十六进制私钥串 + String privateKeyHex = ((BCECPrivateKey) privateKey).getD().toString(16); + System.out.println("SM2私钥:" + privateKeyHex); + } + + String password = "admin"; + String sm2Password = Sm2Util.encrypt(password); + System.out.println("sm2 加密:" + sm2Password); + System.out.println("sm2 解密:" + Sm2Util.decrypt(sm2Password)); + + + System.out.println("sm3 解密:" + SmUtil.sm3("admin")); + } +}