青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

MD5算法的C++實(shí)現(xiàn)

Posted on 2008-06-25 17:12 RichardHe 閱讀(283) 評論(0)  編輯 收藏 引用 所屬分類: [轉(zhuǎn)]
來自http://m.shnenglu.com/ant/archive/2007/09/11/31886.html

MD5算法的C++實(shí)現(xiàn)

1. Introduction
MD5算法是一種消息摘要算法(Message Digest Algorithm),此算法以任意長度的信息(message)作為輸入進(jìn)行計(jì)算,產(chǎn)生一個(gè)128-bit(16-byte)的指紋或報(bào)文摘要(fingerprint or message digest)。 兩個(gè)不同的message產(chǎn)生相同message digest的幾率相當(dāng)小,從一個(gè)給定的message digest逆向產(chǎn)生原始message更是困難(不過據(jù)說我國的某個(gè)教授很善于從message digest構(gòu)造message),因此MD5算法適合用在數(shù)字簽名應(yīng)用中。MD5實(shí)現(xiàn)簡單,在32位的機(jī)器上運(yùn)行速度也相當(dāng)快,當(dāng)然實(shí)際應(yīng)用也不僅僅局 限于數(shù)字簽名。

2. MD5 Algorithm Description
假設(shè)輸入信息(input message)的長度為b(bit),我們想要產(chǎn)生它的報(bào)文摘要,在此處b為任意的非負(fù)整數(shù):b也可能為0,也不一定為8的整數(shù)倍,且可能是任意大的長度。設(shè)該信息的比特流表示如下:

          M[0] M[1] M[2] ... M[b-1]

計(jì)算此信息的報(bào)文摘要需要如下5步:
2.1 Append Padding Bits
信息計(jì)算前先要進(jìn)行位補(bǔ)位,設(shè)補(bǔ)位后信息的長度為LEN(bit),則LEN%512 = 448(bit),即數(shù)據(jù)擴(kuò)展至
K*512+448(bit)。即K*64+56(byte),K為整數(shù)。補(bǔ)位操作始終要執(zhí)行,即使補(bǔ)位前信息的長度對512求余的結(jié)果是448。具體補(bǔ)位操作:補(bǔ)一個(gè)1,然后補(bǔ)0至滿足上述要求??偣沧钌僖a(bǔ)1bit,最多補(bǔ)512bit。

2.2 Append Length
將 輸入信息的原始長度b(bit)表示成一個(gè)64-bit的數(shù)字,把它添加到上一步的結(jié)果后面(在32位的機(jī)器上,這64位將用2個(gè)字來表示并且低位在 前)。當(dāng)遇到b大于2^64這種極少的情況時(shí),b的高位被截去,僅使用b的低64位。經(jīng)過上面兩步,數(shù)據(jù)就被填補(bǔ)成長度為512(bit)的倍數(shù)。也就是 說,此時(shí)的數(shù)據(jù)長度是16個(gè)字(32byte)的整數(shù)倍。此時(shí)的數(shù)據(jù)表示為:

          M[0 ... N-1]

其中的N是16的倍數(shù)。

2.3 Initialize MD Buffer
用一個(gè)四個(gè)字的緩沖器(A,B,C,D)來計(jì)算報(bào)文摘要,A,B,C,D分別是32位的寄存器,初始化使用的是十六進(jìn)制表示的數(shù)字,注意低字節(jié)在前:

        word A: 01 23 45 67
        word B: 89 ab cd ef
        word C: fe dc ba 98
        word D: 76 54 32 10


2.4 Process Message in 16-Word Blocks
首先定義4個(gè)輔助函數(shù),每個(gè)函數(shù)的輸入是三個(gè)32位的字,輸出是一個(gè)32位的字:

        F(X,Y,Z) = XY v not(X) Z
        G(X,Y,Z) = XZ v Y not(Z)
        H(X,Y,Z) = X xor Y xor Z
        I(X,Y,Z) = Y xor (X v not(Z))

NOTE:not(X)代表X的按位補(bǔ)運(yùn)算,X v Y 表示X和Y的按位或運(yùn)算,X xor Y代表X和Y的按位異或運(yùn)算,XY代表X和Y的按位與運(yùn)算。

具體過程如下:
 1 /* Process each 16-word block. */
 2    For i = 0 to N/16-1 do
 3 
 4      /* Copy block i into X. */
 5      For j = 0 to 15 do
 6        Set X[j] to M[i*16+j].
 7      end /* of loop on j */

 8 
 9      /* Save A as AA, B as BB, C as CC, and D as DD. */
10      AA = A
11      BB =
 B
12      CC =
 C
13      DD =
 D
14 

15      /* Round 1. */
16      /* Let [abcd k s i] denote the operation
17           a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */

