国密算法工具-SmUtil

介绍

Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。

国密算法工具封装包括:

  • 非对称加密和签名:SM2
  • 摘要签名算法:SM3
  • 对称加密:SM4国密算法需要引入Bouncy Castle库的依赖。

使用

引入Bouncy Castle依赖

  1. <dependency>
  2. <groupId>org.bouncycastle</groupId>
  3. <artifactId>bcprov-jdk15on</artifactId>
  4. <version>${bouncycastle.version}</version>
  5. </dependency>

说明bcprov-jdk15on的版本请前往Maven中央库搜索,查找对应JDK的版本。

非对称加密SM2

  • 使用随机生成的密钥对加密或解密
  1. String text = "我是一段测试aaaa";
  2. SM2 sm2 = SmUtil.sm2();
  3. // 公钥加密,私钥解密
  4. String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
  5. String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
  • 使用自定义密钥对加密或解密
  1. String text = "我是一段测试aaaa";
  2. KeyPair pair = SecureUtil.generateKeyPair("SM2");
  3. byte[] privateKey = pair.getPrivate().getEncoded();
  4. byte[] publicKey = pair.getPublic().getEncoded();
  5. SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
  6. // 公钥加密,私钥解密
  7. String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
  8. String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));

摘要加密算法SM3

  1. //结果为:136ce3c86e4ed909b76082055a61586af20b4dab674732ebd4b599eef080c9be
  2. String digestHex = SmUtil.sm3("aaaaa");

对称加密SM4

  1. String content = "test中文";
  2. SymmetricCrypto sm4 = SmUtil.sm4();
  3. String encryptHex = sm4.encryptHex(content);
  4. String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);