-
2021-02-12 18:44:05
1.准备工作
所需jar包:
bcprov-jdk15on-1.59.jar
commons-lang3-3.1.jar
20200901
对应的maven依赖
org.bouncycastle
bcprov-jdk15on
1.66
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Arrays;
/**
* sm3加密算法工具类
* @explain 加密与加密结果验证(不可逆算法)
* @author Marydon
* @creationTime 2018年7月5日上午10:01:24
* @version 1.0
* @since
* @email marydon20170307@163.com
*/
public class Sm3Utils {
private static final String ENCODING = "UTF-8";
static {
Security.addProvider(new BouncyCastleProvider());
}
}
2.SM3加密
方式一:不提供密钥
/**
* sm3算法加密
* @explain
* @param paramStr
* 待加密字符串
* @return 返回加密后,固定长度=32的16进制字符串
*/
public static String encrypt(String paramStr){
// 将返回的hash值转换成16进制字符串
String resultHexString = "";
try {
// 将字符串转换成byte数组
byte[] srcData = paramStr.getBytes(ENCODING);
// 调用hash()
byte[] resultHash = hash(srcData);
// 将返回的hash值转换成16进制字符串
resultHexString = ByteUtils.toHexString(resultHash);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return resultHexString;
}
/**
* 返回长度=32的byte数组
* @explain 生成对应的hash值
* @param srcData
* @return
*/
public static byte[] hash(byte[] srcData) {
SM3Digest digest = new SM3Digest();
digest.update(srcData, 0, srcData.length);
byte[] hash = new byte[digest.getDigestSize()];
digest.doFinal(hash, 0);
return hash;
}
方式二:自定义密钥
/**
* 通过密钥进行加密
* @explain 指定密钥进行加密
* @param key
* 密钥
* @param srcData
* 被加密的byte数组
* @return
*/
public static byte[] hmac(byte[] key, byte[] srcData) {
KeyParameter keyParameter = new KeyParameter(key);
SM3Digest digest = new SM3Digest();
HMac mac = new HMac(digest);
mac.init(keyParameter);
mac.update(srcData, 0, srcData.length);
byte[] result = new byte[mac.getMacSize()];
mac.doFinal(result, 0);
return result;
}
3.加密数据校验
/**
* 判断源数据与加密数据是否一致
* @explain 通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据
* @param srcStr
* 原字符串
* @param sm3HexString
* 16进制字符串
* @return 校验结果
*/
public static boolean verify(String srcStr, String sm3HexString) {
boolean flag = false;
try {
byte[] srcData = srcStr.getBytes(ENCODING);
byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString);
byte[] newHash = hash(srcData);
if (Arrays.equals(newHash, sm3Hash))
flag = true;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return flag;
}
4.测试
public static voidmain(String[] args) {//测试二:json
String json = "{\"name\":\"Marydon\",\"website\":\"http://www.cnblogs.com/Marydon20170307\"}";
String hex=Sm3Utils.encrypt(json);
System.out.println(hex);//0b0880f6f2ccd817809a432420e42b66d3772dc18d80789049d0f9654efeae5c//验证加密后的16进制字符串与加密前的字符串是否相同
boolean flag =Sm3Utils.verify(json, hex);
System.out.println(flag);//true
}
更多相关内容 -
Java sm3加密算法的实现
2021-03-18 12:28:331.准备工作所需jar包:bcprov-jdk15on-1.59.jarcommons-lang3-3.1.jar对应的maven依赖org.bouncycastlebcprov-jdk15on1.66import org.bouncycastle.crypto.digests.SM3Digest;import org.bouncycastle.crypto.macs....1.准备工作
所需jar包:
bcprov-jdk15on-1.59.jar
commons-lang3-3.1.jar
对应的maven依赖
org.bouncycastle
bcprov-jdk15on
1.66
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Arrays;
/**
* sm3加密算法工具类
* @explain 加密与加密结果验证(不可逆算法)
* @author Marydon
* @creationTime 2018年7月5日上午10:01:24
* @version 1.0
* @since
* @email marydon20170307@163.com
*/
public class Sm3Utils {
private static final String ENCODING = "UTF-8";
static {
Security.addProvider(new BouncyCastleProvider());
}
}
2.SM3加密
方式一:不提供密钥
/**
* sm3算法加密
* @explain
* @param paramStr
* 待加密字符串
* @return 返回加密后,固定长度=32的16进制字符串
*/
public static String encrypt(String paramStr){
// 将返回的hash值转换成16进制字符串
String resultHexString = "";
try {
// 将字符串转换成byte数组
byte[] srcData = paramStr.getBytes(ENCODING);
// 调用hash()
byte[] resultHash = hash(srcData);
// 将返回的hash值转换成16进制字符串
resultHexString = ByteUtils.toHexString(resultHash);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return resultHexString;
}
/**
* 返回长度=32的byte数组
* @explain 生成对应的hash值
* @param srcData
* @return
*/
public static byte[] hash(byte[] srcData) {
SM3Digest digest = new SM3Digest();
digest.update(srcData, 0, srcData.length);
byte[] hash = new byte[digest.getDigestSize()];
digest.doFinal(hash, 0);
return hash;
}
方式二:自定义密钥
/**
* 通过密钥进行加密
* @explain 指定密钥进行加密
* @param key
* 密钥
* @param srcData
* 被加密的byte数组
* @return
*/
public static byte[] hmac(byte[] key, byte[] srcData) {
KeyParameter keyParameter = new KeyParameter(key);
SM3Digest digest = new SM3Digest();
HMac mac = new HMac(digest);
mac.init(keyParameter);
mac.update(srcData, 0, srcData.length);
byte[] result = new byte[mac.getMacSize()];
mac.doFinal(result, 0);
return result;
}
3.加密数据校验
/**
* 判断源数据与加密数据是否一致
* @explain 通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据
* @param srcStr
* 原字符串
* @param sm3HexString
* 16进制字符串
* @return 校验结果
*/
public static boolean verify(String srcStr, String sm3HexString) {
boolean flag = false;
try {
byte[] srcData = srcStr.getBytes(ENCODING);
byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString);
byte[] newHash = hash(srcData);
if (Arrays.equals(newHash, sm3Hash))
flag = true;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return flag;
}
4.测试
public static void main(String[] args) {
// 测试二:json
String json = "{\"name\":\"Marydon\",\"website\":\"http://www.cnblogs.com/Marydon20170307\"}";
String hex = Sm3Utils.encrypt(json);
System.out.println(hex);// 0b0880f6f2ccd817809a432420e42b66d3772dc18d80789049d0f9654efeae5c
// 验证加密后的16进制字符串与加密前的字符串是否相同
boolean flag = Sm3Utils.verify(json, hex);
System.out.println(flag);// true
}
以上就是Java sm3加密算法的实现的详细内容,更多关于Java sm3加密算法的资料请关注脚本之家其它相关文章!
-
java SM4加密demo
2019-03-29 10:59:26java SM4加密demo, 大家喜欢下载, 有问题可以留言哦 -
Java实现SM3加密和验证
2022-04-07 14:42:05在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。 需要引入如下坐标依赖: <dependency> <groupId&...在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。
需要引入如下坐标依赖:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.68</version> </dependency>
自定义密钥加密及校验
加密
private static final String ENCODING = "UTF-8"; /** * 加密 * * @param src 明文 * @param key 密钥 * @return * @throws Exception */ public static String encrypt(String src, String key) throws Exception { return ByteUtils.toHexString(getEncryptByKey(src, key)); } /** * SM3加密方式之: 根据自定义密钥进行加密,返回加密后长度为32位的16进制字符串 * * @param src 源数据 * @param key 密钥 * @return * @throws Exception */ public static byte[] getEncryptByKey(String src, String key) throws Exception { byte[] srcByte = src.getBytes(ENCODING); byte[] keyByte = key.getBytes(ENCODING); KeyParameter keyParameter = new KeyParameter(keyByte); SM3Digest sm3 = new SM3Digest(); HMac hMac = new HMac(sm3); hMac.init(keyParameter); hMac.update(srcByte, 0, srcByte.length); byte[] result = new byte[hMac.getMacSize()]; hMac.doFinal(result, 0); return result; }
校验
/** * 利用源数据+密钥校验与密文是否一致 * * @param src 源数据 * @param key 密钥 * @param sm3HexStr 密文 * @return * @throws Exception */ public static boolean verify(String src, String key, String sm3HexStr) throws Exception { byte[] sm3HashCode = ByteUtils.fromHexString(sm3HexStr); byte[] newHashCode = getEncryptByKey(src, key); return Arrays.equals(newHashCode, sm3HashCode); }
无密钥的加密及校验
加密
/** * SM3加密方式之:不提供密钥的方式 SM3加密,返回加密后长度为64位的16进制字符串 * * @param src 明文 * @return */ public static String encrypt(String src) { return ByteUtils.toHexString(getEncryptBySrcByte(src.getBytes())); } /** * 返回长度为32位的加密后的byte数组 * * @param srcByte * @return */ public static byte[] getEncryptBySrcByte(byte[] srcByte) { SM3Digest sm3 = new SM3Digest(); sm3.update(srcByte, 0, srcByte.length); byte[] encryptByte = new byte[sm3.getDigestSize()]; sm3.doFinal(encryptByte, 0); return encryptByte; }
校验
/** * 校验源数据与加密数据是否一致 * * @param src 源数据 * @param sm3HexStr 16进制的加密数据 * @return * @throws Exception */ public static boolean verify(String src, String sm3HexStr) throws Exception { byte[] sm3HashCode = ByteUtils.fromHexString(sm3HexStr); byte[] newHashCode = getEncryptBySrcByte(src.getBytes(ENCODING)); return Arrays.equals(newHashCode, sm3HashCode); }
测试验证
public static void main(String[] args) throws Exception { String srcStr = "今天天气很晴朗"; String key = "zjqzjq"; // ******************************自定义密钥加密及校验***************************************** String hexStrByKey = SM3Utils.encrypt(srcStr, key); System.out.println("带密钥加密后的密文:" + hexStrByKey); System.out.println("明文(带密钥)与密文校验结果:" + SM3Utils.verify(srcStr, key, hexStrByKey)); // ******************************无密钥的加密及校验****************************************** String hexStrNoKey = SM3Utils.encrypt(srcStr); System.out.println("不带密钥加密后的密文:" + hexStrNoKey); System.out.println("明文(不带密钥)与密文校验结果:" + SM3Utils.verify(srcStr, hexStrNoKey)); }
结果输出如下:
-
C#国密SM3加密算法(和java通用).rar
2021-09-30 13:46:11C#国密SM3加密算法,可以和java接口通用。 -
SM4加密_JAVASM4_国密算法SM4_国密_deathwef_sm4加密网站_
2021-10-03 11:35:12使用JAVA语言实现的简单的SM4国密加密实例代码, -
java sm3国密算法加密、验证工具类
2021-02-25 15:01:47java sm3国密算法加密、验证工具类说明maven依赖完整代码测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出。 maven依赖 <!-- ...说明
由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出。
工具类也可以直接使用封装过的依赖:https://github.com/notsayyu/dsy-sm-cipher/packages/1332757maven依赖
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.54</version> </dependency>
完整代码
package com.example.pass.common.utils; import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import java.io.UnsupportedEncodingException; import java.security.Security; import java.util.Arrays; /** * @description: * @author: dsy * @date: 2021/2/25 14:39 */ public class Sm3Utils { private static final String ENCODING = "UTF-8"; static { Security.addProvider(new BouncyCastleProvider()); } /** * sm3算法加密 * * @param paramStr 待加密字符串 * @return 返回加密后,固定长度=32的16进制字符串 * @explain */ public static String encrypt(String paramStr) { // 将返回的hash值转换成16进制字符串 String resultHexString = ""; try { // 将字符串转换成byte数组 byte[] srcData = paramStr.getBytes(ENCODING); // 调用hash() byte[] resultHash = hash(srcData); // 将返回的hash值转换成16进制字符串 resultHexString = ByteUtils.toHexString(resultHash); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return resultHexString; } /** * 返回长度=32的byte数组 * * @param srcData * @return * @explain 生成对应的hash值 */ public static byte[] hash(byte[] srcData) { SM3Digest digest = new SM3Digest(); digest.update(srcData, 0, srcData.length); byte[] hash = new byte[digest.getDigestSize()]; digest.doFinal(hash, 0); return hash; } /** * 判断源数据与加密数据是否一致 * * @param srcStr 原字符串 * @param sm3HexString 16进制字符串 * @return 校验结果 * @explain 通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据 */ public static boolean verify(String srcStr, String sm3HexString) { boolean flag = false; try { byte[] srcData = srcStr.getBytes(ENCODING); byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString); byte[] newHash = hash(srcData); if (Arrays.equals(newHash, sm3Hash)) { flag = true; } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return flag; }
测试
-
【国产加密算法-java实现SM3】
2022-01-07 23:44:22国产加密算法-java实现SM3 一、国产加密算法介绍 国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。 其中SM1、SM4、SM7、祖冲之密码(ZUC)是... -
SM2加密解密java代码完整示例
2018-12-01 16:05:35国产加密算法SM2加密解密java代码完整示例。里面有加密解密的示例,生成秘钥的示例,本人亲测有效。默认maven环境编译。若无maven环境,里面也上传了相关依赖jar包。 -
sm3加密
2022-03-17 10:28:44后端实现sm3加密: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.54</version> </dependency> ... -
js 和 java 的sm3 加密
2019-02-21 17:49:00相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。 在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当 -
SM4国密加密解密JAVA代码实现.zip
2019-12-19 11:11:54SMS4国密JAVA加密解密完整代码,无异常java类文件,导入即用。Convert.java 内部字符串进制转换类,SMS4.java 国密加密解密处理方法类。TestMain.java 测试类,调用 encrypt 加密 decode 解密 -
java及js分别实现SM3加密
2018-09-20 17:09:54最近项目要使用SM3加密,搜了网上很多资料,整理了一下,里面有java后台前端js实现SM3加密,验证SM3加密工具,以及SM3文档 -
[极简教学]Java的SM3加密算法(附GitHub源码教学)
2020-06-05 15:52:18极简教学Java的SM3加密算法[免费附上github源码] 讲文之前,简单介绍一下SM3算法 SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的... -
java python SM3 加密算法,及开发包。。等bcprov-jdk16-1.46 SM3.java SM3
2022-06-22 12:22:30java SM3 加密算法,及开发货。。python 等 bcprov-jdk16-1.46 SM3.java SM3Digest.java SM3Utils.java Util.java解压可用! -
.NET版本SM3加密,亲测可用,跟java加密结果一致
2020-01-10 09:40:55SM3是中国采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。 -
Java 算法SM2加密解密
2021-09-27 16:31:52简介 什么是SM2 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。 SM2 算法和 RSA 算法都是公钥密码算法,SM2 算法是一种更先进安全的算法,在我们国家商用密码体系中... ... SM2算法和RSA算法比较 ...SM -
Java实现 sm 2 3 4 加密解密签名验签工具包
2018-06-11 16:57:23java代码实现sm2的加密解密签名验签,sm3加密,sm4加密 -
GitHub - amao-blog/SM3: 密码学作业、课程设计:国产加密算法SM3的java实现
2021-03-09 08:41:26一、SM3算法介绍SM3是国家密码管理局编制的商用算法,它是一种杂凑算法,可以应用于数字签名、验证等密码应用中。其计算方法、计算步骤和运算实例可以在国家商用密码管理办公室官网查看。该算法的输入是一个长度 L ... -
国密算法SM3-java实现
2022-05-28 19:18:30Maven依赖 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId>...SM3Utils import org.bouncycastle.crypto.digests.SM3Digest; i -
【烦人的加密算法】国密SM3的使用--Java版本
2022-01-04 12:11:53为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和... -
JAVA SM2 SM3 SM4 算法实现,提供例子
2018-12-20 17:37:57提供国密三方API,代码可以运行,提供了SM2,SM3,SM4标准算法,欢迎大家下载 -
java版的sm2、sm3、sm4加密解密,以及数据转换工具等
2017-09-26 21:01:43java版的sm2、sm3、sm4加密和解密,以及数据转换工具等,比bcd转acd, 字符串转字节数组,数据扩展等方法的。 -
sm2 sm3 sm4 加密解密 Java实现
2020-09-04 17:20:06SM4.0(原名SMS4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日...主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位 使用的依赖 // https://mvnrepository.com/artifact -
java sm2 加密 解密
2021-07-21 16:11:53java sm2 加密 解密 maven依赖key 实体工具类 maven依赖 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.57</... -
国产加密SM3算法java实现
2018-06-21 09:36:54SM3.java public class SM3 { public static final byte[] iv = { 0x73, (byte) 0x80, 0x16, 0x6f, 0x49, 0x14, (byte) 0xb2, (byte) 0xb9, 0x17, 0x24, 0x42, (byte) 0xd7, (byte)... -
Sm3Encryptor_java_加密_解密_
2021-10-03 06:17:14sm3加密解密工具类,里面的方法可进行sm3加密解密,后续可更新优化