當前位置:首頁 » 操作系統 » md5演算法的實現

md5演算法的實現

發布時間: 2022-12-24 16:17:52

A. MD5演算法求助 用java實現

import java.security.MessageDigest;

public class Test002 {

public static String toMD5String(String s) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
try {
byte[] strTemp = s.getBytes();
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(strTemp);
byte[] md = messageDigest.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}

public static void main(String[] args) {
System.out.print(toMD5String("admin"));
}

}

B. md5是什麼 如何計算MD5

MD5即Message-Digest Algorithm 5(信息-摘要演算法5),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、哈希演算法),主流編程語言普遍已有MD5實現。

MD5演算法具有以下特點:

1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。

2、容易計算:從原數據計算出MD5值很容易。

3、抗修改性:對原數據進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。

4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。

MD5的作用是讓大容量信息在用數字簽名軟體簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的16進制數字串)。

大家都知道,地球上任何人都有自己獨一無二的指紋,這常常成為司法機關鑒別罪犯身份最值得信賴的方法;與之類似,MD5就可以為任何文件(不管其大小、格式、數量)產生一個同樣獨一無二的MD5「數字指紋」,如果任何人對文件做了任何改動,其MD5也就是對應的「數字指紋」都會發生變化。

C. md5碼是如何生成的,什麼原理

原理
對MD5演算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。

在MD5演算法中,首先需要對信息進行填充,使其位長對512求余的結果等於448。因此,信息的位長(Bits Length)將被擴展至N*512+448,N為一個非負整數,N可以是零。填充的方法如下,在信息的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對信息的填充。然後,在這個結果後面附加一個以64位二進製表示的填充前信息長度。經過這兩步的處理,信息的位長=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足後面處理中對信息長度的要求。總體流程如下圖所示,表示第i個分組,每次的運算都由前一輪的128位結果值和第i塊512bit值進行運算。初始的128位值為初試鏈接變數,這些參數用於第一輪的運算,以大端位元組序來表示,他們分別為:A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210。


MD5演算法的整體流程圖

MD5演算法的整體流程圖[1]

每一分組的演算法流程如下:

第一分組需要將上面四個鏈接變數復制到另外四個變數中:A到a,B到b,C到c,D到d。從第二分組開始的變數為上一分組的運算結果。

主循環有四輪(MD4隻有三輪),每輪循環都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然後將所得結果加上第四個變數,文本的一個子分組和一個常數。再將所得結果向左環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。

以下是每次操作中用到的四個非線性函數(每輪一個)。

F(X,Y,Z) =(X&Y)|((~X)&Z)

G(X,Y,Z) =(X&Z)|(Y&(~Z))

H(X,Y,Z) =X^Y^Z

I(X,Y,Z)=Y^(X|(~Z))

(&;是與,|是或,~是非,^是異或)

這四個函數的說明:如果X、Y和Z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。

F是一個逐位運算的函數。即,如果X,那麼Y,否則Z。函數H是逐位奇偶操作符。

假設Mj表示消息的第j個子分組(從0到15),常數ti是4294967296*abs(sin(i))的整數部分,i取值從1到64,單位是弧度。(4294967296等於2的32次方)

FF(a,b,c,d,Mj,s,ti)表示 a = b + ((a + F(b,c,d) + Mj + ti) << s)

GG(a,b,c,d,Mj,s,ti)表示 a = b + ((a + G(b,c,d) + Mj + ti) << s)

HH(a,b,c,d,Mj,s,ti)表示 a = b + ((a + H(b,c,d) + Mj + ti) << s)

Ⅱ(a,b,c,d,Mj,s,ti)表示 a = b + ((a + I(b,c,d) + Mj + ti) << s)

這四輪(64步)是:

第一輪

FF(a,b,c,d,M0,7,0xd76aa478)

FF(d,a,b,c,M1,12,0xe8c7b756)

FF(c,d,a,b,M2,17,0x242070db)

FF(b,c,d,a,M3,22,0xc1bdceee)

FF(a,b,c,d,M4,7,0xf57c0faf)

FF(d,a,b,c,M5,12,0x4787c62a)

