当前位置:   article > 正文

SM2加密_sm2源码

sm2源码

生成 国密公私钥对 工具类


@Slf4j
public class KeyUtils {

    /**
     * 生成国密公私钥对
     *
     * @return
     * @throws Exception
     */
    public static KeyPair generateSmKey() throws InvalidAlgorithmParameterException, NoSuchAlgorithmException {
        ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");
        // 获取一个椭圆曲线类型的密钥对生成器
        final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());
        // 使用SM2参数初始化生成器
        kpg.initialize(sm2Spec);
        // 获取密钥对
        KeyPair keyPair = kpg.generateKeyPair();
        //String[0] 公钥
        //String[1] 私钥
        String[] result = {
                new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded()))
                , new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded()))
        };
        log.info("\n" +
                "公钥:{} \n" +
                "私钥:{}", result[0], result[1]);
        return keyPair;
    }

    /**
     * 将Base64转码的公钥串,转化为公钥对象
     *
     * @param publicKey
     * @return
     */
    public static PublicKey createPublicKey(String publicKey) {
        PublicKey publickey = null;
        try {
            X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
            KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());
            publickey = keyFactory.generatePublic(publicKeySpec);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return publickey;
    }

    /**
     * 将Base64转码的私钥串,转化为私钥对象
     *
     * @param privateKey
     * @return
     */
    public static PrivateKey createPrivateKey(String privateKey) {
        PrivateKey publickey = null;
        try {
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
            KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());
            publickey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return publickey;
    }
 }

  • 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

SM2实现工具类(进行加密以及解密)


public class Sm2Util {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * 根据publicKey对原始数据data,使用SM2加密
     *
     * @param data
     * @param publicKey
     * @return
     */
    public static byte[] encrypt(byte[] data, PublicKey publicKey) {
        ECPublicKeyParameters localECPublicKeyParameters = null;

        if (publicKey instanceof BCECPublicKey) {
            BCECPublicKey localECPublicKey = (BCECPublicKey) publicKey;
            ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();
            ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),
                    localECParameterSpec.getG(), localECParameterSpec.getN());
            localECPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(), localECDomainParameters);
        }
        SM2Engine localSM2Engine = new SM2Engine();
        localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters, new SecureRandom()));
        byte[] arrayOfByte2;
        try {
            arrayOfByte2 = localSM2Engine.processBlock(data, 0, data.length);
            return arrayOfByte2;
        } catch (InvalidCipherTextException e) {

            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根据privateKey对加密数据encodedata,使用SM2解密
     *
     * @param encodedata
     * @param privateKey
     * @return
     */
    public static byte[] decrypt(byte[] encodedata, PrivateKey privateKey) {
        SM2Engine localSM2Engine = new SM2Engine();
        BCECPrivateKey sm2PriK = (BCECPrivateKey) privateKey;
        ECParameterSpec localECParameterSpec = sm2PriK.getParameters();
        ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),
                localECParameterSpec.getG(), localECParameterSpec.getN());
        ECPrivateKeyParameters localECPrivateKeyParameters = new ECPrivateKeyParameters(sm2PriK.getD(),
                localECDomainParameters);
        localSM2Engine.init(false, localECPrivateKeyParameters);
        try {
            byte[] arrayOfByte3 = localSM2Engine.processBlock(encodedata, 0, encodedata.length);
            return arrayOfByte3;
        } catch (InvalidCipherTextException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 私钥签名
     *
     * @param data
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static byte[] signByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {
        Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);
        sig.initSign(privateKey);
        sig.update(data);
        byte[] ret = sig.sign();
        return ret;
    }

    /**
     * 公钥验签
     *
     * @param data
     * @param publicKey
     * @param signature
     * @return
     * @throws Exception
     */
    public static boolean verifyByPublicKey(byte[] data, PublicKey publicKey, byte[] signature) throws Exception {
        Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);
        sig.initVerify(publicKey);
        sig.update(data);
        boolean ret = sig.verify(signature);
        return ret;
    }

}


  • 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
  • 96
  • 97
  • 98

测试

public class test {


