java加密解密研究5 訊息摘要演算法簡介

2021-12-29 16:26:01 字數 1444 閱讀 7497

一、訊息摘要演算法的概述

我們之前介紹過雜湊函式,就是用雜湊(hash)函式來驗證資料的完整性。任何訊息經過雜湊函式處理後,都會獲得唯一的雜湊值。這一過程稱為「訊息摘要」,其雜湊值稱為「數字指紋」,自然其演算法就是「訊息摘要演算法」。換句話說,如果其數字指紋唯一,就說明其訊息是一致的。

訊息摘要演算法又稱為雜湊演算法,其核心在於雜湊函式的單向性。即通過雜湊函式可獲得對應的雜湊值,但不可通過該雜湊值反推原始資訊。這是訊息摘要演算法的安全性的根本所在。

訊息摘要演算法主要分為三大類:md(message digest,訊息摘要演算法)、sha(secure hash algorithm,安全雜湊演算法)和mac(message authentication code,訊息認證碼演算法)。

md系列演算法包括md2、md4、md5共三種演算法。

sha系列演算法主要包括sha-1和sha-2系列演算法(包含sha-224、sha-256、sha-384、sha-512)

mac演算法綜上了兩種演算法,主要包括hmacmd5、hmacsha1、hmacsha256、hmacsha384、hmacsha512演算法。

最後,基於這些演算法,又衍生出了ripemd系列演算法(包含ripemd128、ripemd160、ripemd320)、tiger、gost3411和whirlpool演算法。

二、訊息摘要演算法的特徵

訊息摘要是把任意長度的輸入柔和而產生長度固定的偽隨機輸入的演算法。訊息摘要的主要特點有:  

①無論輸入的訊息有多長,計算出來的訊息摘要的長度總是固定的。例如應用md5演算法摘要的訊息有128個位元位,用sha-1演算法摘要的訊息最終有160位元位的輸出,sha-1的變體可以產生192位元位和256位元位的訊息摘要。一般認為,摘要的最終輸出越長,該摘要演算法就越安全。  

②訊息摘要看起來是「隨機的」。這些位元看上去是胡亂的雜湊在一起的。可以用大量的輸入來檢驗其輸出是否相同,一般,不同的輸入會有不同的輸出,而且輸出的摘要訊息可以通過隨機性檢驗。但是,乙個摘要並不是真正隨機的,因為用相同的演算法對相同的訊息求兩次摘要,其結果必然相同;而若是真正隨機的,則無論如何都是無法重現的。因此訊息摘要是「偽隨機的」。 

③一般地,只要輸入的訊息不同,對其進行摘要以後產生的摘要訊息也必不相同;但相同的輸入必會產生相同的輸出。這正是好的訊息摘要演算法所具有的性質:輸入改變了,輸出也就改變了;兩條相似的訊息的摘要確不相近,甚至會大相徑庭。 

④訊息摘要函式是無陷門的單向函式,即只能進行正向的資訊摘要,而無法從摘要中恢復出任何的訊息,甚至根本就找不到任何與原資訊相關的資訊。當然,可以採用強力攻擊的方法,即嘗試每乙個可能的資訊,計算其摘要,看看是否與已有的摘要相同,如果這樣做,最終肯定會恢復出摘要的訊息。但實際上,要得到的資訊可能是無窮個訊息之一,所以這種強力攻擊幾乎是無效的。

⑤好的摘要演算法,沒有人能從中找到「碰撞」,雖然「碰撞」是肯定存在的。即對於給定的乙個摘要,不可能找到一條資訊使其摘要正好是給定的。或者說,無法找到兩條訊息,是它們的摘要相同。

摘自 lonelyroamer的專欄

Java 訊息摘要演算法

一 md5 因為在訊息摘要演算法中,md5應該最常用的,所以放在最前面。另外md家族中除了md5外,還有md2和md4,md2和md5在jdk中已經有實現,md4則是在bouncy castle有實現。public abstract class md5 catch nosuchalgorithmex...

Java加密跟解密

具體事項請直接看 public static final string key md5 md5 public static byte encryp 5 byte input throws exception public static string encryp 5bybase64 byte inp...

java 加密解密演算法

public class cryptogram 金鑰 private static final int key 5 param args public static void main string args char encryptcode cryptogram.encrypt in system...