在商用密码体系中,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));}

结果输出如下:

Java实现SM3加密和验证相关推荐

  1. Java实现MD5加密、验证

    1.工具类代码 package com.shucha.deveiface.biz.test;/*** @author tqf* @Description MD5加密和验证* @Version 1.0* ...

  2. Java实现MD5加密及验证(两种方式,加盐md5与未加盐md5)

    一.加盐MD5加密工具 package com.dimpt.base.util;import java.io.UnsupportedEncodingException; import java.sec ...

  3. SM3加密与解密校验

    SM3密码杂凑算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准.具体算法标准原始文本参见参考文献[1].该算法于2012年发布为密码行业标准(GM/T 0004-2012),2016年 ...

  4. java sm3国密算法加密、验证工具类

    java sm3国密算法加密.验证工具类 说明 maven依赖 完整代码 测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出. 工具类也可以直接使用封装 ...

  5. java中字符串 MD5密码的加密与验证

    java中字符串 MD5密码的加密与验证   MD5即Message-Digest Algorithm 5(信息-摘要 算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译 摘要 ...

  6. java shiro盐值加密_shiro盐值加密并验证

    在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密码,如果能反推回来那这个加密是没有意义的.著名的加 ...

  7. springboot 和 js (vue) 实现SM3加密 防篡改

    springboot 和 js (vue) 实现SM3加密 防篡改 一.以下是对引入SM3进行说明 1.首先导入jar <dependency><groupId>org.bou ...

  8. 【国产加密算法-java实现SM3】

    国产加密算法-java实现SM3 一.国产加密算法介绍 国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2).SM2.SM3.SM4.SM7.SM9.祖冲之密码算法(ZUC)那等等. 其 ...

  9. Hive 使用UDF函数对数据SM3加密

    最近在工作中需要对hive中某些数据进行SM3加密,在网上找了很久,遇到一些坑,在这里分享. 例:取姓名第一个汉字后接身份证号进行SM3加密. 1.SM3工具类 pom.xml: <!--sm3 ...

最新文章

  1. redis.conf配置文件参数说明
  2. 想学python有什么用-学python日常工作有什么用?
  3. 【Visual Studio 2019】创建 MFC 桌面程序 ( 安装 MFC 开发组件 | 创建 MFC 应用 | MFC 应用窗口编辑 | 为按钮添加点击事件 | 修改按钮文字 | 打开应用 )
  4. FPGA进阶篇--SPI控制双通道16bit串行DAC8532
  5. [转]cocos2d游戏开发,常用工具集合
  6. 【专升本计算机】2021年甘肃省专升本计算机全真模拟试题(五)
  7. Java中的局部变量表及使用jclasslib进行查看
  8. matlab函数输出,优化求解器输出函数
  9. byte 类型比较_基本类型和包装类对象使用 == 和 equals进行比较的结果?
  10. Python基础知识汇总
  11. (转)对SQLSERVER数据库事务日志的疑问
  12. Java异常Error和Exception
  13. (转)style,currentStyle,getComputedStyle的区别和用法
  14. 三星平板电脑安linux,三星平板电脑怎样刷机_三星平板t805c怎么刷机_三星平板怎么刷机...
  15. 程序运行所花费的时间如何计算
  16. 2018版ISTQB FL基础级大纲全解析
  17. 如何设置计算机自动连接宽带,宽带自动连接设置,小编教你电脑怎么设置宽带自动连接...
  18. 基于MSP430G2553点亮TM1637数码管
  19. 国内消防报警主机调试软件
  20. 万有引力太阳系行星轨迹模拟

热门文章

  1. 微信统一下单 java_微信支付之统一下单--JAVA版
  2. 追光者用计算机怎么弹,好听的「追光者」教学版来了~ 蓝调小生教你轻松弹奏~...
  3. 大数据时代的“巫师”
  4. linux下虚拟机开机重置修改密码,完整步骤
  5. python 代码块批量添加 Tab缩进 取消缩进 anaconda
  6. iOS网络2——NSURLSession使用详解
  7. 随机生成一个6/8/12位密码,数字加字母的密码
  8. Beam Cannon HDU - 5091 (扫描线) 求矩形内的点的数量
  9. C# 实现IAccessible学习(四)读取QQ聊天窗口记录
  10. 图像_camera_基础知识_物理组成_模组组成