国密算法 SM2 SM4

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
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值