前言

上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

ps:我们既可以基于Java 原生实现加密和解密,又可以基于第三方的工具包实现。下面我们首先介绍基于第三方工具包 hutool,如果是项目的话建议直接使用第三方的工具。

一、使用步骤

1.引入库

在项目的pom.xml的dependencies中加入以下内容:

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

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

2.创建maven测试工程

3.开始编写对称加密SM4测试方法

package org.xiangbiao;import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;/***SM4Test* @author larry.xiang**/
public class SM4Test
{public static void main( String[] args ){String content = "fisco bcos";SymmetricCrypto sm4 = SmUtil.sm4();String encryptHex = sm4.encryptHex(content);String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);System.out.println(encryptHex+"rn"+decryptStr);}
}

4.测试结果

二、如何定制自己的密钥?

如下面的代码所示:

package org.xiangbiao;import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;/***SM4Test* @author larry.xiang**/
public class SM4Test
{public static void main( String[] args ){String content = "fisco bcos";// key必须是16位String key="1234567890123456";SymmetricCrypto sm4 = SmUtil.sm4(key.getBytes());String encryptHex = sm4.encryptHex(content);String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);System.out.println(encryptHex+"rn"+decryptStr);}
}

总结

有小伙伴在使用自己自定义的密钥报错如下:

Exception in thread "main" cn.hutool.crypto.CryptoException: InvalidKeyException: SM4 requires a 128 bit keyat cn.hutool.crypto.symmetric.SymmetricCrypto.encrypt(SymmetricCrypto.java:209)at cn.hutool.crypto.symmetric.SymmetricCrypto.encrypt(SymmetricCrypto.java:312)at cn.hutool.crypto.symmetric.SymmetricCrypto.encryptHex(SymmetricCrypto.java:322)at org.xiangbiao.SM4Test.main(SM4Test.java:20)
Caused by: java.security.InvalidKeyException: SM4 requires a 128 bit keyat org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineInit(Unknown Source)at javax.crypto.Cipher.init(Cipher.java:1245)at javax.crypto.Cipher.init(Cipher.java:1185)at cn.hutool.crypto.symmetric.SymmetricCrypto.encrypt(SymmetricCrypto.java:203)... 3 more

注意:128 bit = 128 / 8 = 16 byte

链接:java中使用国密SM4算法详解_ CSDN博客
作者:向彪-fisco bcos

java break 在if 中使用_java中使用国密SM4算法详解相关推荐

  1. java mac pos_pos终端mac国密(sm4)算法(java实现)

    概念理解 mac算法是(Message Authentication Codes 消息认证码算法),是含有密钥散列函数算法.主要通过异或运算,再配合其他加密算法实现mac值的运算,用于校验. 实现过程 ...

  2. java后台验证不能为空_java validation 后台参数验证的使用详解

    一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间 ...

  3. 国密算法java语言的实现:利用bcprov和hutool库分别实现国密SM4算法工具类,对称密钥

    SM4算法成为行业标准: SM4分组密码算法是2012年3月21日实施的一项行业标准: 2021年6月25日,我国SM4分组密码算法作为国际标准ISO/IEC 18033-3:2010/AMD1:20 ...

  4. java上传csv错误信息_java处理csv文件上传示例详解

    前言:示例只是做了一个最最基础的上传csv的示例,如果要引用到代码中去,还需要根据自己的业务自行添加一些逻辑处理. ReadCsvUtil工具类 package com.hanfengyeqiao.g ...

  5. java类的定义的实例_Java中类的定义和初始化示例详解

    类的定义 类的定义格式 //创建类 class classname{ field ://成员属性/字段 method://方法 } class为定义类的关键字,classname为类的名字,{ }为类 ...

  6. 多目标跟踪算法中之图匹配——匈牙利算法和KM算法详解

    目录 一.匈牙利算法 1.算法背景及思想 2.最大匹配 3.最优匹配/完美匹配 4.增广路径 5.代码实现 6.匈牙利算法总结 6.1.深度优先 6.2. 广度优先 二.KM算法思想及局限性 代码示例 ...

  7. java项目短信群发接口_JAVA实现第三方短信发送过程详解

    想使代码生效需要注册: 在muven项目里面导入jar包 commons-codec commons-codec 1.4 commons-httpclient commons-httpclient 3 ...

  8. Java中创建String的两道面试题及详解

    转载自 Java中创建String的两道面试题及详解 我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd";String str2 ...

  9. java显示参数,Java中的隐式参数和显示参数实例详解

    在学习java的过程中,我们会遇到许多的问题.下面我们就来看看什么是隐式参数和显示参数. 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数www.cppcns.com. 隐式参数 ...

最新文章

  1. Nagios监控系统安装及配置文档
  2. docker多主机网络方案
  3. Spring Boot-@Configuration注解
  4. boost::mp11::mp_inherit相关用法的测试程序
  5. python 数据导入mysql_用python批量向数据库(MySQL)中导入数据
  6. .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(二)
  7. ARM入门笔记(4)
  8. RPM-YUM-源码
  9. 阿里网盘资源查找使用技巧
  10. [2020.12.6 解决docker容器乱码问题] 一劳永逸export env LANG=C.UTF-8永久支持中文,无需Dockerfile重建镜像
  11. learning and enjoying
  12. ModBus(RTU TCP UDP通信)及利用socket通信(DTU)实现Modbus-RTU通信协议
  13. Microsoft Office Word使用技巧(各种报告论文排版可能需要的小技巧)
  14. 【油猴脚本】鼠标选中跳转蓝奏云有效链接及自动填写提取码
  15. Java WORD转换PDF 并添加水印 (附赠jar提取链接)
  16. 技术与市场脱钩?90%的程序员都错了!
  17. java操作svn工具类
  18. Sequoia(基于JDBC的数据库集群中间件)用户手册
  19. Red Hat Enterprise Linux 5安装Oracle10
  20. Content type 'multipart/form-data;boundary=--------------------------496238283102520395700876;解决方案

热门文章

  1. centos 升级gcc
  2. 简单实用一分钟上手级权限控制
  3. springboot启动不打印日志信息_SpringBoot日志操作【全局异常捕获消息处理--日志控制台输出+日志文件记录】...
  4. 职场上个人的核心技术_职场上的情绪管理
  5. unity3d 自动变化大小_一种可扩展的Unity3d资源检查方式
  6. dingo php,详细介绍Laravel+Dingo/Api 自定义响应
  7. go读取excel_Golang操作Excel
  8. oracle文件IO错误,ORA-01114: 将块写入文件 16 时出现 IO 错误 (块 # 1734107)
  9. 2017计算机软件考试试题,2017年计算机应用考试试题含答案.doc
  10. CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)