Java实现SM3加密和验证
在商用密码体系中,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加密和验证相关推荐
- Java实现MD5加密、验证
1.工具类代码 package com.shucha.deveiface.biz.test;/*** @author tqf* @Description MD5加密和验证* @Version 1.0* ...
- Java实现MD5加密及验证(两种方式,加盐md5与未加盐md5)
一.加盐MD5加密工具 package com.dimpt.base.util;import java.io.UnsupportedEncodingException; import java.sec ...
- SM3加密与解密校验
SM3密码杂凑算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准.具体算法标准原始文本参见参考文献[1].该算法于2012年发布为密码行业标准(GM/T 0004-2012),2016年 ...
- java sm3国密算法加密、验证工具类
java sm3国密算法加密.验证工具类 说明 maven依赖 完整代码 测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出. 工具类也可以直接使用封装 ...
- java中字符串 MD5密码的加密与验证
java中字符串 MD5密码的加密与验证 MD5即Message-Digest Algorithm 5(信息-摘要 算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译 摘要 ...
- java shiro盐值加密_shiro盐值加密并验证
在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密码,如果能反推回来那这个加密是没有意义的.著名的加 ...
- springboot 和 js (vue) 实现SM3加密 防篡改
springboot 和 js (vue) 实现SM3加密 防篡改 一.以下是对引入SM3进行说明 1.首先导入jar <dependency><groupId>org.bou ...
- 【国产加密算法-java实现SM3】
国产加密算法-java实现SM3 一.国产加密算法介绍 国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2).SM2.SM3.SM4.SM7.SM9.祖冲之密码算法(ZUC)那等等. 其 ...
- Hive 使用UDF函数对数据SM3加密
最近在工作中需要对hive中某些数据进行SM3加密,在网上找了很久,遇到一些坑,在这里分享. 例:取姓名第一个汉字后接身份证号进行SM3加密. 1.SM3工具类 pom.xml: <!--sm3 ...
最新文章
- redis.conf配置文件参数说明
- 想学python有什么用-学python日常工作有什么用?
- 【Visual Studio 2019】创建 MFC 桌面程序 ( 安装 MFC 开发组件 | 创建 MFC 应用 | MFC 应用窗口编辑 | 为按钮添加点击事件 | 修改按钮文字 | 打开应用 )
- FPGA进阶篇--SPI控制双通道16bit串行DAC8532
- [转]cocos2d游戏开发,常用工具集合
- 【专升本计算机】2021年甘肃省专升本计算机全真模拟试题(五)
- Java中的局部变量表及使用jclasslib进行查看
- matlab函数输出,优化求解器输出函数
- byte 类型比较_基本类型和包装类对象使用 == 和 equals进行比较的结果?
- Python基础知识汇总
- (转)对SQLSERVER数据库事务日志的疑问
- Java异常Error和Exception
- (转)style,currentStyle,getComputedStyle的区别和用法
- 三星平板电脑安linux,三星平板电脑怎样刷机_三星平板t805c怎么刷机_三星平板怎么刷机...
- 程序运行所花费的时间如何计算
- 2018版ISTQB FL基础级大纲全解析
- 如何设置计算机自动连接宽带,宽带自动连接设置,小编教你电脑怎么设置宽带自动连接...
- 基于MSP430G2553点亮TM1637数码管
- 国内消防报警主机调试软件
- 万有引力太阳系行星轨迹模拟
热门文章
- 微信统一下单 java_微信支付之统一下单--JAVA版
- 追光者用计算机怎么弹,好听的「追光者」教学版来了~ 蓝调小生教你轻松弹奏~...
- 大数据时代的“巫师”
- linux下虚拟机开机重置修改密码,完整步骤
- python 代码块批量添加 Tab缩进 取消缩进 anaconda
- iOS网络2——NSURLSession使用详解
- 随机生成一个6/8/12位密码,数字加字母的密码
- Beam Cannon HDU - 5091 (扫描线) 求矩形内的点的数量
- C# 实现IAccessible学习(四)读取QQ聊天窗口记录
- 图像_camera_基础知识_物理组成_模组组成