失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > sm3 算法java_java sm3加密算法

sm3 算法java_java sm3加密算法

时间:2019-09-01 05:30:45

相关推荐

sm3 算法java_java sm3加密算法

1.准备工作

所需jar包:

bcprov-jdk15on-1.59.jar

commons-lang3-3.1.jar

2001

对应的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 7月5日上午10:01:24

* @version 1.0

* @since

* @email marydon0307@

*/

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\":\"/Marydon0307\"}";

String hex=Sm3Utils.encrypt(json);

System.out.println(hex);//0b0880f6f2ccd817809a432420e42b66d3772dc18d80789049d0f9654efeae5c//验证加密后的16进制字符串与加密前的字符串是否相同

boolean flag =Sm3Utils.verify(json, hex);

System.out.println(flag);//true

}

如果觉得《sm3 算法java_java sm3加密算法》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。