1. 程式人生 > >java加密解密研究6、MD演算法家族

java加密解密研究6、MD演算法家族

一、簡述

MD5演算法是典型的訊息摘要演算法,其前身有MD2、MD3和MD4演算法,它由MD4、MD3和MD2演算法改進而來。不論是哪一種MD演算法,它們都需要獲得一個隨機長度的資訊併產生一個123位的資訊摘要。如果將這個128位的二進位制摘要資訊換算成十六進位制,可以得到一個32位的字串,故我們見到的大部分MD5演算法的數字指紋都是32為十六進位制的字串。

MD演算法家族的發展史:

MD2演算法:

1989年,著名的非對稱演算法RSA發明人之一----麻省理工學院教授羅納德.李維斯特開發了MD2演算法。這個演算法首先對資訊進行資料補位,使資訊的位元組長度是16的倍數。再以一個16位的檢驗和做為補充資訊追加到原資訊的末尾。最後根據這個新產生的資訊計算出一個128位的雜湊值,MD2演算法由此誕生。

MD4演算法:

1990年,羅納德.李維斯特教授開發出較之MD2演算法有著更高安全性的MD4演算法。在這個演算法中,我們仍需對資訊進行資料補位。不同的是,這種補位使其資訊的位元組長度加上448個位元組後成為512的倍數(資訊位元組長度mod 512 =448)。此外,關於MD4算的處理和MD2演算法有很大的差別。但最終仍舊會獲得一個128為的雜湊值。MD4演算法對後續訊息摘要演算法起到了推動作用,許多比較有名的訊息摘要演算法都是在MD4演算法的基礎上發展而來的,如MD5、SHA-1、RIPE-MD和HAVAL演算法等。

MD5演算法:

1991年,繼MD4演算法後,羅納德.李維斯特教授開發了MD5演算法,將MD演算法推向成熟。MD5演算法經MD2、MD3和MD4演算法發展而來,演算法複雜程度和安全強度打打提高,但浙西MD演算法的最終結果都是產生一個128位的資訊摘要。這也是MD系列演算法的特點。

一、java提供的MD2和MD5演算法應用

package com.tao.test;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;

import javax.xml.bind.annotation.adapters.HexBinaryAdapter;


/**
 * MD加密工具類
 */
class MDCoder {
	// MD2加密
	public static String encodeMd2(byte[] data) throws Exception {
		// 初始化MessageDigest
		MessageDigest md = MessageDigest.getInstance("MD2");
		// 執行摘要資訊
		byte[] digest = md.digest(data);
		// 將摘要資訊轉換為32位的十六進位制字串
		return new String(new HexBinaryAdapter().marshal(digest));
	}

	// MD5加密
	public static String encodeMd5(byte[] data) throws Exception {
		// 初始化MessageDigest
		MessageDigest md = MessageDigest.getInstance("MD5");
		// 執行摘要資訊
		byte[] digest = md.digest(data);
		// 將摘要資訊轉換為32位的十六進位制字串
		return new String(new HexBinaryAdapter().marshal(digest));
	}
}

public class MDTest {
	public static void main(String[] args) throws UnsupportedEncodingException, Exception {
		String testString = "123456asdasdfsdfsdfsdf";
		System.out.println(MDCoder.encodeMd2(testString.getBytes()));
		System.out.println(MDCoder.encodeMd5(testString.getBytes()));
	}
}


二、BouncyCastle補充的MD4演算法的應用

package Test;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.Security;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

/**
 * MD加密工具類
 */
class MDCoder {
	// MD2加密
	public static String encodeMd4(byte[] data) throws Exception {
		//加入BouncyCastle的支援
		Security.addProvider(new BouncyCastleProvider());
		// 初始化MessageDigest
		MessageDigest md = MessageDigest.getInstance("MD4");
		//執行摘要資訊
		byte[] digest=md.digest(data);
		//將摘要資訊轉換為32位的十六進位制字串
		return new String(Hex.encode(digest));
	}
}

