Java加密与解密的艺术~SM4实现

国产SM4加密解密算法概念介绍

SMS4算法是在国内广泛使用的WAPI无线网络标准中使用的加密算法,是一种32轮的迭代非平衡Feistel结构的分组加密算法,其密钥长度和分组长度均为128。SMS4算法的加解密过程中使用的算法是完全相同的,唯一不同点在于该算法的解密密钥是由它的加密密钥进行逆序变换后得到的。
SMS4分组加密算法是中国无线标准中使用的分组加密算法,在2012年已经被国家商用密码管理局确定为国家密码行业标准,标准编号GM/T 0002-2012并且改名为SM4算法,与SM2椭圆曲线公钥密码算法,SM3密码杂凑算法共同作为国家密码的行业标准,在我国密码行业中有着极其重要的位置。
SMS4算法的分组长度为128bit,密钥长度也是128bit。加解密算法均采用32轮非平衡Feistel迭代结构,该结构最先出现在分组密码LOKI的密钥扩展算法中。SMS4通过32轮非线性迭代后加上一个反序变换,这样只需要解密密钥是加密密钥的逆序,就能使得解密算法与加密算法保持一致。SMS4加解密算法的结构完全相同,只是在使用轮密钥时解密密钥是加密密钥的逆序。
S盒是一种利用非线性变换构造的分组密码的一个组件,主要是为了实现分组密码过程中的混淆的特性和设计的。SMS4算法中的S盒在设计之初完全按照欧美分组密码的设计标准进行,它采用的方法是能够很好抵抗差值攻击的仿射函数逆映射复合法。

SM4加密算法应用场景

SM4常用于政府系统的数据传输加密,比如当我们前端向后台传参数的时候,可以使用此算法。对参数的数据进行加密,然后后台对加密的数据进行解密再存储到数据库中,保证数据传输过程中,不受泄露。

引入BouncyCastle组件支持

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

SM4Utils