FF(c,d,a,b,M6,17,0xa8304613)

FF(b,c,d,a,M7,22,0xfd469501)

FF(a,b,c,d,M8,7,0x698098d8)

FF(d,a,b,c,M9,12,0x8b44f7af)

FF(c,d,a,b,M10,17,0xffff5bb1)

FF(b,c,d,a,M11,22,0x895cd7be)

FF(a,b,c,d,M12,7,0x6b901122)

FF(d,a,b,c,M13,12,0xfd987193)

FF(c,d,a,b,M14,17,0xa679438e)

FF(b,c,d,a,M15,22,0x49b40821)

第二輪

GG(a,b,c,d,M1,5,0xf61e2562)

GG(d,a,b,c,M6,9,0xc040b340)

GG(c,d,a,b,M11,14,0x265e5a51)

GG(b,c,d,a,M0,20,0xe9b6c7aa)

GG(a,b,c,d,M5,5,0xd62f105d)

GG(d,a,b,c,M10,9,0x02441453)

GG(c,d,a,b,M15,14,0xd8a1e681)

GG(b,c,d,a,M4,20,0xe7d3fbc8)

GG(a,b,c,d,M9,5,0x21e1cde6)

GG(d,a,b,c,M14,9,0xc33707d6)

GG(c,d,a,b,M3,14,0xf4d50d87)

GG(b,c,d,a,M8,20,0x455a14ed)

GG(a,b,c,d,M13,5,0xa9e3e905)

GG(d,a,b,c,M2,9,0xfcefa3f8)

GG(c,d,a,b,M7,14,0x676f02d9)

GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三輪

HH(a,b,c,d,M5,4,0xfffa3942)

HH(d,a,b,c,M8,11,0x8771f681)

HH(c,d,a,b,M11,16,0x6d9d6122)

HH(b,c,d,a,M14,23,0xfde5380c)

HH(a,b,c,d,M1,4,0xa4beea44)

HH(d,a,b,c,M4,11,0x4bdecfa9)

HH(c,d,a,b,M7,16,0xf6bb4b60)

HH(b,c,d,a,M10,23,0xbebfbc70)

HH(a,b,c,d,M13,4,0x289b7ec6)

HH(d,a,b,c,M0,11,0xeaa127fa)

HH(c,d,a,b,M3,16,0xd4ef3085)

HH(b,c,d,a,M6,23,0x04881d05)

HH(a,b,c,d,M9,4,0xd9d4d039)

HH(d,a,b,c,M12,11,0xe6db99e5)

HH(c,d,a,b,M15,16,0x1fa27cf8)

HH(b,c,d,a,M2,23,0xc4ac5665)

第四輪

Ⅱ(a,b,c,d,M0,6,0xf4292244)

Ⅱ(d,a,b,c,M7,10,0x432aff97)

Ⅱ(c,d,a,b,M14,15,0xab9423a7)

Ⅱ(b,c,d,a,M5,21,0xfc93a039)

Ⅱ(a,b,c,d,M12,6,0x655b59c3)

Ⅱ(d,a,b,c,M3,10,0x8f0ccc92)

Ⅱ(c,d,a,b,M10,15,0xffeff47d)

Ⅱ(b,c,d,a,M1,21,0x85845dd1)

Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)

Ⅱ(d,a,b,c,M15,10,0xfe2ce6e0)

Ⅱ(c,d,a,b,M6,15,0xa3014314)

Ⅱ(b,c,d,a,M13,21,0x4e0811a1)

Ⅱ(a,b,c,d,M4,6,0xf7537e82)

Ⅱ(d,a,b,c,M11,10,0xbd3af235)

Ⅱ(c,d,a,b,M2,15,0x2ad7d2bb)

Ⅱ(b,c,d,a,M9,21,0xeb86d391)

所有這些完成之後,將A、B、C、D分別加上a、b、c、d。然後用下一分組數據繼續運行演算法,最後的輸出是A、B、C和D的級聯。

當你按照我上面所說的方法實現MD5演算法以後,你可以用以下幾個信息對你做出來的程序作一個簡單的測試,看看程序有沒有錯誤。