public class MDTest {
	public static void main(String[] args) throws UnsupportedEncodingException, Exception {
		String testString="123456asdasdfsdfsdfsdf";
		String digestString=MDCoder.encodeMd4(testString.getBytes());
		System.out.println(digestString);
	}
}

三、Commons Codec提供的實現

Commons Codec提供了訊息摘要的工具類-----DigestUtils類。DigestUtils類是對Sun提供的MessageDigest類的一次封裝,提供了MD5和SHA系列訊息摘要演算法的實現。

package Test;

import java.io.UnsupportedEncodingException;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;

/**
 * MD加密工具類
 */
class MDCoder {
	// MD5加密 返回十六進位制的字串
	public static String encodeMd5Hex(byte[] data) throws Exception {
		return DigestUtils.md5Hex(data);
	}

	// MD5加密,返回十進位制的位元組陣列
	public static byte[] encodeMd5(byte[] data) {
		return DigestUtils.md5(data);
	}
}

public class MDTest {
	public static void main(String[] args) throws UnsupportedEncodingException, Exception {
		String testString = "123456asdasdfsdfsdfsdf";
		//十六進位制的字串
		String digestString = MDCoder.encodeMd5Hex(testString.getBytes());
		System.out.println(digestString);
		
		//位元組陣列
		byte[] digest=MDCoder.encodeMd5(testString.getBytes());
		String dString=new String(Hex.encodeHex(digest));
		System.out.println(dString);
	}
}


實際應用中根據自己的選擇用選擇不同的方法來實現MD訊息摘要演算法

相關推薦

java加密解密研究6MD演算法家族

一、簡述 MD5演算法是典型的訊息摘要演算法,其前身有MD2、MD3和MD4演算法,它由MD4、MD3和MD2演算法改進而來。不論是哪一種MD演算法,它們都需要獲得一個隨機長度的資訊併產生一個123位的資訊摘要。如果將這個128位的二進位制摘要資訊換算成十六進位制,可以得到

java加密解密研究2Bouncy Castle和Commons Codec加密元件

在java的加密解密的API中,幾乎各種常用的加密演算法都能找到對應的實現,但還是難免會有遺憾:受出口限制,金鑰長度上不能滿足要求;部分演算法未能支援,如MD4、SHA-224等演算法;API使用起來還不是很方便;一些常用的進位制轉換輔助工具未能提供,如Base64轉換、十

JAVA加密解密之凱撒加密(Caesar cipher)演算法

凱撒加密演算法簡介 凱撒加密(Caesar cipher)是一種簡單的訊息編碼方式:它根據字母表將訊息中的每個字母移動常量位k。舉個例子如果k等於3,則在編碼後的訊息中,每個字母都會向前移動3位:a會被替換為d;b會被替換成e;依此類推。字母表末尾將回捲到字母

Java 加密解密 對稱加密演算法 非對稱加密演算法 MD5 BASE64 AES RSA

