一、pom文件引用

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

二、SM4 实现工具类

package com.prison.common.util;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;/*** @author WangJing* @Description SM2实现工具类* @date 2021/11/24 17:10*/
public class Sm4Util {static {Security.addProvider(new BouncyCastleProvider());}public static final String ALGORITHM_NAME = "SM4";public static final String DEFAULT_KEY = "random_seed";// 128-32位16进制;256-64位16进制public static final int DEFAULT_KEY_SIZE = 128;static {Security.addProvider(new BouncyCastleProvider());}public static byte[] generateKey() throws NoSuchAlgorithmException, NoSuchProviderException {return generateKey(DEFAULT_KEY, DEFAULT_KEY_SIZE);}public static byte[] generateKey(String seed) throws NoSuchAlgorithmException, NoSuchProviderException {return generateKey(seed, DEFAULT_KEY_SIZE);}public static byte[] generateKey(String seed, int keySize) throws NoSuchAlgorithmException, NoSuchProviderException {KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);SecureRandom random = SecureRandom.getInstance("SHA1PRNG");if (null != seed && !"".equals(seed)) {random.setSeed(seed.getBytes());}kg.init(keySize, random);return kg.generateKey().getEncoded();}/*** @description 加密*/public static byte[] encrypt(String algorithmName, byte[] key, byte[] iv, byte[] data) throws Exception {return sm4core(algorithmName, Cipher.ENCRYPT_MODE, key, iv, data);}/*** @description 解密*/public static byte[] decrypt(String algorithmName, byte[] key, byte[] iv, byte[] data) throws Exception {return sm4core(algorithmName, Cipher.DECRYPT_MODE, key, iv, data);}private static byte[] sm4core(String algorithmName, int type, byte[] key, byte[] iv, byte[] data) throws Exception {Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);if (algorithmName.contains("/ECB/")) {cipher.init(type, sm4Key);} else {IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);cipher.init(type, sm4Key, ivParameterSpec);}return cipher.doFinal(data);}
}

三、Sm4Util 的测试类