MD5 ("") =

MD5 ("a") =

MD5 ("abc") =

MD5 ("message digest") =

MD5 ("abcdefghijklmnopqrstuvwxyz") =

MD5 ("") =



ImportsSystem
ImportsSystem.Security.Cryptography
ImportsSystem.Text
MoleExample
'哈希輸入字元串並返回一個32字元的十六進制字元串哈希。
FunctiongetMd5Hash(ByValinputAsString)AsString
'創建新的一個MD5CryptoServiceProvider對象的實例。
()
'輸入的字元串轉換為位元組數組,並計算哈希。
DimdataAsByte()=md5Hasher.ComputeHash(Encoding.Default.GetBytes(input))
'創建一個新的StringBuilder收集的位元組,並創建一個字元串。
DimsBuilderAsNewStringBuilder()
'通過每個位元組的哈希數據和格式為十六進制字元串的每一個循環。
DimiAsInteger
Fori=0Todata.Length-1
sBuilder.Append(data(i).ToString("x2"))
Nexti
'返回十六進制字元串。
ReturnsBuilder.ToString()
EndFunction
'驗證對一個字元串的哈希值。
FunctionverifyMd5Hash(ByValinputAsString,ByValhashAsString)AsBoolean
'哈希的輸入。
DimhashOfInputAsString=getMd5Hash(input)
'創建StringComparer1的哈希進行比較。
DimcomparerAsStringComparer=StringComparer.OrdinalIgnoreCase
If0=comparer.Compare(hashOfInput,hash)Then
ReturnTrue
Else
ReturnFalse
EndIf
EndFunction
SubMain()
DimsourceAsString="HelloWorld!"
DimhashAsString=getMd5Hash(source)
Console.WriteLine("進行MD5加密的字元串為:"+source+"加密的結果是:"+hash+".")
Console.WriteLine("驗證哈希...")
IfverifyMd5Hash(source,hash)Then
Console.WriteLine("哈希值是相同的。")
Else
Console.WriteLine("哈希值是不相同的。")
EndIf
EndSub
EndMole
'此代碼示例產生下面的輸出:
'
'進行MD5加密的字元串為:HelloWorld!加密的結果是:.
'驗證哈希...
'哈希值是相同的。


偽代碼實現
//Note:^32whencalculatingvarint&#91;64&#93;r,k//rspecifiestheper-roundshiftamountsr&#91;0..15&#93;:={7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22}r&#91;16..31&#93;:={5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20}r&#91;32..47&#93;:={4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23}r&#91;48..63&#93;:={6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21}//:forifrom0to63k&#91;i&#93;:=floor(abs(sin(i+1))×2^32)//Initializevariables:varinth0:=0x67452301varinth1:=0xEFCDAB89varinth2:=0x98BADCFEvarinth3:=0x10325476//Pre-processing:append"1"bittomessageappend"0"bitsuntilmessagelengthinbits≡448(mod512)appendbitlengthofmessageas64-bitlittle-endianintegertomessage//-bitchunks:foreach512--bitlittle-endianwordsw&#91;i&#93;,0≤i≤15//:varinta:=h0varintb:=h1varintc:=h2varintd:=h3//Mainloop:forifrom0to63if0≤i≤15thenf:=(bandc)or((notb)andd)g:=ielseif16≤i≤31f:=(dandb)or((notd)andc)g:=(5×i+1)mod16elseif32≤i≤47f:=bxorcxordg:=(3×i+5)mod16elseif48≤i≤63f:=cxor(bor(notd))g:=(7×i)mod16temp:=dd:=cc:=bb:=((a+f+k&#91;i&#93;+w&#91;g&#93;)leftrotater&#91;i&#93;)+ba:=temp//Addthischunk'shashtoresultsofar:h0:=h0+ah1:=h1+bh2:=h2+ch3:=h3+dvarintdigest:=h0appendh1appendh2appendh3//(expressedaslittle-endian)MD5加密工具

