一、JDK提供的默认MD5算法工具

MD5算法类型枚举

/*** JDK提供的默认摘要算法.** @author linzp* @date 2022/2/8 16:46*/
public enum DigestAlgorithmEnum {/*** MD5*/MD5("MD5"),/*** MD2*/MD2("MD2"),/*** SHA*/SHA("SHA"),/*** SHA*/SHA1("SHA-1"),/*** SHA2*/SHA224("SHA-224"),/*** SHA2*/SHA256("SHA-256"),/*** SHA5*/SHA384("SHA-384"),/*** SHA5*/SHA512("SHA-512");/*** 算法编码.*/private String code;/*** 无参*/DigestAlgorithmEnum(){}/*** 构造.* @param code*/DigestAlgorithmEnum(String code) {this.code = code;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}
}

MD5算法工具类

import io.sugo.cloud.data.security.enums.DigestAlgorithmEnum;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** 常规摘要算法:MD5、SHA实现** @author linzp* @date 2022/2/8 16:44*/
public final class MD5Util {/*** 16进制*/private static final String[] HEX_DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};/*** 私有构造*/private MD5Util() {}/*** md5加密** @param srcData* @return*/public static String entrypt(DigestAlgorithmEnum digestAlgorithmEnum, byte[] srcData) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance(digestAlgorithmEnum.getCode()).digest(srcData);} catch (NoSuchAlgorithmException e) {throw new RuntimeException("this digest algorithm is not exists!");}return byteToHexString(secretBytes);}/*** 转换16进制.** @param bs* @return*/public static String byteToHexString(byte[] bs) {StringBuffer sb = new StringBuffer();for (byte b : bs) {sb.append(byteToHexString(b));}return sb.toString();}/*** 转换16进制.** @param b* @return*/private static String byteToHexString(byte b) {int n = b;if (n < 0) {n = 256 + n;}int d1 = n / 16;int d2 = n % 16;return HEX_DIGITS[d1] + HEX_DIGITS[d2];}
}

二、国密SM3摘要算法实现工具类

需要导入maven依赖

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.69</version>
</dependency>

国密SM3实现摘要算法加密工具类,可实现对文件的MD5加密

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.util.encoders.Hex;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.Security;/*** 国密SM3摘要算法实现工具.* 用于替换MD5、SHA算法** @author linzp* @date 2022/2/8 10:48*/
public final class SM3Util {/*** 私有构造器.*/private SM3Util() {}// 拓展算法提供方,加载BC库.static {Security.addProvider(new BouncyCastleProvider());}/*** SM3摘要算法逻辑** @param srcData 待加密byte[]* @return*/private static byte[] sm3(byte[] srcData) {SM3Digest sm3Digest = new SM3Digest();sm3Digest.update(srcData, 0, srcData.length);byte[] hash = new byte[sm3Digest.getDigestSize()];sm3Digest.doFinal(hash, 0);return hash;}/*** 摘要算法加密** @param srcData 待加密byte[]* @return*/public static String encrypt(byte[] srcData) {byte[] hash = sm3(srcData);String hexString = Hex.toHexString(hash);return hexString;}/*** 指定密钥进行加密.** @param key     密钥* @param srcData 待加密byte[]* @return*/private static byte[] hmacSm3(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[] hash = new byte[mac.getMacSize()];mac.doFinal(hash, 0);return hash;}/*** 指定密钥进行加密.** @param key     密钥* @param srcData 待加密byte[]* @return*/public static String encrypt(byte[] key, byte[] srcData) {byte[] hash = hmacSm3(key, srcData);String hexString = Hex.toHexString(hash);return hexString;}/*** 基于BC库的摘要算法加密** @param srcData 待加密byte[]* @return* @throws Exception*/private static byte[] sm3bc(byte[] srcData) throws Exception {MessageDigest messageDigest = MessageDigest.getInstance("SM3", "BC");byte[] digest = messageDigest.digest(srcData);return digest;}/*** 基于BC库的摘要算法加密** @param srcData 待加密byte[]* @return* @throws Exception*/public static String encryptBC(byte[] srcData) throws Exception {byte[] hash = sm3bc(srcData);String hexString = Hex.toHexString(hash);return hexString;}/*** 对文件进行摘要算法加密.** @param file* @return*/public static String encrypt(File file) {//TODO-linzp 如使用大文件应该对此方法进行优化,避免出现OOMbyte[] srcData;FileInputStream fis = null;ByteArrayOutputStream bos = new ByteArrayOutputStream();try {fis = new FileInputStream(file);byte[] b = new byte[1024];int n;while ((n = fis.read(b)) != -1) {bos.write(b, 0, n);}srcData = bos.toByteArray();} catch (Exception e) {e.printStackTrace();throw new RuntimeException("file not found!");} finally {closeResoruce(fis, bos);}return encrypt(srcData);}/*** 关闭资源.** @param fis* @param bos*/private static void closeResoruce(FileInputStream fis, ByteArrayOutputStream bos) {if (null != fis) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}if (null != bos) {try {bos.close();} catch (IOException e) {e.printStackTrace();}}}
}

