package com.llb.test.secret;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import org.apache.commons.codec.binary.Base64;
import java.security.Key;
import java.security.KeyPair;
/**
* 国密算法 SM2 SM4
*
* @author llb
* @date: 2023/3/16 16:14
* @description:
*/
public class GbTest {
public static void main(String[] args) {
sm4Test();
sm2Test();
}
// sm2相同的 公钥、私钥 每次加密后的结果不同
private static void sm2Test(){
String text = "我是一段测试aaaa";
KeyPair pair = SecureUtil.generateKeyPair("SM2");
Key privateKey = pair.getPrivate();
byte[] privateByteKey = privateKey.getEncoded();
String privateStringKey = Base64.encodeBase64URLSafeString(privateByteKey);
System.out.println("SM2的私钥为:" + privateStringKey);
//MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg3QCMa0OakobaeicC80GsTYDoEmb1buvqX5tpiyB_hSagCgYIKoEcz1UBgi2hRANCAAQWV2NNRaEYelBqWVBwXc9cwri3Qvj2tV6mfZ73NxcT5bIyStnwTw627H5ms2sML1iMqgzjze3Qjo9N1L_wEFpG
Key publicKey = pair.getPublic();
byte[] publicByteKey = publicKey.getEncoded();
String publicStringKey = Base64.encodeBase64URLSafeString(publicByteKey);
System.out.println("SM2的公钥为:" + publicStringKey);
//MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFldjTUWhGHpQallQcF3PXMK4t0L49rVepn2e9zcXE-WyMkrZ8E8Otux-ZrNrDC9YjKoM483t0I6PTdS_8BBaRg
SM2 sm2 = SmUtil.sm2(privateByteKey, publicByteKey);
/*SM2 sm2 = SmUtil.sm2(
"MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg3QCMa0OakobaeicC80GsTYDoEmb1buvqX5tpiyB_hSagCgYIKoEcz1UBgi2hRANCAAQWV2NNRaEYelBqWVBwXc9cwri3Qvj2tV6mfZ73NxcT5bIyStnwTw627H5ms2sML1iMqgzjze3Qjo9N1L_wEFpG"
,
"MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFldjTUWhGHpQallQcF3PXMK4t0L49rVepn2e9zcXE-WyMkrZ8E8Otux-ZrNrDC9YjKoM483t0I6PTdS_8BBaRg"
);*/
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
System.out.println("加密后,得到密文:" + encryptStr);
//044FB8FC854A5BA8F6A467E12CF941C50BC90538494DA5FE0458AA8B2C8D3A4D82312FE1BF5783D38AEA4484737C2B9592C1479AD41354F923871E1758218208AD960063808B052D843E5382498EBC77E417392AFB714D392291F464B108AF15CF78099D1C238C553701323ACF33160132AD411D58A06A
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
System.out.println("解密后,得到明文:" + decryptStr);
}
// sm4相同的 key 每次加密后的结果相同
private static void sm4Test(){
byte[] key = "123456@123456789".getBytes();
String cardNo = "1234567812345678";
SymmetricCrypto sm4 = SmUtil.sm4(key);
String encryptHex = sm4.encryptHex(cardNo);
System.out.println("sm4加密结果:"+encryptHex);
//149fc5274b9e162abe6be330d5f38351ec76a8167911a0f5a1edb1542107a22c
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
System.out.println("sm4解密结果:"+decryptStr);
//1234567812345678
}
}