Java实现MD5和国密SM3摘要算法
生活随笔
收集整理的這篇文章主要介紹了
Java实现MD5和国密SM3摘要算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、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摘要算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何去掉按钮的立体效果
- 下一篇: 蓝桥杯剪邮票问题