Java实现MD5和国密SM3摘要算法相关推荐

  1. C++安全方向(三):3.7 使用openssl_evp接口完成SHA3和国密SM3

    EVP接口 ·EVP系列函数主要封装了加密,摘要,编码三大类型的算法. ·EVP_MD_CTX摘要上下文 ·EVP_MD_CTX_new() ·EVP_MD_CTX_free() ·EVP_MD 摘要 ...

  2. php 国密,PHP关于国密SM3加密的处理

    这几天对接中国联通物联网IoT Gateway门户API系统,其中用到国密SM3,其提供的token需使用国密SM3对源串进行加密处理,网上搜索也没找到什么函数之类的,只有c和java语言写的,看来要 ...

  3. 国密SM3密码杂凑算法原理及实现(附源码)

    相关文章: 国密SM3哈希算法原理及实现(附源码) SHA1哈希算法原理及实现(附源码) MD5哈希算法原理及实现(附源码) MD4哈希算法原理及实现(附源码) MD2哈希算法原理及实现(附源码) M ...

  4. php 国密 签名,关于php国密SM3签名算法

    推荐:<PHP视频教程> php国密SM3签名算法 代码地址 github.com/lizhichao/sm 安装 composer require lizhichao/one-sm 使用 ...

  5. 国密SM3加密算法工具类(非对称)

    /*** 国密SM3,消息摘要** @author Luke*/ @Slf4j public class SM3Util {private static char[] chars = {'0', '1 ...

  6. 使用OpenSSL_EVP接口完成SHA3和国密SM3散列生成

    unsigned char data[128] = "测试EVP SHA3 国密SM3";int data_size = strlen((char*)data);//初始化EVP上 ...

  7. 实现基于国密SM3的密钥派生(KDF)功能

    实现基于国密SM3的密钥派生(KDF) 前言 KDF 标准 基于SM3的kdf实现 前言 密钥派生函数(KDF):密钥派生函数是指从一个共享的秘密比特串中派生密钥数据,在密钥协商过程中,密钥派生函数作 ...

  8. java sm9_一个支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱

    The GmSSL Project 网址:http://gmssl.org/docs/quickstart.html 在网上闲逛时发现一个工具.SSL支持国密算法.看着比较高大上.还没有用呢.记下来. ...

  9. 关于实现国密sm3的一些问题

    最近在学习密码学并使用编程实现时出现一点问题,具体是在实现sm3时,感觉算法和代码实现不太符合,想将问题抛出,以供各位大佬答疑解惑. 以下为诸位提供参考,如对问题感兴趣者跳过至后文 首先介绍一下sm3 ...

最新文章

  1. OpenCV 新版 4.5.1 发布!
  2. UWP Composition API - GroupListView(一)
  3. intelliJ Idea 添加 Tomcat部署(详细步骤)
  4. ANSIBLE---变量
  5. magento 高级搜索 brand实例 Magento ‘Shop By Brand’ in SideBar
  6. CodeForces 103D Time to Raid Cowavans 分块+dp
  7. 设计模式---组件协作模式之观察者模式(Observer)
  8. Citrix XenAPP域迁移操作步骤
  9. windowsC盘msp文件清理
  10. extern dllInport用法
  11. 架构之美第九章-架构与设计
  12. 读书笔记-《程序员成长课》
  13. 使用windows API区分移动硬盘和本地硬盘
  14. Sense 406错误
  15. python to csv参数_pandas的to_csv()使用方法
  16. 计算机主机自动关机如何设置,电脑怎么设置自动关机?电脑自动关机方法教程 电脑维修技术网...
  17. TIA博途软件中程序编辑区标题上的收藏快捷指令取消了,如何恢复显示?
  18. IxEngine开发笔记
  19. golang与手机如何实现一些自动化操作?
  20. Android中notifyDataSetInvalidated()和notifyDataSetChanged()

热门文章

  1. 暑假集训后的一些感想
  2. 有关学术界的治理-来自学术道德通论课程作业
  3. Vue3.0 中的数据侦测
  4. 计算 m 的 n 次幂
  5. Bellman_Ford的负环
  6. maven镜像源及代理配置
  7. 博应用官网揭露不为所知的iPhone手机搜索框使用教程
  8. PHP word ppt pdf 转图片
  9. Originpro绘制y轴偏移堆积图无法设置偏移量
  10. [dp优化]个人对dp优化的理解