18      /* Do the following 16 operations. */
19      [ABCD  0  7  1]  [DABC  1 12  2]  [CDAB  2 17  3]  [BCDA  3 22  4]
20      [ABCD  4  7  5]  [DABC  5 12  6]  [CDAB  6 17  7]  [BCDA  7 22  8
]
21      [ABCD  8  7  9]  [DABC  9 12 10]  [CDAB 10 17 11]  [BCDA 11 22 12
]
22      [ABCD 12  7 13]  [DABC 13 12 14]  [CDAB 14 17 15]  [BCDA 15 22 16
]
23 

24      /* Round 2. */
25      /* Let [abcd k s i] denote the operation
26           a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */

27      /* Do the following 16 operations. */
28      [ABCD  1  5 17]  [DABC  6  9 18]  [CDAB 11 14 19]  [BCDA  0 20 20]
29      [ABCD  5  5 21]  [DABC 10  9 22]  [CDAB 15 14 23]  [BCDA  4 20 24
]
30      [ABCD  9  5 25]  [DABC 14  9 26]  [CDAB  3 14 27]  [BCDA  8 20 28
]
31      [ABCD 13  5 29]  [DABC  2  9 30]  [CDAB  7 14 31]  [BCDA 12 20 32
]
32 

33      /* Round 3. */
34      /* Let [abcd k s t] denote the operation
35           a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */

36      /* Do the following 16 operations. */
37      [ABCD  5  4 33]  [DABC  8 11 34]  [CDAB 11 16 35]  [BCDA 14 23 36]
38      [ABCD  1  4 37]  [DABC  4 11 38]  [CDAB  7 16 39]  [BCDA 10 23 40
]
39      [ABCD 13  4 41]  [DABC  0 11 42]  [CDAB  3 16 43]  [BCDA  6 23 44
]
40      [ABCD  9  4 45]  [DABC 12 11 46]  [CDAB 15 16 47]  [BCDA  2 23 48
]
41 

42      /* Round 4. */
43      /* Let [abcd k s t] denote the operation
44           a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */

45      /* Do the following 16 operations. */
46      [ABCD  0  6 49]  [DABC  7 10 50]  [CDAB 14 15 51]  [BCDA  5 21 52]
47      [ABCD 12  6 53]  [DABC  3 10 54]  [CDAB 10 15 55]  [BCDA  1 21 56
]
48      [ABCD  8  6 57]  [DABC 15 10 58]  [CDAB  6 15 59]  [BCDA 13 21 60
]
49      [ABCD  4  6 61]  [DABC 11 10 62]  [CDAB  2 15 63]  [BCDA  9 21 64
]
50 

51      /* Then perform the following additions. (That is increment each
52 
        of the four registers by the value it had before this block
53         was started.) */

54      A = A + AA
55      B = B +
 BB
56      C = C +
 CC
57      D = D +
 DD
58 

59    end /* of loop on i */

2.5 Output
報(bào)文摘要的產(chǎn)生后的形式為:A,B,C,D。也就是低位字節(jié)A開始,高位字節(jié)D結(jié)束。

3. C++ Implementation
有了上面5個(gè)步驟的算法描述,用C++實(shí)現(xiàn)起來就很直接了。需要注意的是在具體實(shí)現(xiàn)的時(shí)候上述5個(gè)步驟的順序會(huì)有所變動(dòng),因?yàn)樵诖蠖鄶?shù)情況下我們都無法或很難提前計(jì)算出輸入信息的長度b(如輸入信息來自文件或網(wǎng)絡(luò))。因此在具體實(shí)現(xiàn)時(shí)Append Padding BitsAppend Length這兩步會(huì)放在最后面。

4. Test Suite
由于實(shí)現(xiàn)代碼比較長,在這里就不貼出來了,在本文后面會(huì)提供下載。MD5類的public接口如下:
md5.h
 1 class MD5 {
 2 public
:
 3 
    MD5();
 4     MD5(const void *
input, size_t length);
 5     MD5(const string &
str);
 6     MD5(ifstream &
in);
 7     void update(const void *
input, size_t length);
 8     void update(const string &
str);
 9     void update(ifstream &
in);
10     const byte*
 digest();
11 
    string toString();
12     void
 reset();
13 
    ...
14 };

下面簡單介紹一下具體用法:
1.計(jì)算字符串的MD5值
下面的代碼計(jì)算字符串"abc"的MD5值并用cout輸出:
1 MD5 md5;
2 md5.update("abc"
);
3 cout << md5.toString() <<
 endl;
4 //或者更簡單點(diǎn)

5 cout << MD5("abc").toString() << endl;

