前言

在这里插入图片描述

最近世界政治影响,我国也开始要求算法的使用,以避免来自外国的黑客入侵。我们在使用加密算法时,有必要选择使用国密算法进行加密


一、国密SM4是什么?

解释

国密即国家密码局认定的国产密码算法。 主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。 SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。 SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。 SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。 SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

复制

二、使用步骤

1.引入hutool依赖

Hutool借助Bouncy Castle库可以支持国密算法

解释

<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.5</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.58</version> </dependency>

复制

2.示例代码

2.1 使用秘钥

解释

import cn.hutool.crypto.symmetric.SymmetricCrypto; public class sm4Demo { //key必须是16字节,即128位 final static String key = "sm4demo123456789"; //指明加密算法和秘钥 static SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding", key.getBytes()); //加密为16进制,也可以加密成base64/字节数组 public static String encryptSm4(String plaintext) { return sm4.encryptHex(plaintext); } //解密 public static String decryptSm4(String ciphertext) { return sm4.decryptStr(ciphertext); } public static void main(String[] args) { String content = "hello sm4"; String plain = encryptSm4(content); String cipher = decryptSm4(plain); System.out.println(plain + "\n" + cipher); } }

复制

2.2 不使用秘钥

构造SymmetricCrypto 对象时,不传秘钥即可。

SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding");

复制

2.3 使用SmUtil快速创建SymmetricCrypto对象

解释

//不带秘钥 SymmetricCrypto sm4 = SmUtil.sm4(); //带秘钥 String key = "1234567812345678"; SymmetricCrypto sm4 = SmUtil.sm4(key.getBytes());

复制


三、API介绍

3.1 加密方法

SymmetricCrypto 类方法

返回类型

encrypt (byte[] data)

byte[]

encrypt (String data,Charset charset)

byte[]

encryptBase64(byte[] data)

String

encrypt(Inputstream data)

byte[]

encrypt (String data)

byte[]

encrypt (String data,String charset)

byte[]

encryptBase64(String data)

String

encryptBase64(InputStream data)

String

encryptBase64(String data,String charset)

String

encryptBase64(String data,Charset charset)

String

encryptHex (byte[] data)

String

encryptHex (String data)

String

encryptHex (Inputstream data)

String

encryptHex(String data,string charset)

String

encryptHex (String data,Charset charset)

String

3.2 解密方法

SymmetricCrypto 类方法

返回类型

decryptstr (String data)

String

decryptstr (byte[] bytes,Charset charset)

String

decrypt (byte[] bytes))

byte[]

decrypt (String data)

byte[]

decryptstr (byte[] bytes)

String

decrypt (InputStream data)

byte[]

decryptStr (InputStream data)

String

decryptstr (String data,Charset charset)

String

decryptstr (String data,Charset charset)

String

总结

SymmetricCrypto类的构造方法非常灵活,可以灵活根据自己需要的方式进行构造

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