• <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>

            #ant

            The dreams in which I'm dying are the best I've ever had...

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

            1. Introduction
            MD5算法是一種消息摘要算法(Message Digest Algorithm),此算法以任意長(zhǎng)度的信息(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更是困難(不過(guò)據(jù)說(shuō)我國(guó)的某個(gè)教授很善于從message digest構(gòu)造message),因此MD5算法適合用在數(shù)字簽名應(yīng)用中。MD5實(shí)現(xiàn)簡(jiǎn)單,在32位的機(jī)器上運(yùn)行速度也相當(dāng)快,當(dāng)然實(shí)際應(yīng)用也不僅僅局限于數(shù)字簽名。

            2. MD5 Algorithm Description
            假設(shè)輸入信息(input message)的長(zhǎng)度為b(bit),我們想要產(chǎn)生它的報(bào)文摘要,在此處b為任意的非負(fù)整數(shù):b也可能為0,也不一定為8的整數(shù)倍,且可能是任意大的長(zhǎng)度。設(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ǔ)位后信息的長(zhǎng)度為L(zhǎng)EN(bit),則LEN%512 = 448(bit),即數(shù)據(jù)擴(kuò)展至
            K*512+448(bit)。即K*64+56(byte),K為整數(shù)。補(bǔ)位操作始終要執(zhí)行,即使補(bǔ)位前信息的長(zhǎng)度對(duì)512求余的結(jié)果是448。具體補(bǔ)位操作:補(bǔ)一個(gè)1,然后補(bǔ)0至滿足上述要求。總共最少要補(bǔ)1bit,最多補(bǔ)512bit。

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

            具體過(guò)程如下:
            ?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開(kāi)始,高位字節(jié)D結(jié)束。

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

            4. Test Suite
            由于實(shí)現(xiàn)代碼比較長(zhǎng),在這里就不貼出來(lái)了,在本文后面會(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?};

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

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

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

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

            3.最基本的用法
            上面的用來(lái)計(jì)算字符串和文件MD5值的接口都是為了方便才提供的,其實(shí)最基本的接口是:
            void update(const void *input, size_t length);
            update的另外兩個(gè)重載都是基于它來(lái)實(shí)現(xiàn)的,下面的代碼用上述接口來(lái)實(shí)現(xiàn)FileDigest函數(shù),該函數(shù)用來(lái)計(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?}

            下面看看測(cè)試代碼:
            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?}

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


            源代碼下載:點(diǎn)擊下載
            在這里放上Vrcats修改的Qt版本:點(diǎn)擊下載

            posted on 2007-09-11 12:20 螞蟻終結(jié)者 閱讀(57534) 評(píng)論(121)  編輯 收藏 引用 所屬分類: Encrypt

            評(píng)論共2頁(yè): 1 2 

            Feedback

            # re: MD5算法的C++實(shí)現(xiàn)[未登錄](méi) 2007-09-24 15:45 flyman

            現(xiàn)在還用不著,收藏了,免得以后費(fèi)勁。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2007-10-18 10:14 MonkeyLin

            有個(gè)bug, 很小,但是不注意會(huì)導(dǎo)致很嚴(yán)重的問(wèn)題:
            bytesToHexString return的是局部變量str, 應(yīng)該把return str 改為return string(str);
            // md5.cpp: line 321-332
            string MD5::bytesToHexString(const byte *input, size_t length) {
            string str;
            str.reserve(length << 1);
            for(size_t i = 0; i < length; i++) {
            int t = input[i];
            int a = t / 16;
            int b = t % 16;
            str.append(1, HEX[a]);
            str.append(1, HEX[b]);
            }
            return str;
            }
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2007-10-18 10:27 螞蟻終結(jié)者

            @MonkeyLin
            thanks!不過(guò)我想你沒(méi)有仔細(xì)看代碼,string是按值返回的,不存在任何問(wèn)題。
            如果返回值類型是string&或string*,才會(huì)出現(xiàn)你說(shuō)的返回局部變量的問(wèn)題。
            另外,return str;與return string(str);并無(wú)本質(zhì)區(qū)別。
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2007-10-22 11:21 MonkeyLin

            @螞蟻終結(jié)者
            呵呵,這兩天又好好研究了下,發(fā)現(xiàn)是我之前不夠仔細(xì),對(duì)c++的return理解不正確,所以搞錯(cuò)了,剛學(xué)c++不久,讓大家見(jiàn)笑了 :-)  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2007-10-22 13:24 螞蟻終結(jié)者

            @MonkeyLin
            都是學(xué)習(xí)嘛,互相討論會(huì)更有收獲呵呵。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2007-11-09 10:59 MonkeyLin

            如果要移植到64位機(jī)器上(我的是GCC4.1),要記得把
            typedef unsigned long ulong;
            改為
            typedef unsigned int ulong;
            要不然算出來(lái)的都是錯(cuò)的

            64位下面的GCC4.1中int是32位,long是64位
            32位Win32下面VC7中int是32位,long是32位
            給后面的人提個(gè)醒,省得多走彎路。。。

            BTW: ICU里面的頭文件不錯(cuò), 針對(duì)不同的機(jī)器和平臺(tái)統(tǒng)一定義了uint32_t, int64_t這些類型,名字直觀,大大方便了移植,特別是對(duì)開(kāi)發(fā)機(jī)是win32,服務(wù)器是64位其它平臺(tái)的,有興趣可以去看
            http://www.icu-project.org/  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2007-11-10 10:49 螞蟻終結(jié)者

            @MonkeyLin
            thanks!
            ICU記得以前編譯Boost庫(kù)時(shí)下載過(guò)。
            在64位機(jī)器上確實(shí)會(huì)有問(wèn)題,不過(guò)為了簡(jiǎn)單,也為了減少對(duì)庫(kù)的依賴性,把
            typedef unsigned long ulong;
            改成
            typedef unsigned int uint32;
            基本就夠用了。
            已經(jīng)更新了源代碼^_^  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-03-13 16:05 gg

            用了一下這個(gè)源代碼,可是計(jì)算文件的md5值和專門(mén)軟件算出來(lái)的不一樣。。。
            這個(gè)。。。。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-03-14 09:14 螞蟻終結(jié)者

            @gg
            其實(shí)具體的用法在源代碼的main函數(shù)中已經(jīng)演示得很清楚了,我想你也肯定沒(méi)有看文章后面的:“2.計(jì)算文件的MD5值”這一段,專門(mén)計(jì)算md5值的軟件如WinMD5是以二進(jìn)制形式打開(kāi)文件的,所以:

            string s1 = MD5(ifstream("file")).toString();
            string s2 = MD5(ifstream("file", ios::binary)).toString();

            s1與s2是不一樣的,前一個(gè)是以文本模式打開(kāi),后一個(gè)是以二進(jìn)制模式打開(kāi)。
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-04-11 10:03 redberries

            寫(xiě)的不錯(cuò),頂下,不過(guò)覺(jué)得如果把Updata()加個(gè)返回值判斷是否成功可能會(huì)保險(xiǎn)一點(diǎn),還有就是下面的代碼好像有點(diǎn)小問(wèn)題,這個(gè)str的最后位置是不是應(yīng)該放個(gè)'\0'啊,

            // md5.cpp: line 321-332
            string MD5::bytesToHexString(const byte *input, size_t length) {
            string str;
            str.reserve(length << 1);  //str.reserve((length << 1) + 1);
            for(size_t i = 0; i < length; i++) {
            int t = input[i];
            int a = t / 16;
            int b = t % 16;
            str.append(1, HEX[a]);
            str.append(1, HEX[b]);
            }
            str[length>>1] = '\0'
            return str;
            }
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-04-11 10:05 redberries

            //str[length>>1] = '\0'
            呵呵
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-06-19 15:00 CPPLearning

            在2.2 Append Length 那塊第二行:

            “也就是說(shuō),此時(shí)的數(shù)據(jù)長(zhǎng)度是16個(gè)字(32bit)的整數(shù)倍。”貌似應(yīng)該是32bytes,:)

              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-06-23 22:03 螞蟻終結(jié)者

            @CPPLearning
            謝謝提醒,是我的疏忽呵呵!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-07-04 14:50 路緣

            剛好用上,謝謝博主  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-07-23 09:15 beejoy

            @MonkeyLin
            不會(huì)有問(wèn)題的。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-07-24 11:22 冰蘭

            真的很好,嘻嘻,謝謝謝謝  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-07-31 17:07 蔡火勝

            太好了,我喜歡這個(gè)東西!  回復(fù)  更多評(píng)論   

            #  你好,我編譯你的代碼后出現(xiàn)下面問(wèn)題,能幫我看下嗎? 2008-08-18 22:14 zhengdu

            --------------------Configuration: test - Win32 Debug--------------------
            Compiling...
            test.cpp
            c:\documents and settings\administrator\桌面\md5\md5.h(47) : error C2258: illegal pure syntax, must be '= 0'
            c:\documents and settings\administrator\桌面\md5\md5.h(47) : error C2252: 'BUFFER_SIZE' : pure specifier can only be specified for functions
            c:\documents and settings\administrator\桌面\md5\md5.cpp(130) : error C2065: 'BUFFER_SIZE' : undeclared identifier
            c:\documents and settings\administrator\桌面\md5\md5.cpp(130) : error C2057: expected constant expression
            c:\documents and settings\administrator\桌面\md5\md5.cpp(130) : error C2466: cannot allocate an array of constant size 0
            c:\documents and settings\administrator\桌面\md5\md5.cpp(130) : error C2133: 'buffer' : unknown size
            執(zhí)行 cl.exe 時(shí)出錯(cuò).

            test.obj - 1 error(s), 0 warning(s)
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-08-19 10:12 螞蟻終結(jié)者

            @zhengdu
            你用的是哪個(gè)版本的VC ?VC6.0 ?

            大概是你的編譯器太老,不支持static const整形值的初始化語(yǔ)法,試試下面兩種辦法:

            1. 將md5.h中的
            static const size_t BUFFER_SIZE = 1024;
            改為
            enum { BUFFER_SIZE = 1024 };

            2. 將md5.h中的
            static const size_t BUFFER_SIZE = 1024;
            改為
            static const size_t BUFFER_SIZE;

            并在md5.cpp的
            MD5::MD5() {
            reset();
            }
            上面加上
            const size_t MD5::BUFFER_SIZE = 1024;
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-09-01 11:37 zhongyunde

            這個(gè)代碼有問(wèn)題嗎   回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-09-01 19:38 螞蟻終結(jié)者

            @zhongyunde
            代碼沒(méi)有問(wèn)題,可以放心使用!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 14:12 wx3456

            這個(gè)MD5封裝類確實(shí)很好!可是怎樣將MD5字符解密后還原成原來(lái)的字符啊?(不知道該調(diào)用那些函數(shù))請(qǐng)舉例說(shuō)明!最好轉(zhuǎn)換成CString類型的數(shù)據(jù)。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 14:28 螞蟻終結(jié)者

            @wx3456
            不好意思,我不太明白你說(shuō)的“MD5字符解密”是什么意思?
            MD5是單向的,是沒(méi)有辦法從MD5值推算出原先的信息的。
            從string值轉(zhuǎn)換成CString很簡(jiǎn)單,google一下有很多。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 14:55 wx3456

            我現(xiàn)在要做的是把用戶名和密碼的信息加密后保存在ini件當(dāng)中 原來(lái)是用一個(gè)任意的字符串和要加密的字符進(jìn)行異或運(yùn)算進(jìn)行加密,解密時(shí)在進(jìn)行一次異或運(yùn)算。可是這樣做后會(huì)產(chǎn)生一個(gè)問(wèn)題的(就是會(huì)產(chǎn)生不可讀字符如回車,換行等等,這樣在讀ini文件時(shí)這些不可讀的字符會(huì)讀不出來(lái))。我聽(tīng)說(shuō)MD5加密后的字符都是普通的可以顯示的字符所以我這才用MD5加密,可是如何把加密后的密碼字符串恢復(fù)原樣以便在用戶登錄時(shí)解密 和用戶輸入的密碼對(duì)比,如果相同則登錄成功,就是這個(gè)意思  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 15:06 螞蟻終結(jié)者

            @wx3456
            既然MD5是單向的,那你可以換一種方式:
            在用戶登錄時(shí),計(jì)算用戶輸入的密碼的MD5值,拿這個(gè)值和ini文件里的MD5比較,如果相等就允許登錄(雖然多個(gè)不同的密碼可能對(duì)應(yīng)相同的MD5值,但是幾率可以說(shuō)非常小,對(duì)于一般的應(yīng)用來(lái)說(shuō)足夠了)。

            比如用戶A注冊(cè)時(shí)的密碼為abc,計(jì)算MD5值保存在ini文件為:
            900150983cd24fb0d6963f7d28e17f72

            在用戶A登錄時(shí),假設(shè)用戶輸入的密碼為xxx,則計(jì)算xxx的MD5值,若和ini文件中的MD5值相等就允許登錄。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 15:12 wx3456

            恩...我覺(jué)得也是這樣,以后像前輩多多請(qǐng)教啊,請(qǐng)問(wèn)前輩你是研究哪方面的啊?
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 15:30 螞蟻終結(jié)者

            @wx3456
            呵呵,前輩不敢當(dāng),我大學(xué)剛畢業(yè)工作才幾個(gè)月而已。目前從事C++方面的工作,有空多交流。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 16:11 foxtail

            我用了你的這個(gè) 但是算出來(lái)的MD5和網(wǎng)上的一些個(gè)工具不一樣啊
            你有檢查過(guò)嗎 不知道是什么原因  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 16:17 螞蟻終結(jié)者

            @foxtail
            這個(gè)是沒(méi)有問(wèn)題的,參考下上面我回答的:
            @gg
            其實(shí)具體的用法在源代碼的main函數(shù)中已經(jīng)演示得很清楚了,我想你也肯定沒(méi)有看文章后面的:“2.計(jì)算文件的MD5值”這一段,專門(mén)計(jì)算md5值的軟件如WinMD5是以二進(jìn)制形式打開(kāi)文件的,所以:

            string s1 = MD5(ifstream("file")).toString();
            string s2 = MD5(ifstream("file", ios::binary)).toString();

            s1與s2是不一樣的,前一個(gè)是以文本模式打開(kāi),后一個(gè)是以二進(jìn)制模式打開(kāi)。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-08 16:33 foxtail

            恩 剛才也看到gg的了 不好意思。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 12:10 ktls

            我試的也是不一樣,不知道為什么,你說(shuō)要用二進(jìn)制打開(kāi)文件,
            string FileDigest(const string& file) {

            ifstream in(file.c_str(), ios::binary);
            if (!in) {
            return "";
            }
            這不是已經(jīng)是用二進(jìn)制打開(kāi)的嗎,可得到的md5碼還是和winmd5的結(jié)果不一樣。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 14:11 螞蟻終結(jié)者

            @ktls
            這個(gè)我測(cè)試過(guò)很多次了,肯定是沒(méi)有問(wèn)題的!
            可能是你哪個(gè)地方弄錯(cuò)了!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 15:19 wx3456

            我現(xiàn)在要實(shí)現(xiàn)的功能是用戶登錄驗(yàn)證和用戶的添加,密碼修改,我把這些都保存在ini文件中的。登錄驗(yàn)證是可以的,就是但我我修改某一用戶的密碼后,然后在驗(yàn)證這個(gè)用戶的登錄時(shí)缺不能通過(guò) 我調(diào)試發(fā)現(xiàn)用戶名的加密字符對(duì)比是可以的,就是密碼加密的字符對(duì)比卻不相同的 代碼是這樣的
            md5.update(PWd.GetBuffer()); t3=md5.toString().c_str(); 其中PWD是從文本框中得到的輸入密碼,t3是CString型的變量,這樣計(jì)算出來(lái)的md5密碼是(密碼是1234)e19d5cd5af0378da05f63f891c7467af 而之前從ini文件中讀出來(lái)的是 049ec6b8b8565dfde2007f7a9f7ecd84(這個(gè)md5密碼是修改密碼后重新計(jì)算寫(xiě)入的) 為什么兩者不一樣啊?導(dǎo)致驗(yàn)證失敗  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 15:35 ktls

            我是這樣測(cè)試的,把你提供的3個(gè)文件添加到工程里去,把test.cpp里注釋掉的
            //md5.reset();
            //md5.update(ifstream("D:\\test.txt"));
            //PrintMD5("D:\\test.txt", md5);
            改成我自己的文件
            md5.reset();
            md5.update(ifstream("C:\\abc.doc"));
            PrintMD5("C:\\abc.doc", md5);
            其它沒(méi)有改過(guò)任何地方,執(zhí)行如果如下:
            MD5("") = d41d8cd98f00b204e9800998ecf8427e
            MD5("a") = 0cc175b9c0f1b6a831c399e269772661
            MD5("abc") = 900150983cd24fb0d6963f7d28e17f72
            MD5("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e400
            MD5("message digest") = f96b697d7cb7938d525a2f31aaf1
            MD5("C:\abc.doc") = 8b30f9eef77e2ac08a19bb159bfe1495
            用winmd5的檢驗(yàn)"c:\abc.doc"文件得到的結(jié)果如下:
            7dfe74280223aa9819f1617a5ef40643 abc.doc

            能告訴我email地址嗎,可以通過(guò)email與你討教,也方便發(fā)送測(cè)試結(jié)果。
            另外有個(gè)建議,能不能把這個(gè)做成dll,可以提供給別人直接調(diào)用。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 15:41 螞蟻終結(jié)者

            @wx3456
            有幾個(gè)地方我不太清楚,首先049ec6b8b8565dfde2007f7a9f7ecd84是什么密碼加密出來(lái)的?還有1234的md5應(yīng)該是81dc9bdb52d04dc20036dbd8313ed055才對(duì)。如果方便的話把源碼發(fā)我?guī)湍憧纯矗阌衜sn沒(méi)有?有的話加我antterminator@hotmail.com  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 15:45 螞蟻終結(jié)者

            @ktls
            email:antterminator@gmail.com
            msn:antterminator@hotmail.com
            這樣的話可能是其它的問(wèn)題,那把a(bǔ)bc.doc發(fā)給我測(cè)試下吧。
            這個(gè)本來(lái)是考慮跨平臺(tái)使用的,如果做成dll就只能windows用了。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 15:49 螞蟻終結(jié)者

            @ktls
            md5.update(ifstream("C:\\abc.doc"));
            剛才沒(méi)注意到,ifstream默認(rèn)是以文本模式打開(kāi)的,改成二進(jìn)制應(yīng)該就可以了:
            md5.update(ifstream("C:\\abc.doc", ios::binary));   回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 16:07 ktls

            是我自己沒(méi)看清楚,我看到FileDigest里已經(jīng)是用二進(jìn)制打開(kāi)了,就沒(méi)仔細(xì)看后面調(diào)用的代碼,現(xiàn)在已經(jīng)解決,非常感謝。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2008-10-09 16:10 螞蟻終結(jié)者

            @ktls
            不客氣,很多人用的時(shí)候都有這個(gè)問(wèn)題,在這里弄清楚了免得后面的人再走彎路!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-01-07 16:41 far

            我想寫(xiě)一個(gè)非標(biāo)準(zhǔn)的MD5算法,有哪些參數(shù)可以任意修改?
            比如ABCD的初始值,還是每次移位的位數(shù)?或者可以做更大的修改?
            能夠保證和標(biāo)準(zhǔn)MD5類似,沖突盡量小
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-01-08 13:15 螞蟻終結(jié)者

            @far
            其實(shí)最簡(jiǎn)單方法就是修改ABCD的初始值,哪怕只是修改其中一位數(shù),得到的md5值也會(huì)跟標(biāo)準(zhǔn)的完全不一樣。因?yàn)閙d5算法的整個(gè)過(guò)程都是以ABCD這4個(gè)數(shù)為基礎(chǔ)。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-01-09 10:14 hai

            看過(guò)了,收藏!
            牛人!頂下!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-01-29 15:27 roger

            很多地方都看到了這篇文章,只不過(guò)你這里多了個(gè)make文件。。。。
            請(qǐng)問(wèn)樓主這里是原創(chuàng)么?
            謝謝  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-02 09:07 螞蟻終結(jié)者

            我這里是原創(chuàng)呵呵,不過(guò)不知道你說(shuō)的make文件是什么?我這里好像沒(méi)有  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn)[未登錄](méi) 2009-02-13 10:04 Winter

            感謝 ant 的這個(gè)類, 其實(shí)已經(jīng)用了好久了, 今天才來(lái)道謝 >.<
            額, 主要是想多問(wèn)一個(gè)問(wèn)題 - -!
            如果是包含亂碼的 unicode 路徑在用 ifstream 的時(shí)候該怎么做呢 @@
            之前 unicode 路徑都是 WideCharToMultiByte 然后調(diào)用類的...
            不過(guò)如果是帶亂碼的路徑換成 ANSI 就不行了
            3Q ^^  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn)[未登錄](méi) 2009-02-13 10:18 Winter

            :P 大概要求高了點(diǎn)...
            如果想很好支持 UNICODE 亂碼路徑的話感覺(jué)整個(gè)類都需要改了
            剛才試了下 WinMD5 或 Hash 這兩個(gè)常用的校驗(yàn)軟件
            發(fā)現(xiàn)也無(wú)法支持亂碼 (大概他們用的也是那個(gè)最老的標(biāo)準(zhǔn) MD5 類吧 ^^)
            anyway, thx alot : )  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-20 10:43 Nihlathak

            問(wèn)主人一個(gè)問(wèn)題啊:為什么以下代碼
            md5.reset();
            md5.update(ifstream("E:\\1.txt"));
            PrintMD5("E:\\1.txt", md5);
            當(dāng)E盤(pán)不存在這個(gè)文件的時(shí)候也能出結(jié)果呢?
            不好意思我C++小白,就想請(qǐng)教一下  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-20 12:40 螞蟻終結(jié)者

            @Nihlathak
            當(dāng)文件不存在的時(shí)候得到的結(jié)果肯定是錯(cuò)誤的。
            上面的例子寫(xiě)成那樣只是為了演示用法。
            最好在調(diào)用update前判斷一下文件是否存在:
            md5.reset();
            ifstream file("E:\\1.txt");
            if (!file) {
            // error: can not open file
            }
            else {
            md5.update();
            PrintMD5("E:\\1.txt", md5);
            }
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-20 14:00 Nihlathak

            呵呵,謝了  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-23 11:33 涼風(fēng)

            你好我想問(wèn)下 像加密后我要還原 那該怎么還原   回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-23 11:38 螞蟻終結(jié)者

            @涼風(fēng)
            md5算法是一種hash算法,是單向的,還原是不可能的。因?yàn)槎喾輸?shù)據(jù)可能計(jì)算出相同的md5值。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-23 19:54 roger

            引用你的code,需要收費(fèi)么?收的話收多少?  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-23 20:01 螞蟻終結(jié)者

            @roger
            呵呵,哥們說(shuō)笑了,不收費(fèi),若是覺(jué)得不錯(cuò)的話直接用就行了!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-02-26 19:40 roger

            多謝樓主。這要是在美國(guó),說(shuō)不定樓主就發(fā)財(cái)了。
            可以雇些律師,去告使用你code的人;)
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-03-07 07:19 chang

            我現(xiàn)在想在16bits系統(tǒng)中實(shí)現(xiàn)MD5,能給些建議嗎?還有,不調(diào)用update函數(shù)可以嗎?謝謝!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-03-07 11:56 螞蟻終結(jié)者

            @chang
            16位系統(tǒng)下應(yīng)該可以拿上面的代碼移植,比如需要把md5.h中的
            typedef unsigned int uint32;
            改為
            typedef unsigned long uint32;
            可能還需要改動(dòng)其他代碼,我這里沒(méi)有條件測(cè)試,你不妨測(cè)試一下。

            update是唯一的接口,不調(diào)用是不行的呵呵。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-04-05 17:12 anyangtao

            string str1 = "abcdefghijklmn";
            md5.update(str1);
            cout << md5.toString() << endl;
            cout << MD5("abcdefghijklmn").toString() << endl;
            string str2 = str1 ;
            md5.update(str2);
            cout << md5.toString() << endl;

            前兩個(gè)輸出的值相同,但第三個(gè)輸出和前兩個(gè)輸出的并不一樣,未找出原因,望指點(diǎn)。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-04-05 17:29 螞蟻終結(jié)者

            調(diào)用update是有累加效果的,上面的代碼:
            ...
            md5.update(str1);
            ...
            md5.update(str2);
            實(shí)際上得到的是"abcdefghijklmnabcdefghijklmn"的md5值

            如果想重復(fù)使用某個(gè)MD5對(duì)象,需要在下次update前先reset,如下:
            ...
            string str2 = str1 ;
            //這里加上reset
            md5.reset();
            md5.update(str2);
            ...
              回復(fù)  更多評(píng)論   

            # 鏈接變量的初始化問(wèn)題 2009-04-08 01:22 csu_boy

            為什么用 _state[0] = 0x67452301;
            _state[1] = 0xefcdab89;
            _state[2] = 0x98badcfe;
            _state[3] = 0x10325476;
            這些值
            而不是網(wǎng)上說(shuō)的
            _state[0] = 0x01234567;
            _state[1] = 0x89abcdef;
            _state[2] = 0xfedcba98;
            _state[3] = 0x76543210;
            我用下面的值算就對(duì)應(yīng)不了標(biāo)準(zhǔn)的MD5值了  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-04-08 11:52 螞蟻終結(jié)者

            @csu_boy
            這個(gè)是Endian的問(wèn)題,本文中md5的實(shí)現(xiàn)是基于Little Endian的機(jī)器,所以要寫(xiě)成下面這樣:
            _state[0] = 0x67452301;
            _state[1] = 0xefcdab89;
            _state[2] = 0x98badcfe;
            _state[3] = 0x10325476;
            如果是Big Endian的機(jī)器,則要寫(xiě)成:
            _state[0] = 0x01234567;
            _state[1] = 0x89abcdef;
            _state[2] = 0xfedcba98;
            _state[3] = 0x76543210;
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-04-16 15:45 csu_boy

            據(jù)說(shuō)MD5連文件的屬性改變了也會(huì)計(jì)算出不同的MD5值,是這么回事嗎?  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-04-16 16:31 螞蟻終結(jié)者

            @csu_boy
            這個(gè)應(yīng)該是跟計(jì)算md5值的軟件實(shí)現(xiàn)有關(guān),一般來(lái)說(shuō)都只看文件內(nèi)容,內(nèi)容相同的文件md5就是一樣的  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-04-27 22:35 MM

            該程序怎樣修改可以實(shí)現(xiàn)對(duì)數(shù)字(例:ip包凈核)的認(rèn)證呢?請(qǐng)指教!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-04-27 23:03 螞蟻終結(jié)者

            @MM
            你是要計(jì)算純數(shù)據(jù)的md5值?
            那可以用這個(gè)重載方法:
            void update(const void* input, size_t length);

            比如:
            1.計(jì)算一個(gè)int的md5值:
            int i = 12345;
            MD5 md;
            md.update(&i, sizeof(i));
            cout << md.toString() << endl;

            2.計(jì)算一個(gè)struct的md5值:
            struct Package {
            char buffer[32];
            int i;
            //...
            };

            Package pkg;
            MD5 md;
            md.update(&pkg, sizeof(pkg));
            cout << md.toString() << endl;

            不知道這是否是你想要的功能?  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-04-30 11:16 adang

            螞蟻終結(jié)者,請(qǐng)問(wèn)一下有沒(méi)有“test.txt”文件?可以的話,麻煩傳給我一份(還有加密后的結(jié)果)。我現(xiàn)在用的是QT版本的那個(gè)MD5算法,想驗(yàn)證一下加密出來(lái)的結(jié)果是否和你們的一致,字符串的已經(jīng)可以了,現(xiàn)在只剩下文件加密了。我的郵箱:adang322@126.com。謝謝!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-05-27 08:50 windcao

            我移植了一個(gè)到symbian上
            下載:http://download.csdn.net/source/1355073
            我的MSN: windcao@hotmail.com  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-05-27 11:25 windcao

            http://download.csdn.net/source/1355214
            以這個(gè)為準(zhǔn),剛才那個(gè)有點(diǎn)別的問(wèn)題編譯出錯(cuò)。

              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-06-09 15:36 lalalal

            非常感謝那位提醒64位的同學(xué)。。。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-08-29 16:56 nofree

            嗯,寫(xiě)得不錯(cuò),不過(guò)那個(gè)大端小端的問(wèn)題可以很容易實(shí)現(xiàn)嘛,干嘛用32位常量直接賦值呢?一個(gè)字節(jié)一個(gè)字節(jié)來(lái)賦值就ok了,我說(shuō)的是下面這里:
            _state[0] = 0x67452301;
            _state[1] = 0xefcdab89;
            _state[2] = 0x98badcfe;
            _state[3] = 0x10325476;
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-09-07 23:55 summer

            謝謝!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2009-09-17 16:45 jaosnjee

            我發(fā)現(xiàn)有BUG  回復(fù)  更多評(píng)論   

            # 我發(fā)現(xiàn)有BUG 2009-09-17 16:51 jaosnjee

            根據(jù)WIKI百科的MD5介紹,他們給出了三個(gè)例子:
            一般128位的MD5散列被表示為32位十六進(jìn)制數(shù)字。以下是一個(gè)43位長(zhǎng)ASCII字母列的MD5散列:
            MD5("The quick brown fox jumps over the lazy dog")
            = 9e107d9d372bb6826bd81d3542a419d6
            即使在原文中作一個(gè)小變化(比如用c取代d)其散列也會(huì)發(fā)生巨大的變化:
            MD5("The quick brown fox jumps over the lazy cog")
            = 1055d3e698d289f2af8663725127bd4b
            空文的散列為:
            MD5("")
            = d41d8cd98f00b204e9800998ecf8427e
            為什么我在用你的程序驗(yàn)證The quick brown fox jumps over the lazy dog得到了相同的結(jié)果,而把這句話中c取代d后卻得不到相同的結(jié)果?我之后又將c改回d,連續(xù)算兩變,居然得到不同的MD5值!!!  回復(fù)  更多評(píng)論   

            # 不好意思搞錯(cuò)了,關(guān)于"我發(fā)現(xiàn)有BUG" 2009-09-17 17:01 jaosnjee

            沒(méi)有在兩次計(jì)算間插入
            md5.reset();
            不好意思,有點(diǎn)攪局了.
            樓主啊,你的參考代碼怎么也不在每次計(jì)算后都加上
            md5.reset();啊?害我瞎忙活
              回復(fù)  更多評(píng)論   

            # re: 不能下載 2010-01-07 16:20 光光兔

            不能下載啊.兄弟.
            只有Vrcats修改的Qt版本可以下載.

            看得我眼讒哦.呵呵.
            請(qǐng)幫我發(fā)到wcg_0321@163.com好嗎?  回復(fù)  更多評(píng)論   

            # re: 不能下載 2010-01-07 16:21 光光兔

            不能下載啊.兄弟.
            只有Vrcats修改的Qt版本可以下載.

            看得我眼讒哦.呵呵.
            請(qǐng)幫我發(fā)到wcg_0321@163.com好嗎?  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2010-07-05 15:35 cll

            借用了,非常感謝。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn)[未登錄](méi) 2010-08-30 23:34 liu

            你好,看了你的介紹之后懂了不少,不過(guò)我比較笨還是有很多不懂,我的理解是這樣的:假如第一次update(str1),然后打印str1的md5,接著update(str2),這時(shí)str1的前strlen(str1)-strlen(str1)%64個(gè)字符應(yīng)該不用再處理(transform)了吧,那么程序在哪里保存前面strlen(str1)-strlen(str1)%64個(gè)字符的transform結(jié)果的呢?  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn)[未登錄](méi) 2010-08-31 21:53 liu

            唉,昨天沒(méi)仔細(xì)看,明明就有一個(gè)oldState.現(xiàn)在大體流程是看懂了,呵呵  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2010-09-19 00:08 Wind

            螞蟻大哥,弱弱的請(qǐng)教下:T[i]是什么意思?你在md5.cpp中直接傳進(jìn)去的一串16進(jìn)制字符又代表什么意思?  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2010-11-05 23:58 Tidus

            @Wind
            常數(shù)T[i]可以如下選擇:
            在第i步中,T[i]是4294967296*abs(sin(i))的整數(shù)部分,i的單位是弧度。
            可參考http://www.ietf.org/rfc/rfc1321.txt  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2011-03-24 11:35 yun

            為什么把程序移植到MFC中就出現(xiàn) 錯(cuò)誤
            Unhandled exception at 0x0002ded0 in .exe: 0xC0000005: Access violation.  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2011-06-15 21:05 Tim

            學(xué)習(xí)~  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2011-07-22 16:46 士大夫

            用這個(gè)計(jì)算文件好像不對(duì)  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2011-07-25 11:40 馬燈

            @士大夫
            對(duì)的,注意打開(kāi)方式,上面有帖子說(shuō)明  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn)[未登錄](méi) 2011-08-03 21:58 JAMES

            你好,如果要產(chǎn)生16位的MD5,該怎么辦
            求助
            ifdyo@hotmail.com  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2011-08-25 10:34 IT

            你好,我想問(wèn)一下 將輸入信息的原始長(zhǎng)度b(bit)表示成一個(gè)64-bit的數(shù)字 這句話怎么理解,比如我輸入的是 "abcdefghijk", 怎么表示成一個(gè)64bit的數(shù)字 。。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2011-12-08 05:37 RiggsCaitlin34

            I think that to get the <a href="http://goodfinance-blog.com/topics/business-loans">business loans</a> from creditors you ought to present a firm motivation. However, one time I have got a short term loan, just because I wanted to buy a bike.   回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-01-12 15:57 aaa

            我發(fā)現(xiàn)對(duì)中文進(jìn)行加密時(shí)結(jié)果不對(duì),是不是有問(wèn)題?  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-03-15 10:21 常超

            著急用,先拿來(lái)啊。回頭再好好看看。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-03-22 18:18 wyk

            謝謝分享,下來(lái)看過(guò),接口設(shè)計(jì)很好,學(xué)習(xí)  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-04-11 17:50 sean

            謝謝分享,質(zhì)量不錯(cuò)的代碼。  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-04-30 02:22 Comparatif forfait mobile

            你好,看了你的介紹之后懂了不少,不過(guò)我比較笨還是有很多不懂,我的理解是這樣的:假如第一次update(str1),然后打印str1的md5,接著update(str2),這時(shí)str1的前strlen(str1)-strlen(str1)%64個(gè)字符應(yīng)該不用再處理(transform)了吧,那么程序在哪里保存前面strlen(str1)-strlen(str1)%64個(gè)字符的transform結(jié)果的呢? 回復(fù) 更多評(píng)論   回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-05-02 11:17 狂奔的蝸牛

            @光光兔
            您好!能給我發(fā)一份Vrcats修改的Qt版本嗎?麻煩您了,謝謝!!!急需~~~我的QQ:690905539
              回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-05-02 11:20 狂奔的蝸牛

            @VrcatS
            您好:能給我發(fā)一份嗎? 我的QQ:690905539 謝謝~~~急需  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-08-20 21:53 aking

            學(xué)習(xí)了!很多地方看不太懂,收藏起來(lái)了。實(shí)在看不懂就直接用啦!  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-09-04 15:19 xwj

            同樣一個(gè)文件,中文路徑和英文路徑計(jì)算出來(lái)的md5碼不一樣。

            中文路徑下,所有的文件計(jì)算出來(lái)的md5碼都一樣,

            英文路徑下沒(méi)問(wèn)題。

            請(qǐng)指點(diǎn),32581991@qq.com  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2012-10-23 21:13 WWE

            為什么
            md5.update("bc");
            PrintMD5("abc", md5);
            不需要reset
            而后面
            md5.reset();
            md5.update("message digest");
            PrintMD5("message digest", md5);
            需要呢?  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2013-11-07 20:55 Dan

            想請(qǐng)問(wèn)一下,那個(gè)我該怎么在主函數(shù)中調(diào)用MD5算法  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2014-05-13 19:51 snoopy

            你好,我想請(qǐng)問(wèn)一下,對(duì)于字節(jié)串如何按512位分塊,需要先轉(zhuǎn)化為對(duì)應(yīng)的二進(jìn)制編碼嗎  回復(fù)  更多評(píng)論   

            # re: MD5算法的C++實(shí)現(xiàn) 2014-11-29 01:47 KomeijiKuroko

            建議在md5.h的聲明部分,
            MD5(ifstream& in);
            加上explicit,

            #Md5.h line 20
            explicit MD5(ifstream& in);

            要不然 MD5(ifstream("File")) 時(shí)候,IntelliSense總是把 ifstream("File")看成到MD5的隱式轉(zhuǎn)換,和

            #md5.h line 37
            private:
            MD5(const MD5&);

            矛盾  回復(fù)  更多評(píng)論   

            評(píng)論共2頁(yè): 1 2 
            97精品国产97久久久久久免费| 久久久久人妻一区精品性色av| 久久天天躁狠狠躁夜夜躁2014| 久久国产午夜精品一区二区三区| 国产成人综合久久综合| 久久99精品国产麻豆| 久久精品国产亚洲AV电影| 日韩久久久久久中文人妻 | 99久久免费国产精精品| 久久综合香蕉国产蜜臀AV| 少妇高潮惨叫久久久久久| 亚洲伊人久久精品影院| 亚洲精品无码专区久久久| 国产亚洲精品自在久久| 国内精品久久久久久野外| 91久久国产视频| 欧美久久一级内射wwwwww.| 欧美午夜精品久久久久久浪潮| 久久精品国产亚洲5555| 久久国产亚洲精品| 亚洲狠狠婷婷综合久久蜜芽| 久久综合给久久狠狠97色| 久久亚洲精品视频| 久久久久久av无码免费看大片| 性做久久久久久免费观看| 久久久婷婷五月亚洲97号色| 一本久久久久久久| 久久亚洲中文字幕精品一区| 久久九九精品99国产精品| 91久久精品视频| 久久91精品国产91久| 99re这里只有精品热久久| 精品久久久无码中文字幕| 99久久国产亚洲综合精品| 久久久亚洲欧洲日产国码aⅴ| 狠狠综合久久综合中文88| 久久精品国产亚洲AV久| 日韩亚洲欧美久久久www综合网| 久久久久香蕉视频| 久久99精品久久只有精品| 久久夜色精品国产亚洲av|