2.計(jì)算文件的MD5值
下面的代碼計(jì)算文本文件"D:\test.txt"的MD5值并用cout輸出,如果是二進(jìn)制文件打開的時(shí)候記得要指定ios::binary模式。另外需要注意的是用來計(jì)算的文件必須存在,所以最好在計(jì)算前先判斷下ifstream的狀態(tài)。
(本來判斷ifstream是否有效不該是客戶的責(zé)任,原本想在ifstream無效時(shí)用文件名做參數(shù)拋出FileNotFoundException之類的異常,后來卻發(fā)現(xiàn)從ifstream中居然無法得到文件名...)
1 MD5 md5;
2 md5.update(ifstream("D:\\test.txt"
));
3 cout << md5.toString() <<
 endl;
4 //或者更簡單點(diǎn)

5 cout << MD5(ifstream("D:\\test.txt")).toString() << endl;

3.最基本的用法
上面的用來計(jì)算字符串和文件MD5值的接口都是為了方便才提供的,其實(shí)最基本的接口是:
void update(const void *input, size_t length);
update的另外兩個(gè)重載都是基于它來實(shí)現(xiàn)的,下面的代碼用上述接口來實(shí)現(xiàn)FileDigest函數(shù),該函數(shù)用來計(jì)算文件的MD5值:
 1 string FileDigest(const string &file) {
 2 

 3     ifstream in(file.c_str(), ios::binary);
 4     if (!
in)
 5         return ""
;
 6 

 7     MD5 md5;
 8 
    std::streamsize length;
 9     char buffer[1024
];
10     while (!
in.eof()) {
11         in.read(buffer, 1024
);
12         length =
 in.gcount();
13         if (length > 0
)
14 
            md5.update(buffer, length);
15 
    }
16 
    in.close();
17     return
 md5.toString();
18 }

下面看看測試代碼:
test.cpp
 1 #include "md5.h"
 2 #include <iostream>
 3 
 4 using namespace std;
 5 

 6 void PrintMD5(const string &str, MD5 &md5) {
 7     cout << "MD5(\"" << str << "\") = " << md5.toString() <<
 endl;
 8 
}
 9 

10 int main() {
11 

12     MD5 md5;
13     md5.update(""
);
14     PrintMD5(""
, md5);
15 

16     md5.update("a");
17     PrintMD5("a"
, md5);
18 

19     md5.update("bc");
20     PrintMD5("abc"
, md5);
21 

22     md5.update("defghijklmnopqrstuvwxyz");
23     PrintMD5("abcdefghijklmnopqrstuvwxyz"
, md5);
24 

25     md5.reset();
26     md5.update("message digest"
);
27     PrintMD5("message digest"
, md5);
28 

29     md5.reset();
30     md5.update(ifstream("D:\\test.txt"
));
31     PrintMD5("D:\\test.txt"
, md5);
32 

33     return 0;
34 }