public class Sm4Utils {private static final String ENCODING = "UTF-8";public static final String ALGORIGTHM_NAME = "SM4";public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS7Padding";public static final int DEFAULT_KEY_SIZE = 128;public Sm4Utils() {}static {Security.addProvider(new BouncyCastleProvider());}/***  @Description:生成ecb暗号*/private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {Cipher cipher = Cipher.getInstance(algorithmName,BouncyCastleProvider.PROVIDER_NAME);Key sm4Key = new SecretKeySpec(key, ALGORIGTHM_NAME);cipher.init(mode, sm4Key);return cipher;}/***  @Description:自动生成密钥*/public static byte[] generateKey() throws Exception {return generateKey(DEFAULT_KEY_SIZE);}public static byte[] generateKey(int keySize) throws Exception {KeyGenerator kg = KeyGenerator.getInstance(ALGORIGTHM_NAME, BouncyCastleProvider.PROVIDER_NAME);kg.init(keySize, new SecureRandom());return kg.generateKey().getEncoded();}/***  @Description:加密*/public static String encryptEcb(String hexKey, String paramStr, String charset) throws Exception {String cipherText = "";if (null != paramStr && !"".equals(paramStr)) {byte[] keyData = ByteUtils.fromHexString(hexKey);charset = charset.trim();if (charset.length() <= 0) {charset = ENCODING;}byte[] srcData = paramStr.getBytes(charset);byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData);cipherText = ByteUtils.toHexString(cipherArray);}return cipherText;}/***  @Description:加密模式之ecb*/public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception {Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);byte[] bs = cipher.doFinal(data);return bs;}/***  @Description:sm4解密*/public static String decryptEcb(String hexKey, String cipherText, String charset) throws Exception {String decryptStr = "";byte[] keyData = ByteUtils.fromHexString(hexKey);byte[] cipherData = ByteUtils.fromHexString(cipherText);byte[] srcData = decrypt_Ecb_Padding(keyData, cipherData);charset = charset.trim();if (charset.length() <= 0) {charset = ENCODING;}decryptStr = new String(srcData, charset);return decryptStr;}/***  @Description:解密*/public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception {Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);return cipher.doFinal(cipherText);}/***  @Description:密码校验*/public static boolean verifyEcb(String hexKey,String cipherText,String paramStr) throws Exception {boolean flag = false;byte[] keyData = ByteUtils.fromHexString(hexKey);byte[] cipherData = ByteUtils.fromHexString(cipherText);byte[] decryptData = decrypt_Ecb_Padding(keyData,cipherData);byte[] srcData = paramStr.getBytes(ENCODING);flag = Arrays.equals(decryptData,srcData);return flag;}/***  @Description:测试类*/public static void main(String[] args) {try {String json = "{\"name\":\"color\",\"sex\":\"man\"}";// 自定义的32位16进制密钥String key = "cc9368581322479ebf3e79348a2757d9";String cipher = Sm4Utils.encryptEcb(key, json,ENCODING);System.out.println(cipher);System.out.println(Sm4Utils.verifyEcb(key, cipher, json));json = Sm4Utils.decryptEcb(key, cipher,ENCODING);System.out.println(json);} catch (Exception e) {e.printStackTrace();}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语连接词2

表示附加的词:additionally, as well as, just as, again, along with, also, further, furthermore, likewise, in the same manner, in the same way, in addition to,引出例子:for example, namely, for instance, as an example, that is表示转折:although, instead, rathe…

数字电路中的Multi-bits跨时钟域设计

数字电路中的Multi-bits跨时钟域设计跨时钟域同步设计跨时钟域处理目标Multi-bits的Clock Domin Crossing (CDC) 电路设计1-bit "Guard" 信号同步multi-bits数据其他的Multi-bits跨时钟域同步设计跨时钟域电路的仿真验证跨时钟域同步设计 跨时钟域处理目标 在跨时钟…

packetbeat mysql_简单使用packetbeat

在前面两篇文章中记录了使用logstash来收集mysql的慢查询日志&#xff0c;然后通过kibana以web的方式展示出来&#xff0c;但在生产环境中&#xff0c;需求会更复杂一些&#xff0c;而且通过logstash写正则&#xff0c;实在是个费时费劲的事。例如在生产环境中会有要求分析某个…

ACM公布2017年图灵奖,大卫·帕特森和约翰·轩尼诗获奖

来源&#xff1a;网络大数据刚刚&#xff0c;美国计算机协会(ACM)宣布 John L. Hennessy 和 David A. Patterson 荣获 2017 年图灵奖。目前这两位学者都供职于谷歌&#xff0c;前者是谷歌母公司 Alphabet 的董事会主席&#xff0c;后者任谷歌杰出工程师&#xff0c;致力于研究机…

Java加密与解密的艺术~DES实现

密钥长度与安全性成正比&#xff0c;但Java仅支持56位密钥长度&#xff0c;作为补充&#xff0c;Bouncy Castle 提供64位密钥长度支持。在此基础上配合不同填充方式&#xff08;如PKCS5Padding&#xff0c;PKCS7Padding&#xff09;&#xff0c;可显著提高加密系统的安全性。 D…

YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫)&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何…

Linux学习路线及网络编程经典书籍

linux学习资源整理&#xff1a;https://zhuanlan.zhihu.com/p/22654634 Linux初学者(学习资料)&#xff1a;https://zhuanlan.zhihu.com/p/21723250 知乎 - 你是如何学习 Linux 编程的&#xff1f;&#xff1a;https://www.zhihu.com/question/20730157 如果让你推荐一本 Linux…

在Windows 7解决GAC错误

调试一网站源代码出现下面的错误 错误 1 Could not load file or assembly Microsoft.ReportViewer.WebForms, Version8.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a or one of its dependencies. The system cannot find the file specified. D:\3layerhotel\WebS…

CVPR 2018 | 腾讯AI Lab入选21篇论文详解

来源:腾讯AI实验室近十年来在国际计算机视觉领域最具影响力、研究内容最全面的顶级学术会议CVPR&#xff0c;近日揭晓2018年收录论文名单&#xff0c;腾讯AI Lab共有21篇论文入选&#xff0c;位居国内企业前列&#xff0c;我们将在下文进行详解&#xff0c;欢迎交流与讨论。去年…

mysql判断不等于空的脚本_Shell脚本中判断输入变量或者参数是否为空的方法

1.判断变量复制代码代码如下:read -p "input a word :" wordif [ ! -n "$word" ] ;thenecho "you have not input a word!"elseecho "the word you input is $word"fi2.判断输入参数复制代码代码如下:#!/bin/bashif [ ! -n "$1&…

Java加密与解密的艺术~DESede实现

DESede 实现 /*** 2009-10-5*/ package org.zlex.chapter07_2;import java.security.Key;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec;/*…

update-rc.d 更新 Linux 系统启动项 命令 用法详解

探究 Ubuntu 下的 update-rc.d 命令&#xff1a;http://www.linuxdiyf.com/linux/13362.html Update-rc.d && rc.local 管理 Ubuntu 的开机启动&#xff1a;http://www.linuxdiyf.com/linux/1057.html 通过 update-rc.d 来管理 Ubuntu 系统的自动启动程序&#xff1a;h…

合成艺术字二 :使用的透明类以及所用的颜色选择器JS(完整事列源码)

1.透明类 ImageToTrans using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Runtime.InteropServices; using System.Collections; public static Bitmap MakeTransparentGif(Bitmap bitmap, Color color) …

推荐!神经进化才是深度学习未来的发展之路!

来源&#xff1a;全球人工智能过去几年时间里&#xff0c;我们有一个完整的团队致力于人工智能研究和实验。该团队专注于开发新的进化计算方法&#xff08;EC&#xff09;&#xff0c;包括设计人工神经网络架构、构建商业应用程序&#xff0c;以及使用由自然进化激发的方法来解…

mysql max字符串数值_针对字符串值的mysql:min()和max()。

我有一个连接两个表的SQL Select语句。主表包含产品的其他信息,并联接到第二个尺寸表。第二个表包含存储为字符串的非数字大小列表,其结构简单如下…sizeID主键sizename字符串大小值(即,小、中、大)size order用于排序大小顺序的整数值(即,size order为5表示大小大于size order…

linux 命令:ping、fping、gping、hping3、tracert、traceroute

From&#xff1a; Nmap、Netcat、Hping3工具对比&#xff1a;http://www.2cto.com/article/201210/158961.html ​hping3 命令&#xff1a;http://man.linuxde.net/hping3 示例&#xff1a;Testing firewall rules with Hping3 &#xff1a;https://www.docin.com/p-74538211…

Java加密与解密的艺术~数字签名~模型分析

甲方作为消息的发送方&#xff0c;乙方作为消息的接收方。假设甲乙双方在消息传递之前已经指定了要使的数字签名算法&#xff08;如RSA算法&#xff09;。为完成签名验证&#xff0c;甲乙双方需要以下操作&#xff1a; 1&#xff09;、由消息发送方&#xff08;甲方&#xff09…

BlazeDS入门教程-很详细-赞原创作者一个

什么是BlazeDS呢&#xff1f;BlazeDS是一个基于服务器的Java远程调用&#xff08;remoting&#xff09;和Web消息传递&#xff08;messaging&#xff09;技术&#xff0c;它能够使得后台的Java应用程序和运行在浏览器上的Flex应用程序相互通信。在各大搜索引擎里&#xff0c;关…

excel概率密度函数公式_标准正态分布密度函数公式

展开全部标准正态分布密度函数公式&#xff1a;正态曲线呈钟型62616964757a686964616fe58685e5aeb931333366306532&#xff0c;两头低&#xff0c;中间高&#xff0c;左右对称因其曲线呈钟形&#xff0c;因此人们又经常称之为钟形曲线。若随机变量X服从一个数学期望为μ、方差为…

2017-2018中国物联网产业全景图谱报告——物联网对产业深度变革已开启

来源&#xff1a;物联网智库丨公众号如果说2016年里物联网的产业生态各种要素已具备&#xff0c;那么2017年就是物联网对于国民经济产业变革的规模效应初显的一年&#xff0c;可以说是物联网对产业变革的元年。在这一过程中&#xff0c;通过二维生态图谱去了解过去一年的进展不…