SM4算法成为行业标准:

  • SM4分组密码算法是2012年3月21日实施的一项行业标准;
  • 2021年6月25日,我国SM4分组密码算法作为国际标准ISO/IEC 18033-3:2010/AMD1:2021《信息技术 安全技术 加密算法 第3部分:分组密码 补篇1:SM4》,由国际标准化组织ISO/IEC正式发布;
  • 中文名SM4分组密码算法标准号GM/T 0002-2012实施日期2012-03-21发布日期2012-03-21技术归口国家密码管理局批准发布部门国家密码管理局。

SM4算法的重要性

  • 是我国提出的分组密码算法,而且得到了国际的认可;
  • 是继SM2/SM9数字签名算法、SM3密码杂凑算法、祖冲之密码算法和SM9标识加密算法之后,我国又一个商用密码算法被纳入ISO/IEC国际标准正式发布;
  • 标志着我国商用密码算法国际标准体系进一步完善,展现了我国先进的密码科技水平和国际标准化能力,对提升我国商用密码产业发展、推动商用密码更好服务“一带一路”建设具有重要意义;
  • 现在,国内已经掀起了国密算法改造的热潮。

SM4算法的特点

  • SM4分组密码算法是一种迭代分组密码算法,由加解密算法和密钥扩展算法组成;
  • SM4是一种Feistel结构的分组密码算法,其分组长度和密钥长度均为128bits。加密算法和密钥扩展算法迭代轮数均为32轮;
  • SM4加解密过程的算法相同但是轮密钥的使用顺序相反;
  • SM4密码算法使用模2加和循环移位作为基本运算;
  • 密钥扩展算法:SM4算法使用128位的加密密钥,并采用32轮迭代加密结构,每一轮加密使用一个32位的轮密钥,总共使用32个轮密钥。因此需要使用密钥扩展算法,从加密密钥中产生32个轮密钥;
  • 密钥:加密密钥的长度为128比特。

使用bcprov库实现SM4算法的封装

这里,使用maven编译。