測試結(jié)果:
MD5("") = d41d8cd98f00b204e9800998ecf8427e
MD5("a") = 0cc175b9c0f1b6a831c399e269772661
MD5("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5("D:\test.txt") = 7ac66c0f148de9519b8bd264312c4d64



posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品欧美风情| 亚洲男人的天堂在线aⅴ视频| 香蕉久久夜色| 欧美一区二区国产| 亚洲欧美制服另类日韩| 亚洲欧美综合网| 久久久久欧美| 欧美日韩第一区日日骚| 国产精品免费aⅴ片在线观看| 欧美婷婷六月丁香综合色| 国产精品系列在线播放| 国产亚洲综合性久久久影院| 1024亚洲| 亚洲欧美日韩国产一区二区| 久久人人爽爽爽人久久久| 亚洲福利视频免费观看| 亚洲黑丝在线| 亚洲欧美国产一区二区三区| 久久国产99| 欧美日韩免费视频| 在线观看国产一区二区| 亚洲图片自拍偷拍| 久久综合国产精品台湾中文娱乐网 | 欧美精品电影| 欧美第一黄色网| 国产精品一二三四| 亚洲国产精品毛片| 夜夜嗨av一区二区三区中文字幕 | 日韩视频在线一区二区三区| 亚洲欧美另类综合偷拍| 欧美激情亚洲国产| 欧美一区二区视频在线观看2020 | 日韩视频国产视频| 久久躁日日躁aaaaxxxx| 亚洲视频中文字幕| 欧美大片免费| 在线不卡中文字幕| 性欧美videos另类喷潮| 亚洲日韩欧美一区二区在线| 久久久久9999亚洲精品| 国产精品一二三四| 亚洲女ⅴideoshd黑人| 亚洲人体一区| 欧美激情国产日韩| 亚洲欧洲精品一区二区三区| 久久一区二区三区av| 亚洲一区国产精品| 国产精品爱久久久久久久| 亚洲美女在线一区| 亚洲国产精品ⅴa在线观看| 久久午夜视频| 亚洲电影免费观看高清| 毛片一区二区三区| 久久综合九色综合欧美就去吻| 国产精品久久一区二区三区| 一区二区三区三区在线| 亚洲精品在线观| 欧美黄色影院| 一区二区三区黄色| 亚洲精品婷婷| 欧美四级电影网站| 午夜亚洲性色视频| 欧美在线视频日韩| 精品91在线| 欧美刺激午夜性久久久久久久| 久久激情综合| 亚洲第一二三四五区| 亚洲国产精品一区制服丝袜| 欧美激情一区二区三区四区| 一区二区三区国产在线观看| 在线一区亚洲| 韩国精品在线观看| 亚洲大胆女人| 欧美日韩理论| 欧美影院一区| 久久久久久一区二区三区| 亚洲国产精品国自产拍av秋霞 | 先锋a资源在线看亚洲| 亚洲综合99| 午夜精品国产更新| 久久综合亚洲社区| 一本色道久久加勒比88综合 | 一本大道久久a久久综合婷婷| 欧美黑人多人双交| 亚洲综合日韩在线| 久久精品国产69国产精品亚洲| 国产日产精品一区二区三区四区的观看方式| 亚洲视频免费| 欧美一区二区在线免费播放| 亚洲国产精品va在线观看黑人| 亚洲黄色精品| 国产精品区一区| 另类专区欧美制服同性| 欧美日韩精品系列| 久久―日本道色综合久久| 欧美精品一区二区三区一线天视频 | 亚洲欧美国产高清| 国产精品一区二区久久精品| 欧美+亚洲+精品+三区| 欧美午夜一区二区三区免费大片| 欧美一区二区三区四区在线观看地址| 一区二区三区四区蜜桃| 国产自产2019最新不卡| 亚洲精品小视频| 在线看国产一区| 亚洲永久精品大片| 99精品国产福利在线观看免费 | 久久久久久久久久久一区| 一本久道综合久久精品| 久久福利资源站| 午夜精品剧场| 欧美日韩视频| 亚洲精品资源美女情侣酒店| 在线免费观看日本欧美| 欧美一级淫片aaaaaaa视频| 亚洲午夜精品一区二区| 欧美不卡激情三级在线观看| 久久久久久一区二区三区| 国产精品捆绑调教| 日韩午夜免费视频| 99视频有精品| 美女脱光内衣内裤视频久久网站| 午夜国产精品影院在线观看| 欧美精品色一区二区三区| 欧美激情第1页| 亚洲国产经典视频| 久久午夜精品一区二区| 久久综合色88| 狠狠色伊人亚洲综合网站色| 欧美伊久线香蕉线新在线| 欧美一区二区视频网站| 国产欧美日韩在线观看| 午夜精品一区二区三区在线播放| 亚洲性xxxx| 欧美午夜影院| 亚洲欧美成人一区二区在线电影| 亚洲精品在线电影| 欧美连裤袜在线视频| 国产精品区二区三区日本 | 在线日韩视频| 久久亚洲视频| 欧美激情bt| 一区二区精品在线观看| 欧美日韩国产美女| 一本色道久久综合精品竹菊| 亚洲自拍偷拍一区| 国产精品国色综合久久| 亚洲欧美激情一区| 久久一区二区精品| 91久久国产精品91久久性色| 欧美成人一区在线| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲国产一区二区三区a毛片| 久久精品国产久精国产一老狼| 欧美在线看片a免费观看| 国产日韩精品一区二区浪潮av| 性8sex亚洲区入口| 模特精品在线| 99热精品在线| 国产精品自拍网站| 美腿丝袜亚洲色图| 国产精品99久久久久久宅男| 欧美资源在线观看| 亚洲欧洲一区二区三区| 国产精品美女一区二区在线观看| 亚洲欧美日韩精品久久久久| 欧美+日本+国产+在线a∨观看| 日韩一级成人av| 国产一级精品aaaaa看| 男女精品视频| 欧美一级淫片aaaaaaa视频| 最新日韩中文字幕| 久久久www成人免费精品| 亚洲欧洲日产国产综合网| 国产精品网站在线播放| 看欧美日韩国产| 亚洲一区影音先锋| 亚洲第一精品夜夜躁人人躁| 亚洲欧美视频在线观看| 亚洲精品久久久久久久久久久| 欧美四级伦理在线| 美女爽到呻吟久久久久| 亚洲欧美日韩综合| 亚洲精品日韩一| 免费观看成人www动漫视频| 亚洲影院免费| 亚洲精品一区二区三| 国产综合色产在线精品| 国产精品v日韩精品| 欧美风情在线观看| 久久爱www久久做| 亚洲香蕉网站| 亚洲麻豆一区| 亚洲经典三级| 欧美99在线视频观看| 久久精品夜色噜噜亚洲aⅴ| 亚洲尤物视频在线| 一本一本大道香蕉久在线精品| 好看的日韩av电影| 国产色婷婷国产综合在线理论片a|