利用MD5的演算法原理,可以使用各種計算機語言進行實現,形成各種各樣的MD5加密校驗工具。有很多的在線工具可以實現這一點,這些在線工具一般是採用JavaScript語言實現,使用非常方便快捷。

D. MD5演算法原理及實現

散列函數,也稱作哈希函數,消息摘要函數,單向函數或者雜湊函數。散列函數主要用於驗證數據的完整性。通過散列函數,可以創建消息的「數字指紋」,消息接收方可以通過校驗消息的哈希值來驗證消息的完整性,防止消息被篡改。散列函數具有以下特性:

任何消息經過散列函數處理後,都會產生一個唯一的散列值,這個散列值可以用來驗證消息的完整性。計算消息散列值的過程被稱為「消息摘要」,計算消息散列值的演算法被稱為消息摘要演算法。常使用的消息摘要演算法有:MD—消息摘要演算法,SHA—安全散列演算法,MAC—消息認證碼演算法。本文主要來了解MD演算法。

MD5演算法是典型的消息摘要演算法,它是由MD4,MD3和MD2演算法演變而來。無論是哪一種MD演算法,其原理都是接受一個任意長度的消息並產生一個128位的消息摘要。如果把得到的消息摘要轉換成十六進制字元串,則會得到一個32位元組長度的字元串,我們平常見到的大部分MD數字指紋就是一個長度為32的十六進制字元串。

假設原始消息長度是b(以bit為單位),注意這里b可以是任意長度,並不一定要是8的整數倍。計算該消息MD5值的過程如下:

在計算消息的MD5值之前,首先對原始信息進行填充,這里的信息填充分為兩步。
第一步,對原始信息進行填充,填充之後,要求信息的長度對512取余等於448。填充的規則如下:假設原始信息長度為b bit,那麼在信息的b+1 bit位填充1,剩餘的位填充0,直到信息長度對512取余為448。這里有一點需要注意,如果原始信息長度對512取余正好等於448,這種情況仍然要進行填充,很明顯,在這時我們要填充的信息長度是512位,直到信息長度對512取余再次等於448。所以,填充的位數最少為1,最大為512。
第二步,填充信息長度,我們需要把原始信息長度轉換成以bit為單位,然後在第一步操作的結果後面填充64bit的數據表示原始信息長度。第一步對原始信息進行填充之後,信息長度對512取余結果為448,這里再填充64bit的長度信息,整個信息恰好可以被512整除。其實從後續過程可以看到,計算MD5時,是將信息分為若干個分組進行處理的,每個信息分組的長度是512bit。

在進行MD5值計算之前,我們先來做一些定義。

下面就是最核心的信息處理過程,計算MD5的過程實際上就是輪流處理每個信息分組的過程。

MD5演算法實現如下所示。

這里也和Java提供的標准MD5演算法進行了對比,通過測試可以看到該MD5計算的結果和Java標准MD5演算法的計算結果是一樣的。

E. MD5加密是怎麼實現加密的

什麼是MD5???---MD5的全稱是Message-Digest Algorithm 5

MD5的典型應用是對一段信息(Message)產生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多軟體在下載的時候都有一個文件名相同,文件擴展名為.md5的文件,在這個文件中通常只有一行文本,大致結構如:

MD5 (tanajiya.tar.gz) =

這就是tanajiya.tar.gz文件的數字簽名。MD5將整個文件當作一個大文本信息,通過其不可逆的字元串變換演算法,產生了這個唯一的MD5信息摘要。如果在以後傳播這個文件的過程中,無論文件的內容發生了任何形式的改變(包括人為修改或者下載過程中線路不穩定引起的傳輸錯誤等),只要你對這個文件重新計算MD5時就會發現信息摘要不相同,由此可以確定你得到的只是一個不正確的文件。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的 "抵賴",這就是所謂的數字簽名應用。

MD5還廣泛用於加密和解密技術上。比如在UNIX系統中用戶的密碼就是以MD5(或其它類似的演算法)經加密後存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼計算成MD5值,然後再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這不但可以避免用戶的密碼被具有系統管理員許可權的用戶知道,而且還在一定程度上增加了密碼被破解的難度。