【前言】 本文簡單的介紹了加密技術相關概念,最後總結了java中現有的加密技術以及使用方法和例子 【最簡單的加密】1.簡單的概念 明文:加密前的資訊 密文:機密後的資訊 演算法:加密或解密的演算法 金鑰:演算法使用的鑰匙(讀作miyao,正確應該是miyue,但是大家都讀m

JAVA加密解密之DH(Diffie-Hellman)演算法

DH演算法簡介 Diffie-Hellman演算法(D-H演算法),金鑰一致協議。是由公開金鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡單的說就是允許兩名使用者在公開媒體上交換資訊以生成”一致”的、可以共享的金鑰。換句話說,就是由甲方產出

第十八篇:JAVA加密解密之DH(Diffie-Hellman)演算法

DH演算法簡介 Diffie-Hellman演算法(D-H演算法),金鑰一致協議。是由公開金鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡單的說就是允許兩名使用者在公開媒體上交換資訊以生成”一致”的、可以共享的金鑰。換句話說,就是由甲方產出一對金鑰(

password學4——Java 加密解密之消息摘要算法(MD5 SHA MAC)

加密解密 hash函數 -s -m hmac 可能 正向 技術發展 哈希算法 Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又稱為數字摘要(Digital Digest)。它是一個唯一相

java加密解密

子郵件 openssl sock 天數 file 驗證 word genrsa https 一:1.KeyManagerFactory類(密鑰管理工廠,用來管理密鑰): 構建密鑰庫管理工廠與下例一樣: System.setProperty("javax.net.ssl.k

java加密解密技術(3)對稱加密AES

import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; imp

Java 加密解密工具類AESUtil

package test; /* @auther wjh @date 2018-08-01*/ import java.security.SecureRandom; import javax.crypto.Cipher; import javax.cry

Java加密解密之數字簽名

上一篇帖子,我們講了MAC(訊息認證碼),它可以驗證身份和防篡改。 它的機制是通過通訊雙方都持有相同的祕鑰去實現,祕鑰相同摘要才相同,沒有祕鑰就不能生成正確的摘要資訊。 但是,它有個缺點,就是通訊雙方必須持有相同的祕鑰,解決方法就是使用數字簽名 數字簽名(又稱公鑰數字簽名、

Java加密解密之對稱加密

採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。 其核心思想是,加密和解密都是同一個祕鑰 對稱加密常用的演算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJAC

java伺服器開發:6寫第一個Servlet

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、什麼是servlet? 1)擴充套件web伺服器功能 2)元件規範 二、如何開發一個servlet? 1)環境搭建 2)手動開發Servlet 3)MyEcli

Java 加密解密工具

package com.panda.core.db.util; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import

Java加密解密之MAC(訊息認證碼)

上一篇帖子,我們講了訊息摘要(數字摘要),它是把一個文字/檔案 通過摘要函式(hash函式)計算出一個結果。然後把文字/檔案和摘要結果一同發給接受者 接受者接收到檔案之後,也進行摘要,把兩個摘要結果進行對比。如果一致就說明文字/檔案和摘要是一致的 但是,這裡有個問題,假設A

Java加密解密全解

1 sha加密: 安全雜湊演算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於2^6

【開發工具】JAVA效能分析:6超詳細的JProfiler記憶體分析(官方中文版)

Memory Profiling——記憶體分析 有兩種方法可以獲取有關堆上物件的資訊。一方面,分析代理可以跟蹤每個物件的分配和垃圾收集。在JProfiler中,這稱為“分配記錄”。它告訴您已分配物件的位置,還可用於建立有關臨時物件的統計資訊。另一方面,JVM的分析介面允許分析代理採用“堆快照”,

Java加密解密之非對稱加密

非對稱加密演算法需要兩個金鑰來進行加密和解密,這兩個祕鑰是公開金鑰(public key,簡稱公鑰)和私有金鑰(private key,簡稱私鑰)。使用公鑰加密的,要使用私鑰解密。反之,使用私鑰加密的,要使用公鑰解密。 和對稱加密的區別是: 對稱加密:加密和解密時使用的是

java加密解密和簽名的問題

注意:加密:先用公鑰加密再用私鑰解密             解密:先用私鑰解密再用公鑰解密 因為公鑰加密長度<127 私鑰》127 關於簽名: debug--除錯 release--釋出--正式簽名--android.keystore 應用升級:包名相同   簽名

JAVA加密解密之數字證書

系統之間在進行互動的時候,我們經常會用到數字證書,數字證書可以幫我們驗證身份等,下面我們就來看一下在java中如何使用數字證書。 我們先使用keytool工具生成金鑰庫並匯出公鑰證書。 第一步:生成keyStroe檔案 執行如下命令: keyto