1. pom文件中的引用:

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.64</version></dependency>```

2. 工具类的实现(Sm4CryptTools)

package com.abc.smutilstest;import org.bouncycastle.crypto.engines.SM4Engine;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;/*** SM4算法工具类*/
public class Sm4CryptTools {//加解密的字节快大小public static final int BlockSize = 16;/*** SM4ECB加密算法,对内* @param in            待加密字节数组* @param keyBytes      密钥* @return*/private static byte[] ecb_encrypt(byte[] in, byte[] keyBytes) {SM4Engine sm4Engine = new SM4Engine();sm4Engine.init(true, new KeyParameter(keyBytes));byte[] out = new byte[in.length];int times = in.length / BlockSize;for (int i = 0; i < times; i++) {sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize);}return out;}/*** SM4ECB加密算法* @param in            待加密字节数组* @param keyBytes      密钥* @return*/public static String EcbEncrypt(byte[] in, byte[] keyBytes) {byte[] out = ecb_encrypt(in, keyBytes);String cipher = Hex.toHexString(out);return cipher;}/*** SM4的ECB加密算法* @param content   待加密字符串, hex字符串* @param key       密钥* @return*/public static String EcbEncrypt(String content, String key) {byte[] in = Hex.decode(content);byte[] keyBytes = Hex.decode(key);String cipher = EcbEncrypt(in, keyBytes);return cipher;}/*** SM4的ECB解密算法,对内* @param in        输入的密文字符串* @param keyBytes  密钥* @return*/private static byte[] ecb_decrypt(byte[] in, byte[] keyBytes) {SM4Engine sm4Engine = new SM4Engine();sm4Engine.init(false, new KeyParameter(keyBytes));int inLen = in.length;byte[] out = new byte[inLen];int times = inLen / BlockSize;for (int i = 0; i < times; i++) {sm4Engine.processBlock(in, i * BlockSize, out, i * BlockSize);}return out;}/*** SM4的ECB解密算法,对外* @param in        输入的密文字节数组* @param keyBytes  密钥* @return*/public static String EcbDecrypt(byte[] in, byte[] keyBytes) {byte[] out = ecb_decrypt(in, keyBytes);String plain = Hex.toHexString(out);return plain;}/*** SM4的ECB解密算法* @param cipher    输入的密文字符串* @param key       密钥* @return*/public static String EcbDecrypt(String cipher, String key) {byte[] in = Hex.decode(cipher);byte[] keyBytes = Hex.decode(key);String plain = EcbDecrypt(in, keyBytes);return plain;}/*** 测试函数*/public static void Sm4Test() {String data = "FB8661A82ADD944230C3AD3957DAA224";String key ="8012BADD542E2C182DFD84795E65A013";String resCipherData = EcbEncrypt(data,key);String resPlainData = EcbDecrypt(resCipherData,key);System.out.println("原始明文:" + data);System.out.println("加密后密文:" + resCipherData);System.out.println("解密后明文:" + resPlainData);}/*** 主函数* @param args*/public static void main(String[] args) {Sm4Test();}}

测试结果:

原始明文:FB8661A82ADD944230C3AD3957DAA224
加密后密文:bc5873a57ff7eda33d74a0b190f1b83f
解密后明文:fb8661a82add944230c3ad3957daa224

使用hutool库实现SM4算法的封装

pom.xml中引入hutool库:

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency>

hutool库的使用:

/*** hutool测试*/public static void TestcaseHutool1(String content){SymmetricCrypto sm4Crypto = SmUtil.sm4();String encryptHex = sm4Crypto.encryptHex(content);System.out.println("原始明文:" + content);System.out.println("加密结果:" + encryptHex);String decryptStr = sm4Crypto.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);System.out.println("解密结果:" + decryptStr);}

测试结果:

原始明文:abc
加密结果:b9e6c65f09bee33181d447416fe32271
解密结果:abc

结语:

SM4无需进行密钥交换,事先就可以直接指定密钥,也可以定期更新。更新后,旧的密文就无法用新的密钥解密了。
SM4可以防止明文传输数据被窃取。
相对于SM2非对称密码算法来说,SM4加解密速度快,适合数据内容比较大的加密场景。

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

  1. 国密算法(SM3)java语言的实现:利用bcprov和huttol库来实现SM3算法,国产哈希算法

    SM3简介: SM3是国产哈希算法 SM3采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布.相关标准为"GM/T 0004-2012 <SM3密码杂凑算法> ...

  2. 算法java语言描述_java语言描述数据结构与算法崔笑颜的博客

    java语言描述数据结构与算法崔笑颜的博客 冒泡排序 插入排序 选择排序 希尔排序 快速排序 归并排序 二分查找package com.demo.test; import java.util.Arra ...

  3. java 百度api人脸识别功能(人脸识别+详细案例+接口及所需工具类)

    最近开发过程中需要用到人脸识别认证功能,然后就用的是百度API接口进行开发,起初设想用直接用人脸识别还是用注册到百度人脸库识别两种方法,为了简化开发直接就用了第一种方式: 直接上业务逻辑代码吧: po ...

  4. anychart java实例_结合AnyChart做报表:一个生成AnyChart图形XML数据的工具类

    今天头有点痛,所以不能详细地写了,先把代码贴上来,等身体状况稍微好一点,再继续完善. 1.(主角)一个使用XML模板生成Anychart XML数据的工具类 /** * */ package com. ...

  5. 用java语言求前50个素数_Java求质数的几种常用算法总结

    Java求质数的几种常用算法分析 本文实例讲述了Java求质数的几种常用算法.分享给大家供大家参考,具体如下: 1.根据质数的定义求 质数定义:只能被1或者自身整除的自然数(不包括1),称为质数. 利 ...

  6. 人工智能合一算法java语言实现_人工智能合一算法UNify.doc

    -算法实现 一.作业目的: 用某一种编程语言实现合一算法. 二.首先把教材中的Unify算法表述如下: 算法 unify (E1, E2) 1 .if E1或E2是一个原子(即一个谓词符号.函数符号. ...

  7. 人工智能合一算法java语言实现_人工智能AI---用LISP语言写合一算法unify

    [问题描述] 编程实现表达式合一算法,对任意两个表达式E1.E2,找出其最一般合一s [测试数据] 输入表达式: E1 = P (x,  f (x),  g (z) )       E2 = P (y ...

  8. 猎豹怎么运行java_猎豹网校 数据结构与算法 Java语言 JAVA语言视频教程(火评)...

    01.NetBeans_下载和安装.mp4  02.JavaDS_数据结构和算法的概述.mp4 03.JavaDS_数组基础知识.mp4 04.JavaDS_有序数组和二分查找.mp4 05.Java ...

  9. 数据结构与算法JAVA语言描述第六章部分课后习题参考答案

    6.2: (a): (b): 6.3: (a): (b): 6.19: 6.26: 6.32:

最新文章

  1. mysql分析表锁,MySQL锁分析和监控
  2. C语言编译报错:incompatible pointer type [-Wincompatible-pointer-types](传参类型不匹配)
  3. 数字图像处理基本运算
  4. 洛谷 - P2472 [SCOI2007]蜥蜴(最大流)
  5. 汇智创科机器人_【汇智创科机器人招聘信息】-看准网
  6. python中列表实现去重使用_Python实现嵌套列表去重方法示例
  7. 【ElasticSearch】ElasticSearch 7.8 IK 同义词 配置
  8. python 函数特殊属性
  9. PHP debug_backtrace() 函数
  10. 为什么所请求的剪切操作失败_MIUI12.5上手体验:给操作系统做了点“加法”,为用户多加了层防护...
  11. BZOJ1047B Cover Points
  12. 从nexus下载所有jar包方法 迁移到其他nexus中
  13. 《运筹学》CSU作业答案
  14. java sync 实现原理_JAVA 同步实现原理
  15. SqlParameter的参数值为 null
  16. 大数据平台监控告警系统的实现
  17. python程序实现分析_Python编程快速上手——疯狂填词程序实现方法分析
  18. 知乎收藏数最高的1000个回答
  19. 超容易获得星球大战信息
  20. 【问链财经-EOS公开课】 第十八课 史上最全EOS 资源汇总

热门文章

  1. 机器学习笔记之概率图模型(六)推断基本介绍
  2. [深入研究4G/5G/6G专题-5]: URLLC-1-业务业务简介与应用场景概述
  3. 【工作复盘】知识从未停止—终结篇
  4. Flink大数据实时计算系列-Flink的Keyed state的使用
  5. D. Returning Home(建图 + 堆优化最短路)
  6. speedtest命令行linux,Linux通过命令行使用speedtest宽带测速
  7. python爬虫系列(2):分析Ajax 爬取搜狗高清壁纸
  8. 给原有的excel文件中插入图片
  9. 带您一起探索关于水利工程施工堤坝防渗加固技术
  10. 定制centos一键自动化安装iso的详细解决方案