正是因為這個原因,現在被黑客使用最多的一種破譯密碼的方法就是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字元串表,另一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5 值,然後再用目標的MD5值在這個字典中檢索。我們假設密碼的最大長度為8位位元組(8 Bytes),同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是P(62,1)+P(62,2)….+P (62,8),那也已經是一個很天文的數字了,存儲這個字典就需要TB級的磁碟陣列,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。這種加密技術被廣泛的應用於UNIX系統中,這也是為什麼UNIX系統比一般操作系統更為堅固一個重要原因。

F. 誰能通俗易懂地講講MD5加密原理

MD5演算法的原理可簡要的敘述為:MD5碼以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。

在MD5演算法中,首先需要對信息進行填充,這個數據按位(bit)補充,要求最終的位數對512求模的結果為448。也就是說數據補位後,其位數長度只差64位(bit)就是512的整數倍。

即便是這個數據的位數對512求模的結果正好是448也必須進行補位。

補位的實現過程:首先在數據後補一個1 bit; 接著在後面補上一堆0 bit, 直到整個數據的位數對512求模的結果正好為448。總之,至少補1位,而最多可能補512位。

(6)md5演算法的實現擴展閱讀

當需要保存某些密碼信息以用於身份確認時,如果直接將密碼信息以明碼方式保存在資料庫中,不使用任何保密措施,系統管理員就很容易能得到原來的密碼信息,這些信息一旦泄露, 密碼也很容易被破譯。為了增加安全性,有必要對資料庫中需要保密的信息進行加密,這樣,即使有人得到了整個資料庫,如果沒有解密演算法,也不能得到原來的密碼信息。

MD5演算法可以很好地解決這個問題,因為它可以將任意長度的輸入串經過計算得到固定長度的輸出,而且只有在明文相同的情況下,才能等到相同的密文,並且這個演算法是不可逆的,即便得到了加密以後的密文,也不可能通過解密演算法反算出明文。

這樣就可以把用戶的密碼以MD5值(或類似的其它演算法)的方式保存起來,用戶注冊的時候,系統是把用戶輸入的密碼計算成 MD5 值,然後再去和系統中保存的 MD5 值進行比較,如果密文相同,就可以認定密碼是正確的,否則密碼錯誤。

通過這樣的步驟,系統在並不知道用戶密碼明碼的情況下就可以確定用戶登錄系統的合法性。這樣不但可以避免用戶的密碼被具有系統管理員許可權的用戶知道,而且還在一定程度上增加了密碼被破解的難度。

MD5 演算法還可以作為一種電子簽名的方法來使用,使用 MD5演算法就可以為任何文件(不管其大小、格式、數量)產生一個獨一無二的「數字指紋」,藉助這個「數字指紋」,通過檢查文件前後 MD5 值是否發生了改變,就可以知道源文件是否被改動。

G. MD5的演算法原理