package com.prison.common.util;import org.junit.Test;import javax.crypto.IllegalBlockSizeException;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.concurrent.TimeUnit;public class Sm4UtilTest {byte[] key = Sm4Util.generateKey();byte[] iv = "1234567890123456".getBytes(StandardCharsets.UTF_8);String text = "wangjing";public Sm4UtilTest() throws NoSuchProviderException, NoSuchAlgorithmException {}@Testpublic void bcSm4UtilTest() throws Exception {List<String> algorithm = new ArrayList<>();algorithm.add(("SM4/ECB/PKCS5PADDING"));algorithm.add(("SM4/ECB/ISO10126PADDING"));algorithm.add(("SM4/CBC/PKCS5PADDING"));algorithm.add(("SM4/CBC/ISO10126PADDING"));algorithm.add(("SM4/CTR/NOPADDING"));algorithm.add(("SM4/CTR/PKCS5PADDING"));algorithm.add(("SM4/CTR/ISO10126PADDING"));algorithm.add(("SM4/CTS/PKCS5PADDING"));algorithm.add(("SM4/CTS/ISO10126PADDING"));algorithm.add(("SM4/ECB/NOPADDING"));algorithm.add(("SM4/CTS/NOPADDING"));algorithm.add(("SM4/CBC/NOPADDING"));algorithm.add(("SM4/PCBC/NOPADDING"));algorithm.add(("SM4/PCBC/PKCS5PADDING"));algorithm.add(("SM4/PCBC/ISO10126PADDING"));for (String s : algorithm) {//SM4加密try {System.out.println("SM4加密算法: " + s);System.out.println("SM4加密原始数据: " + text);System.out.println("SM4加密key: " + Base64.getEncoder().encodeToString(key));System.out.println("SM4加密iv: " + Base64.getEncoder().encodeToString(iv));byte[] encrypt = Sm4Util.encrypt(s, key, iv, text.getBytes());System.out.println("SM4加密数据密文: " + Base64.getEncoder().encodeToString(encrypt));//SM4解密byte[] decrypt = Sm4Util.decrypt(s, key, iv, encrypt);System.out.println("SM4解密数据: " + new String(decrypt));} catch (Exception e) {if (e instanceof IllegalBlockSizeException) {System.err.println("SM4解密数据:算法 " + s + "数据需自己手工对齐");} else {System.err.println("SM4解密数据:算法 " + s + "::" + e.getMessage());}} finally {System.err.println("---------------------------------------");TimeUnit.SECONDS.sleep(1);}}}
}

四、执行效果

SM4加密算法: SM4/ECB/PKCS5PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: D23Kr1pdXjc6kqlb5RF8/A==
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/ECB/ISO10126PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: kfPjpnqiYPuT/yyBuCxZcw==
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/CBC/PKCS5PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: Xw28BjsOM19OJedp52hWgg==
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/CBC/ISO10126PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: rCVCMEPQepm68JOmAyilCA==
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/CTR/NOPADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: zKPtdQmNLfA=
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/CTR/PKCS5PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: zKPtdQmNLfDq1HERtX7ncg==
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/CTR/ISO10126PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: zKPtdQmNLfD1FE6Sf8BBcg==
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/CTS/PKCS5PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: Xw28BjsOM19OJedp52hWgg==
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/CTS/ISO10126PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4加密数据密文: XVS2eJ44zfsI7JmRjOqYAg==
SM4解密数据: wangjing
---------------------------------------
SM4加密算法: SM4/ECB/NOPADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4解密数据:算法 SM4/ECB/NOPADDING数据需自己手工对齐
---------------------------------------
SM4加密算法: SM4/CTS/NOPADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4解密数据:算法 SM4/CTS/NOPADDING数据需自己手工对齐
---------------------------------------
SM4加密算法: SM4/CBC/NOPADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4解密数据:算法 SM4/CBC/NOPADDING数据需自己手工对齐
---------------------------------------
SM4加密算法: SM4/PCBC/NOPADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4解密数据:算法 SM4/PCBC/NOPADDING::No such algorithm: SM4/PCBC/NOPADDING
---------------------------------------
SM4加密算法: SM4/PCBC/PKCS5PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4解密数据:算法 SM4/PCBC/PKCS5PADDING::No such algorithm: SM4/PCBC/PKCS5PADDING
---------------------------------------
SM4加密算法: SM4/PCBC/ISO10126PADDING
SM4加密原始数据: wangjing
SM4加密key: 7pcKrVcOTU68F/emjnhomg==
SM4加密iv: MTIzNDU2Nzg5MDEyMzQ1Ng==
SM4解密数据:算法 SM4/PCBC/ISO10126PADDING::No such algorithm: SM4/PCBC/ISO10126PADDING
---------------------------------------

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

国密算法SM4 的JAVA实现(基于BC实现)相关推荐

  1. PHP实现国密算法SM4

    关于什么是国密算法,我就不多赘述了,好奇的可以看这位博主的文章,好像有简易文档的下载链接(百度文库好像也有) 传送门: http://blog.csdn.net/archimekai/article/ ...

  2. 关于国密算法SM4的流程

    关于国密算法SM4的流程 原来用于无线局域网的国密算法SMS4被定义为SM4作为密码行业标准发布.SM4是一个分组对称密钥算法,明文.密钥.密文都是16字节,加密和解密密钥相同.通过32次循环的非线性 ...

  3. 国密算法-SM4加解密工具类

    import cn.hutool.crypto.symmetric.SymmetricCrypto;/*** @author : chenfan* @className : SM4Utils* @da ...

  4. 国密算法 SM4加密算法 Python完整实现

    SM4介绍 SM4算法是一种对称加密算法,也被称为国密算法.它是由中国密码学家设计的,已被列入国家密码局的标准. SM4算法使用128位的密钥和分组大小,使用32轮迭代加密,可以用于加密数据和验证消息 ...

  5. 国密算法 SM4 对称加密 分组密码 python实现完整代码

    目前,python实现的国密算法库主要是python-gmssl库和snowland-smx(pysmx)库,二者都对SM2(仅公钥加解密和数字签名).SM3.SM4进行了细致而优雅的实现. GMSS ...

  6. 国密算法SM4对本地文件加解密

    根据测试一个2MB文件,在服务器上,加密在1s内,解密在3.4s左右,性能较差,如需要实际使用,请看另一个博客 package com.hidy.dangan.common.util.SM4;impo ...

  7. 国密算法SM4加密,数据加密存储加密

    很多国企项目针对等保分保测评要求很高  加密算法 也是要符合国家密码局认定.针对 这个问题 公司决定使用SM4. 算法介绍: 无    无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无无 ...

  8. php 国密,PHP实现国密算法SM4

    1.SM4算法实现 class SM4 { const SM4_CK = [ 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, 0x70777e85, 0 ...

  9. 【转】国密算法sm4 CBC模式加解密

    一.什么是CBC模式? CBC模式的全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样相互连接在一起. 在CBC模式中,首先将明文分组 ...

最新文章

  1. HTML5调用手机的Datepicker(日期选择器)
  2. java io在文件结尾持续添加内容
  3. ‘Link‘ is not exported from ‘react-router‘
  4. websocket创建失败_SpringBoot2.2 实践WebSocket被不靠谱的百度搜索结果坑了多少人
  5. ByteBuffer
  6. 剑指offer之合并已排序链表(递归实现)
  7. Guava、Spring 如何抽象观察者模式?
  8. 中国移动5G商用首批开放50城 明年扩展至全国地级以上城市
  9. android p wifi一直在扫描_Android Wifi 扫描及自动连接
  10. eclipse 环境安装
  11. kubernetes视频教程笔记 (22)-存储-Secret
  12. 23 个问题 TCP 疑难杂症全解析
  13. 28. Implement strStr()
  14. Windows 10 windows 11 如何离线安装NetFx3
  15. 静态代理和动态代理的区别
  16. 什么是SDK? SDK是什么意思?
  17. WEB网站压力测试方案 压力测试如何换算并发用户数
  18. python绘制contourf填色图,设置色标,解决填图的颜色与实际数值不一致的问题
  19. 计算机改成音乐键位,让键盘变成你想要的样子:改键利器 Karabiner-Elements
  20. 工作表、工作簿保护密码关闭

热门文章

  1. 李宏毅机器学习-代码实践
  2. 控制教程 —— 介绍篇:8.基于Simulink为火车系统建模
  3. 详解Unity 5 全局光照系统Enlighten问题(下)
  4. qemu运行虚拟机无反应,只输出一行提示信息:VNC server running on 127.0.0.1:5900
  5. RabbitMQ的七种工作模式-RPC模式(六)
  6. 打电话给你,为什么不接?
  7. vnpy试用candle_chart
  8. “2017小云社群APP年度评选”全民票选正式开启!
  9. Ubuntu使用有线网卡连接开发板,同时使用无线网卡上网
  10. 钱真的能买到快乐吗?