SM4是一种分组密码算法,其分组长度为128位(即16字节,4字),密钥长度也为128位(即16字节,4字)。其加解密过程采用了32轮迭代机制(与DES、AES类似),每一轮需要一个轮密钥(与DES、AES类似)。

1.引入密码算法相关包

<dependency>  <groupId>org.bouncycastle</groupId>  <artifactId>bcprov-jdk15on</artifactId>  <version>1.59</version>
</dependency> 

2.工具类

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Arrays;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;import org.apache.tomcat.util.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;public class SM4Util {static {Security.addProvider(new BouncyCastleProvider());}private static final String ENCODING = "UTF-8";public static final String ALGORITHM_NAME = "SM4";// 加密算法/分组加密模式/分组填充方式// PKCS5Padding-以8个字节为一组进行分组加密// 定义分组加密模式使用:PKCS5Paddingpublic static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";// 128-32位16进制;256-64位16进制public static final int DEFAULT_KEY_SIZE = 128;private static final BouncyCastleProvider PROVIDER = new BouncyCastleProvider();// 自定义密钥或使用generateKey生成密钥public static String secret_key = "fjeWEhu41223Tycd";/*** 自动生成密钥* @explain* @return* @throws NoSuchAlgorithmException* @throws NoSuchProviderException*/public static byte[] generateKey() throws Exception {return generateKey(DEFAULT_KEY_SIZE);}/*** @explain* @param keySize* @return* @throws Exception*/public static byte[] generateKey(int keySize) throws Exception {KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);kg.init(keySize, new SecureRandom());return kg.generateKey().getEncoded();}/*** 加密** @param content    加密的字符串* @param encryptKey key值*/public static String encrypt(String content)  throws Exception {//设置Cipher对象Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, PROVIDER);cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secret_key.getBytes(), ALGORITHM_NAME));//调用doFinalbyte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));// 转base64return Base64.encodeBase64String(b);}/*** 解密** @param encryptStr 解密的字符串* @param decryptKey 解密的key值*/public static String decrypt(String encryptStr)   throws Exception{//base64格式的key字符串转bytebyte[] decodeBase64 = Base64.decodeBase64(encryptStr);//设置Cipher对象Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, PROVIDER);cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secret_key.getBytes(), ALGORITHM_NAME));//调用doFinal解密byte[] decryptBytes = cipher.doFinal(decodeBase64);return new String(decryptBytes);}public static void main(String[] args) {try {System.out.println(encrypt("123qwe++"));System.out.println(encrypt("rwertw"));} catch (Exception e) {e.printStackTrace();}}}

3.出现的问题

maven打包部署没有出现问题,

但是可运维的jar包,打包后执行报错JCE cannot authenticate the provider BC,查询了问题,发现还需要配置jdk

进入jdk安装目录下jre/lib/security,编辑文件java.security

添加配置:11是序号,前面对应递增就行,如果你最后是9,这里需要改成10.

security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

然后从项目maven库里拷贝使用到的 bcprov-jdk15on-1.59.jar,复制到jre/lib/ext/目录下

之后重启项目(一定不能忘记这一步)

【工具】国密SM4算法加解密相关推荐

  1. 国密 SM4 文件加解密

    国密算法SM4 对文件加解密 说明:调用开源bcprov-jdk15on 加密算法工具,使用SM4算法,对文件进行加密.解密:文件流的操作使用hutool工具包来实现. 引用依赖 <depend ...

  2. 国密SM2算法加解密文件

    对文档进行加密操作,只有经过系统解密后才能进行查看文档内容 这里使用hutool工具类提供的SM2方法,首先引入pom.xml依赖 hutool文档地址 <!--工具类--> <de ...

  3. java break 在if 中使用_java中使用国密SM4算法详解

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

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

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

  5. C#国密SM4 CBC加密解密

    ** C#国密SM4 CBC加密解密 在你得项目nuget引用程序集:KYSharp.SM 安装 2.0 版本,里面才有sm4的加密 ** static void Main(string[] args ...

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

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

  7. 利用OpenSSL,用国密SM4算法来给文件加密、解密

    用OpenSSL产生一个随机填充的文件 a.txt ,然后计算这个文件的SHA256摘要.等一下用OpenSSL加密产生 b.txt 再对 b.txt 解密产生c.txt .计算 c.txt 的SHA ...

  8. 国密SM4算法(简介与C源码)

    国密即国家密码局认定的国产密码算法,即商用密码. 国密算法是国家密码局制定标准的一系列算法.其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法.具体包括SM1,SM2,SM3,SM4等,其中:S ...

  9. 国密SM9算法C++实现之七:加密解密算法

    SM9算法C++实现系列目录: 基于JPBC的SM9算法的java实现与测试 国密SM9算法C++实现之0:源码下载地址 国密SM9算法C++实现之一:算法简介 国密SM9算法C++实现之二:测试工具 ...

  10. 国密SM9算法C++实现之九:算法功能与测试例子

    SM9算法C++实现系列目录: 基于JPBC的SM9算法的java实现与测试 国密SM9算法C++实现之0:源码下载地址 国密SM9算法C++实现之一:算法简介 国密SM9算法C++实现之二:测试工具 ...

最新文章

  1. win7关闭系统索引服务器,win7系统关闭磁盘索引功能的操作方法
  2. Hive之 hive-1.2.1 + hadoop 2.7.4 集群安装
  3. Vivado联合ModelSim仿真设置(附图步骤)
  4. 笔记-项目采购管理-战略合作管理-建立供应商战略合作伙伴关系的意义
  5. 作业05之《6种质量属性战术》
  6. knn人脸识别判断_测试使用K-最近邻(kNN)算法的30个问题
  7. 分享一款自用网站导航分类目录程序源码
  8. linux c语言 utf8读写,关于在C程序中处理UTF-8文本的方法详解
  9. Ztree勾选节点后取消勾选其父子节点
  10. linux定时任务的配置详解
  11. pads 2007 安装完成后, 出现 no license 的解决方法
  12. 实验7 多个交换机虚拟局域网
  13. 端到端语音识别技术预研与实践
  14. 如何树立正确的工作态度
  15. DataBase异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
  16. 小米一代扫地机器人磨损家具_为了以后的众测 篇二:无差评居家神器——Mi 小米 扫地机器人...
  17. window10无线可以上网却显示“无internet 安全” 状态栏显示未连接的地球图标
  18. 坐飞机系安全带的用处
  19. Qt学习 第22节:Qcolor 中的Alpha不透明度
  20. 完全集成的云备份和还原服务——NetApp Cloud Backup

热门文章

  1. 联想笔记本电脑键盘灯怎么开启_联想笔记本电脑wifi怎么连接 联想笔记本电脑键盘灯开启方法...
  2. 安装各种工具/第三方库(随时更新)
  3. 基于node.js和oicq的qq机器人 制作回顾分析笔记
  4. c语言混响,混响插件(2cAudio Aether)
  5. 主板h110能装linux吗_华硕H110T +i3 8100T 组装黑苹果Mac mini安装教程
  6. MacBook Pro下载工具
  7. Talib技术因子详解(五)
  8. 2022新和平精英画质助手iApp源码+附成品/可用的
  9. 软媒魔方6.13正式版:软件管家开启多线程极速下载
  10. -离散数学-期末练习题解析