    public static void main(String[] args) throws Exception {


        String testStr = "wangjingdsadsad8746121d23sa1d784131111111111111dsadsadsdsdsdsdsd";


        BirBirthCertificateRecordInfo birBirthCertificateRecordInfos = new BirBirthCertificateRecordInfo();
        birBirthCertificateRecordInfos.setBirthDate(LocalDateTime.now());
        birBirthCertificateRecordInfos.setAccountId(321321L);
        birBirthCertificateRecordInfos.setFatherName("父亲名称");
        byte[] bytes = JSON.toJSONString(birBirthCertificateRecordInfos).getBytes(StandardCharsets.UTF_8);


        //生成公私钥对
        KeyPair keyPair = KeyUtils.generateSmKey();

        System.out.println("原始字符串:" + testStr);
        System.out.println("公钥:" + keyPair.getPrivate());
        System.out.println("私钥:" + keyPair.getPublic());
        System.out.println("---------------------------------------------------------------");

        byte[] encrypt = Sm2Util.encrypt(testStr.getBytes(), KeyUtils.createPublicKey(Common.SM2_PUBLIC_KEY));
        String encryptBase64Str = Base64.getEncoder().encodeToString(encrypt);
        System.out.println("加密数据:" + encryptBase64Str);

        encryptBase64Str = "BFHHtdKvuiWll/IMNf+cwO2gn7dXyN2ajdz61ZQmd43eQNUcjVgb4ivLJlMbuvstApvH9nZPuf/V1AqRhAt2RHpn4G/iGwQiQqF+vKVgPEEO3RANh2vJrO7hm2KyYBRs3RrSVgP9Vkj/6/vdMTs4yh0HFsvBBS1ZXaKFzcdPvp5G+KdQ1aPikMagGfl82ZP9rRYBuaqFT/bfMBzdE94Im31un2ZNmBOwZVZAO7pOKCmQtlTwmF03Z832BoHgoY0hcamQWjE5glk30u3bJwwzZlX1PRo4T4UWadfmh3IuUxj9rpeiLn/Ga1D1HzCVQulH+tLQRqpycZO4PZdNrfgIWQdyZvoJmsyRHidEzKRwzpaUyIfnnKMZ2Rde+V8YaaoQHlV82c8QU8CYYEVUX/B2yx6MWkf4oXd76lWhGbCOFbjBCn44OQB2MhCFVn6DTKsDLcplBW78fmNcPNqasDb0AU/v85/JgCDyGwuokUN6FVZ7FpucpT0aOPu5zL51lDvc1XzMD5NA9EIthXrKJBMDQ7yGDn0Fct4WU5q5H8eE0Q+N2vlUW6q6Pxk5m+zOAiXlNAvbvIo0gYKSyBvHzdDEu6cWVAjUO0RWD2IPJhRRtgWg0GKmW0dB85qIUzqFs0yIFY/ctUhf+sk/IkgR0VUD318ApKS37pHNl8B3Xb3soqdiFRetkADPbecIENsrCGmlVnFBvixJ/Gw2KiQXCoG0w7uGmMfGwafaVimevKaJyPNoCcR4it65HcMh1U90/hT7TWa82pGyGdPnJ2RiP4UnZDJRGGh+jkXvSP/K0k6d44HD2iFWxbqkCf8ymX4Me99MMJLUxg/dXfwW73AwRASjJcCAEWw2z7mntBaXKL9I1h+7TFSZzzzrrSxIUf7e5ZtWAdwGjO8K/PnG4ijdBcYENGQPRg+rQ7NWpK7rF/Au8TnIaexa7CghAN54X3Il9J8jxLFYSDHKliif1bvAQ6PM3x9BohKyylR2EOxTI97i6gKTT6KMsFJj+SZpsnpRlTTr71p7oSNrLH9CvQZ4FdYIKJ5V80wKDy6dMUHcCLgTqYsj8Ab8cwhagsDOon638plLAXHvmc5Pci3wAKPRgslUyI1nC4ThCwQ2SZL5hR2f8A/4oIoenWhq6K3INb/iwd5JaLyIoVHCalprCmLMBeGRK0+EKUrjjTsn2tQbmzUha7O5i9ySKcTT/fsLTTwXR6jvQ1RB5Y03E6dfA19aMQBkTM5ms5dPbSPd8gY5ckhTmU31Vu4YIs2Ip66rYiS8hNvPEWdjyLUK9VXCr49E1PN2TtHLeIOmXTETsPgG/MiW3nxV3yyYAYVlHxJN98cMCRnz5ZqXObp74aEQCX38N/JSxjtn0B9EDN6MF4BQLBpa+immnd5cAQQpS5hsw5ISChR16AtBy/m7DdKCenhhHowUKYksZOAq8aWkcdCrZqnF2sX1rSe6t3azrt2Hiz6ZCEFg+NDHhZKb83N5lh7+4nkSQdgy2CXnmdiJ2h9ERaysUICYgLcsQZazgqGSWyEdqhZqp6qqYnvKQqSQeg==";

        byte[] decode = Base64.getDecoder().decode(encryptBase64Str);
        byte[] decrypt = Sm2Util.decrypt(decode, KeyUtils.createPrivateKey(AuthTokenEnum.TOKEN_XT.getPrivateKey()));
        System.out.println("解密数据:" + new String(decrypt));


        byte[] sign = Sm2Util.signByPrivateKey(testStr.getBytes(), KeyUtils.createPrivateKey(Common.SM2_PRIVATE_KEY));
        System.out.println("数据签名:" + Base64.getEncoder().encodeToString(sign));


        boolean b = Sm2Util.verifyByPublicKey(testStr.getBytes(), KeyUtils.createPublicKey(Common.SM2_PUBLIC_KEY), sign);
        System.out.println("数据验签:" + b);
    }
}

  • 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
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号