前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java实现国密SM4加密「建议收藏」

java实现国密SM4加密「建议收藏」

作者头像
全栈程序员站长
发布2022-11-10 16:23:17
3.5K0
发布2022-11-10 16:23:17
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。


前言

在这里插入图片描述
在这里插入图片描述

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


一、国密SM4是什么?

代码语言:javascript
复制
	国密即国家密码局认定的国产密码算法。
	
	主要有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库可以支持国密算法

代码语言:javascript
复制
<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 使用秘钥

代码语言:javascript
复制
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 对象时,不传秘钥即可。

代码语言:javascript
复制
SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding");

2.3 使用SmUtil快速创建SymmetricCrypto对象

代码语言:javascript
复制
//不带秘钥
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类的构造方法非常灵活,可以灵活根据自己需要的方式进行构造

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185668.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月5日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、国密SM4是什么?
  • 二、使用步骤
    • 1.引入hutool依赖
      • 2.示例代码
        • 2.1 使用秘钥
        • 2.2 不使用秘钥
        • 2.3 使用SmUtil快速创建SymmetricCrypto对象
    • 三、API介绍
      • 3.1 加密方法
        • 3.2 解密方法
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档