MD5簡介:
MD5是Message-digestAlgorithm5(信息-摘要演算法)的縮寫,經MD2、MD3和MD4發展而來。它是把一個任意長度的位元組串變換成一定長的大整數。MD5演算法是在MD4的基礎上增加了「安全-帶子」(safety-belts)的概念。雖然MD5比MD4稍微慢一些,但卻更為安全。這個演算法很明顯的由四個和MD4設計有少許不同的步驟組成。在MD5演算法中,信息摘要的大小和填充的必要條件與MD4完全相同。由於MD5演算法的使用不需要支付任何版權費用,所以在一般的情況下MD5不失為一種非常優秀的中間技術。
MD5原理:
MD 5演算法是對輸入信息進行初始化處理後,以512位分組來處理輸入的信息,每一分組又被劃分
成為16個32位子分組,經過了一系列的變換處理後,輸出由四個32位分組,再將這四個32位分組級
聯後生成一個128位散列值[5- 6]。具體過程如下:
(1)首先對信息進行填充,即在信息的後面填充一個1和若干個0使其位元組長度對512求余的結
果等於448。
(2)對MD 5進行初始化,即MD 5中用四個32位被稱作鏈接變數的整數參數,它們分別為:A =
0x01234567,B = 0x89abcdef,C = 0xfedcba98,D =0x76543210。
(3)開始進入演算法的四輪循環運算。循環的次數是信息中512位信息分組的數目。將上面四個鏈
接變數復制到另外四個變數中:A到a,B到b,C到c,D到d。主循環有四輪,第一輪進行16次操作。
每次操作對a、b、c和d中的其中三個做一次非線性函數運算,然後將所得結果加上第四個變數,再將所得結果向右位移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。
以下是每次操作中用到的四個非線性函數(每輪一個)。
f(x,y,z)=(x&y) ((~x)&z)
g(x,y,z)=(xz) (y&(~z))
h(x,y,z)=x y z
i(x,y,z)=y (x (~z))
(其中:「&」是與運算,「 」是或運算,「~」是非運算,「 」是異或運算,它們都是位運算符。)
這四個函數的說明:如果x、y和z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均
勻的。f是一個逐位運算的函數。即,如果x,那麼y,否則z。函數h是逐位奇偶操作符。假設mj表示
消息的第j個子分組(從0到15),ti為第I步中的常數,< < <s表示循環左移s位,
則四種操作為:ff(a,b,c,d,mj,s,ti)表示a=b+((a+(f(b,c,d)+mj+ti)< < <s)
gg(a,b,c,d,mj,s,ti)表示a=b+((a+(g(b,c,d)+mj+ti)< < <s)
hh(a,b,c,d,mj,s,ti)表示a=b+((a+(h(b,c,d)+mj+ti)< < <s)
ii(a,b,c,d,mj,s,ti)表示a=b+((a+(i(b,c,d)+mj+ti)< < <s)
常數ti表示在第i步中,ti是4294967296*abs(sin(i))的整數部分,4294967296等於2的32次
方,i的單位是弧度。所有這些完成之後,將A、B、C、D分別加上a、b、c、d。然後用下一分組
數據繼續運行演算法,最後的輸出是A、B、C和D的級聯。

H. 請教MD5演算法 用C語言實現

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#ifdefined(__APPLE__)
#defineCOMMON_DIGEST_FOR_OPENSSL
#include<CommonCrypto/CommonDigest.h>
#defineSHA1CC_SHA1
#else
#include<openssl/md5.h>
#endif

//這是我自己寫的函數,用於計算MD5
//參數str:要轉換的字元串
//參數lengthL:字元串的長度可以用strlen(str)直接獲取參數str的長度
//返回值:MD5字元串
char*str2md5(constchar*str,intlength){
intn;
MD5_CTXc;
unsignedchardigest[16];
char*out=(char*)malloc(33);

MD5_Init(&c);

while(length>0){
if(length>512){
MD5_Update(&c,str,512);
}else{
MD5_Update(&c,str,length);
}
length-=512;
str+=512;
}

MD5_Final(digest,&c);

for(n=0;n<16;++n){
snprintf(&(out[n*2]),16*2,"%02x",(unsignedint)digest[n]);
}

returnout;
}

intmain(intargc,char**argv){
char*output=str2md5("hello",strlen("hello"));

printf("%s ",output);
//上面會輸出hello的MD5字元串:
//
free(output);
return0;
}

熱點內容
tomcat下載linux 發布:2025-05-11 07:47:06 瀏覽:791
phpcookie設置時間 發布:2025-05-11 07:36:15 瀏覽:110
固態硬碟需要緩存嗎 發布:2025-05-11 07:29:09 瀏覽:605
松江換門密碼鎖哪裡有 發布:2025-05-11 07:23:21 瀏覽:326
自動配置代理什麼意思 發布:2025-05-11 07:16:51 瀏覽:993
notepad編寫php 發布:2025-05-11 07:10:50 瀏覽:864
茄子快傳的文件夾 發布:2025-05-11 07:04:30 瀏覽:734
手機指紋密碼如何更換 發布:2025-05-11 07:02:22 瀏覽:123
java存儲資料庫 發布:2025-05-11 07:01:33 瀏覽:177
辦理ca的初始密碼是多少 發布:2025-05-11 06:54:55 瀏覽:425