Java sm3加密算法的实现

网友投稿 369 2022-11-16


Java sm3加密算法的实现

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 digestzTpyBFOcN = 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,zTpyBFOcN sm3Hash))

flag = true;

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return flag;

}

4.测试

public static void main(String[] args) {

// 测试二:json

String json = "{\"name\":\"Marydon\",\"website\":\"http://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加密算法的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中LinkedList真的是查找慢增删快
下一篇:关于Java继承中父类和子类构造函数的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~