基于hutool实现国密SM2的加解密,简直不要太简单!


程序员的公众号:源1024获取更多资料,无加密无套路!

最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上


SM2算法是中国国家密码局推出的一种基于椭圆曲线的非对称加密算法,是一种安全性高、运算速度快的非对称加密算法,适用于数字签名、密钥交换、密钥派生以及数据加密和解密等应用场景,相比于RSA算法,SM2具有以下特点和优势:

  1. SM2算法使用的是ECC 256位椭圆曲线,相对于RSA 2048位,它具有更高的安全强度。
  2. SM2算法的密钥长度较小,运算速度更快。
  3. 在相同密钥长度下,SM2算法比RSA算法具有更高的安全性。
  4. SM2算法在安全性和性能方面都具备优势。

SM2算法的应用主要涵盖以下几个方面:

  1. 数字签名:SM2算法可以用于生成和验证数字签名,保证信息的完整性和真实性。
  2. 密钥交换:SM2算法可以用于在通信过程中安全地交换密钥,确保通信的机密性。
  3. 密钥派生:SM2算法可以用于从一个密钥派生出多个密钥,方便管理和使用。
  4. 加密和解密:SM2算法可以用于加密和解密敏感数据,保护数据的机密性。

具体实现添加以下依赖

        
			cn.hutool
			hutool-all
			5.5.4
		
		
		
			org.bouncycastle
			bcprov-jdk15on
			1.70
		

Java示例代码如下

        /**
         * 生成公私钥
         */
        KeyPair pair = SecureUtil.generateKeyPair("SM2");
        byte[] prikey = pair.getPrivate().getEncoded();
        byte[] pubKey = pair.getPublic().getEncoded();
        //私钥
        String privateKey = bytesToBase64(prikey);
        //公钥
        String publicKey = bytesToBase64(pubKey);
        /**
         * 加密
         */
        SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
        String encryptStr = sm2.encryptBcd("asdf", KeyType.PublicKey);
        System.out.println("加密后:" + encryptStr);

        /**
         * 解密
         */
        String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
        System.out.println("解密后:" + decryptStr);

 运行结果:

加密后:0407536A4A360FCBB07CF2A9687CE3130547EFBD4E95D825AE2A85EE8060FC9AEBEE7467142A86B91BF54B402E805D2CEDAC8104DE428DCFC2487586AAC110F8A3533BAAA3B7EA0D5F06BC3C80487C270D7E6E1F34C66E57487BBDED06A2B73BAAF9B50AA4
解密后:asdf

如果是对接的一些三方系统,可能不会给私钥,只给到一个公钥,那就只用公钥加密,三方系统用对应的私钥解密即可。具体示例如下:

        /**
         * 只用公钥加密,只有对应的私钥才能解密成功
         */
        SM2 sm2 = SmUtil.sm2(null, publicKey);
        String encryptStr = sm2.encryptBcd("asdf", KeyType.PublicKey);
        System.out.println("加密后:" + encryptStr);

你可能感兴趣的:(java,sm2)