




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
http://www.md5.asia/MD5加密免費網(wǎng)站MD5簡介與代碼實現(xiàn)分類:
技術資料2008-05-3122:46
2192人閱讀
評論(0)
\o"收藏"收藏
\o"舉報"舉報算法inputoutput破解c加密MD5簡介
md5的全稱是message-digestalgorithm5(信息-摘要算法),在90年代初由mitlaboratoryforcomputerscience和rsadatasecurityinc的ronaldl.rivest開發(fā)出來,經(jīng)md2、md3和md4發(fā)展而來。它的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個任意長度的字節(jié)串變換成一定長的大整數(shù))。不管是md2、md4還是md5,它們都需要獲得一個隨機長度的信息并產(chǎn)生一個128位的信息摘要。雖然這些算法的結(jié)構(gòu)或多或少有些相似,但md2的設計與md4和md5完全不同,那是因為md2是為8位機器做過設計優(yōu)化的,而md4和md5卻是面向32位的電腦。這三個算法的描述和c語言源代碼在internetrfcs1321中有詳細的描述(/rfc/rfc1321.txt),這是一份最權威的文檔,由ronaldl.rivest在1992年8月向ieft提交。
rivest在1989年開發(fā)出md2算法。在這個算法中,首先對信息進行數(shù)據(jù)補位,使信息的字節(jié)長度是16的倍數(shù)。然后,以一個16位的檢驗和追加到信息末尾。并且根據(jù)這個新產(chǎn)生的信息計算出散列值。后來,rogier和chauvaud發(fā)現(xiàn)如果忽略了檢驗和將產(chǎn)生md2沖突。md2算法的加密后結(jié)果是唯一的--既沒有重復。
為了加強算法的安全性,rivest在1990年又開發(fā)出md4算法。md4算法同樣需要填補信息以確保信息的字節(jié)長度加上448后能被512整除(信息字節(jié)長度mod512=448)。然后,一個以64位二進制表示的信息的最初長度被添加進來。信息被處理成512位damg?rd/merkle迭代結(jié)構(gòu)的區(qū)塊,而且每個區(qū)塊要通過三個不同步驟的處理。denboer和bosselaers以及其他人很快的發(fā)現(xiàn)了攻擊md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的個人電腦在幾分鐘內(nèi)找到md4完整版本中的沖突(這個沖突實際上是一種漏洞,它將導致對不同的內(nèi)容進行加密卻可能得到相同的加密后結(jié)果)。毫無疑問,md4就此被淘汰掉了。
盡管md4算法在安全上有個這么大的漏洞,但它對在其后才被開發(fā)出來的好幾種信息安全加密算法的出現(xiàn)卻有著不可忽視的引導作用。除了md5以外,其中比較有名的還有sha-1、ripe-md以及haval等。
一年以后,即1991年,rivest開發(fā)出技術上更為趨近成熟的md5算法。它在md4的基礎上增加了"安全-帶子"(safety-belts)的概念。雖然md5比md4稍微慢一些,但卻更為安全。這個算法很明顯的由四個和md4設計有少許不同的步驟組成。在md5算法中,信息-摘要的大小和填充的必要條件與md4完全相同。denboer和bosselaers曾發(fā)現(xiàn)md5算法中的假沖突(pseudo-collisions),但除此之外就沒有其他被發(fā)現(xiàn)的加密后結(jié)果了。
vanoorschot和wiener曾經(jīng)考慮過一個在散列中暴力搜尋沖突的函數(shù)(brute-forcehashfunction),而且他們猜測一個被設計專門用來搜索md5沖突的機器(這臺機器在1994年的制造成本大約是一百萬美元)可以平均每24天就找到一個沖突。但單從1991年到2001年這10年間,竟沒有出現(xiàn)替代md5算法的md6或被叫做其他什么名字的新算法這一點,我們就可以看出這個瑕疵并沒有太多的影響md5的安全性。上面所有這些都不足以成為md5的在實際應用中的問題。并且,由于md5算法的使用不需要支付任何版權費用的,所以在一般的情況下(非絕密應用領域。但即便是應用在絕密領域內(nèi),md5也不失為一種非常優(yōu)秀的中間技術),md5怎么都應該算得上是非常安全的了。
2004年8月17日的美國加州圣巴巴拉的國際密碼學會議(Crypto’2004)上,來自中國山東大學的王小云教授做了破譯MD5、HAVAL-128、MD4和RIPEMD算法的報告,公布了MD系列算法的破解結(jié)果。宣告了固若金湯的世界通行密碼標準MD5的堡壘轟然倒塌,引發(fā)了密碼學界的軒然大波。
MD5破解工程權威網(wǎng)站/是為了公開征集專門針對MD5的攻擊而設立的,網(wǎng)站于2004年8月17日宣布:“中國研究人員發(fā)現(xiàn)了完整MD5算法的碰撞;Wang,Feng,Lai與Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128幾個Hash函數(shù)的碰撞。這是近年來密碼學領域最具實質(zhì)性的研究進展。使用他們的技術,在數(shù)個小時內(nèi)就可以找到MD5碰撞?!捎谶@個里程碑式的發(fā)現(xiàn),MD5CRK項目將在隨后48小時內(nèi)結(jié)束”。
MD5用的是哈希函數(shù),在計算機網(wǎng)絡中應用較多的不可逆加密算法有RSA公司發(fā)明的MD5算法和由美國國家技術標準研究所建議的安全散列算法SHA.\o"返回頁首"算法的應用
MD5的典型應用是對一段信息(Message)產(chǎn)生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多軟件在下載的時候都有一個文件名相同,文件擴展名為.md5的文件,在這個文件中通常只有一行文本,大致結(jié)構(gòu)如:
MD5(tanajiya.tar.gz)=0ca175b9c0f726a831d895e269332461
這就是tanajiya.tar.gz文件的數(shù)字簽名。MD5將整個文件當作一個大文本信息,通過其不可逆的字符串變換算法,產(chǎn)生了這個唯一的MD5信息摘要。為了讓讀者朋友對MD5的應用有個直觀的認識,筆者以一個比方和一個實例來簡要描述一下其工作過程:
大家都知道,地球上任何人都有自己獨一無二的指紋,這常常成為公安機關鑒別罪犯身份最值得信賴的方法;與之類似,MD5就可以為任何文件(不管其大小、格式、數(shù)量)產(chǎn)生一個同樣獨一無二的“數(shù)字指紋”,如果任何人對文件做了任何改動,其MD5值也就是對應的“數(shù)字指紋”都會發(fā)生變化。
我們常常在某些軟件下載站點的某軟件信息中看到其MD5值,它的作用就在于我們可以在下載該軟件后,對下載回來的文件用專門的軟件(如WindowsMD5Check等)做一次MD5校驗,以確保我們獲得的文件與該站點提供的文件為同一文件。利用MD5算法來進行文件校驗的方案被大量應用到軟件下載站、論壇數(shù)據(jù)庫、系統(tǒng)文件安全等方面。
MD5的典型應用是對一段Message(字節(jié)串)產(chǎn)生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫readme.txt文件中,并對這個readme.txt產(chǎn)生一個MD5的值并記錄在案,然后你可以傳播這個文件給別人,別人如果修改了文件中的任何內(nèi)容,你對這個文件重新計算MD5時就會發(fā)現(xiàn)(兩個MD5值不相同)。如果再有一個第三方的認證機構(gòu),用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應用。
所以,要遇到了md5密碼的問題,比較好的辦法是:你可以用這個系統(tǒng)中的md5()函數(shù)重新設一個密碼,如admin,把生成的一串密碼覆蓋原來的就行了。\o"返回頁首"算法描述對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值。
在MD5算法中,首先需要對信息進行填充,使其字節(jié)長度對512求余的結(jié)果等于448。因此,信息的字節(jié)長度(BitsLength)將被擴展至N*512+448,即N*64+56個字節(jié)(Bytes),N為一個正整數(shù)。填充的方法如下,在信息的后面填充一個1和無數(shù)個0,直到滿足上面的條件時才停止用0對信息的填充。然后,在在這個結(jié)果后面附加一個以64位二進制表示的填充前信息長度。經(jīng)過這兩步的處理,現(xiàn)在的信息字節(jié)長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數(shù)倍。這樣做的原因是為滿足后面處理中對信息長度的要求。
MD5中有四個32位被稱作鏈接變量(ChainingVariable)的整數(shù)參數(shù),他們分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。
當設置好這四個鏈接變量后,就開始進入算法的四輪循環(huán)運算。循環(huán)的次數(shù)是信息中512位信息分組的數(shù)目。
將上面四個鏈接變量復制到另外四個變量中:A到a,B到b,C到c,D到d。
主循環(huán)有四輪(MD4只有三輪),每輪循環(huán)都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數(shù)運算,然后將所得結(jié)果加上第四個變量,文本的一個子分組和一個常數(shù)。再將所得結(jié)果向右環(huán)移一個不定的數(shù),并加上a、b、c或d中之一。最后用該結(jié)果取代a、b、c或d中之一。
以一下是每次操作中用到的四個非線性函數(shù)(每輪一個)。
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))
(&是與,|是或,~是非,^是異或)
這四個函數(shù)的說明:如果X、Y和Z的對應位是獨立和均勻的,那么結(jié)果的每一位也應是獨立和均勻的。
F是一個逐位運算的函數(shù)。即,如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。
\o"返回頁首"具體的一個MD5實現(xiàn)=============================頭文件Security.h===============================================
/*
使用方法:
charMd5Buffer[33];
CSecuritySecurity;
Security.MD5("astring",Md5Buffer);
執(zhí)行完成之后Md5Buffer中即存儲了由"astring"計算得到的MD5值
*/
//下列ifdef塊是創(chuàng)建使從DLL導出更簡單的
//宏的標準方法。此DLL中的所有文件都是用命令行上定義的SECURITY_EXPORTS
//符號編譯的。在使用此DLL的
//任何其他項目上不應定義此符號。這樣,源文件中包含此文件的任何其他項目都會將
//SECURITY_API函數(shù)視為是從此DLL導入的,而此DLL則將用此宏定義的
//符號視為是被導出的。
//在使用該類的地方包含本文件即可
#ifdefSECURITY_EXPORTS
#defineSECURITY_API__declspec(dllexport)
#else
#defineSECURITY_API__declspec(dllimport)
#endif
/*POINTERdefinesagenericpointertype*/
typedefunsignedchar*POINTER;
/*UINT2definesatwobyteword*/
typedefunsignedshortintUINT2;
/*UINT4definesafourbyteword*/
typedefunsignedlongintUINT4;
#definePROTO_LIST(list)list
/*MD5context.*/
typedefstruct_MD5_CTX
{
UINT4state[4];/*state(ABCD)*/
UINT4count[2];/*numberofbits,modulo2^64(lsbfirst)*/
unsignedcharbuffer[64];/*inputbuffer*/
}MD5_CTX;
staticunsignedcharPADDING[64]={
0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
/*ConstantsforMD5Transformroutine.
*/
#defineS117
#defineS1212
#defineS1317
#defineS1422
#defineS215
#defineS229
#defineS2314
#defineS2420
#defineS314
#defineS3211
#defineS3316
#defineS3423
#defineS416
#defineS4210
#defineS4315
#defineS4421
/*F,G,HandIarebasicMD5functions.
*/
#defineF(x,y,z)(((x)&(y))|((~x)&(z)))
#defineG(x,y,z)(((x)&(z))|((y)&(~z)))
#defineH(x,y,z)((x)^(y)^(z))
#defineI(x,y,z)((y)^((x)|(~z)))
/*ROTATE_LEFTrotatesxleftnbits.
*/
#defineROTATE_LEFT(x,n)(((x)<<(n))|((x)>>(32-(n))))
/*FF,GG,HH,andIItransformationsforrounds1,2,3,and4.
Rotationisseparatefromadditiontopreventrecomputation.
*/
#defineFF(a,b,c,d,x,s,ac){(a)+=F((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}
#defineGG(a,b,c,d,x,s,ac){(a)+=G((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}
#defineHH(a,b,c,d,x,s,ac){
(a)+=H((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}
#defineII(a,b,c,d,x,s,ac){(a)+=I((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}
#defineTEST_BLOCK_LEN1000
#defineTEST_BLOCK_COUNT1000
//此類是從Security.dll導出的
classSECURITY_APICSecurity
{
public:
CSecurity(void);
voidCSecurity::MD5(constchar*string,char*lpMD5StringBuffer);
private:
voidMD5TransformPROTO_LIST((UINT4[4],unsignedchar[64]));
voidMD5_memcpyPROTO_LIST((POINTER,POINTER,size_t));
voidMD5_memsetPROTO_LIST((POINTER,int,size_t));
voidMD5InitPROTO_LIST((MD5_CTX*));
voidMD5UpdatePROTO_LIST((MD5_CTX*,unsignedchar*,size_t));
voidMD5FinalPROTO_LIST((unsignedchar[16],MD5_CTX*));
voidMDTimeTrialPROTO_LIST((void));
voidStringAddOnePROTO_LIST((char*));
voidEncodePROTO_LIST((unsignedchar*,UINT4*,size_t));
voidDecodePROTO_LIST((UINT4*,unsignedchar*,size_t));
};
===============================Security.cpp====================================================
//Security.cpp:定義DLL應用程序的入口點。
//
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include"Security.h"
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORD
ul_reason_for_call,
LPVOIDlpReserved
)
{
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
caseDLL_THREAD_ATTACH:
caseDLL_THREAD_DETACH:
caseDLL_PROCESS_DETACH:
break;
}
returnTRUE;
}
//這是已導出類的構(gòu)造函數(shù)。
//有關類定義的信息,請參閱Security.h
CSecurity::CSecurity()
{
return;
}
/*
MD5initialization.BeginsanMD5operation,writinganewcontext.
*/
voidCSecurity::MD5Init(MD5_CTX*context)
{
context->count[0]=context->count[1]=0;
/*
Loadmagicinitializationconstants.
*/
context->state[0]=0x67452301;
context->state[1]=0xefcdab89;
context->state[2]=0x98badcfe;
context->state[3]=0x10325476;
}
/*
MD5blockupdateoperation.ContinuesanMD5message-digest
operation,processinganothermessageblock,andupdatingthe
context.
*/
voidCSecurity::MD5Update(
MD5_CTX*context,/*context*/
unsignedchar*input,/*inputblock*/
size_tinputLen/*lengthofinputblock*/
)
{
size_ti,index,partLen;
/*Computenumberofbytesmod64*/
index=(size_t)((context->count[0]>>3)&0x3F);
/*Updatenumberofbits*/
if((context->count[0]+=((UINT4)inputLen<<3))
<((UINT4)inputLen<<3))
context->count[1]++;
context->count[1]+=((UINT4)inputLen>>29);
partLen=64-index;
/*Transformasmanytimesaspossible.*/
if(inputLen>=partLen){
MD5_memcpy
((POINTER)&context->buffer[index],(POINTER)input,partLen);
MD5Transform(context->state,context->buffer);
for(i=partLen;i+63<inputLen;i+=64)
MD5Transform(context->state,&input);
index=0;
}
else
i=0;
/*Bufferremaininginput*/
MD5_memcpy
((POINTER)&context->buffer[index],(POINTER)&input,
inputLen-i);
}
/*
MD5finalization.EndsanMD5message-digestoperation,writingthe
themessagedigestandzeroizingthecontext.
*/
voidCSecurity::MD5Final(
unsignedchardigest[16],/*messagedigest*/
MD5_CTX*context/*context*/
)
{
unsignedcharbits[8];
size_tindex,padLen;
/*Savenumberofbits*/
Encode(bits,context->count,8);
/*Padoutto56mod64.*/
index=(size_t)((context->count[0]>>3)&0x3f);
padLen=(index<56)?(56-index):(120-index);
MD5Update(context,PADDING,padLen);
/*Appendlength(beforepadding)*/
MD5Update(context,bits,8);
/*Storestateindigest*/
Encode(digest,context->state,16);
/*Zeroizesensitiveinformation.*/
MD5_memset((POINTER)context,0,sizeof(*context));
}
/*
MD5basictransformation.Transformsstatebasedonblock.
*/
voidCSecurity::MD5Transform(
UINT4state[4],
unsignedcharblock[64]
)
{
UINT4a=state[0],b=state[1],c=state[2],d=state[3],x[16];
Decode(x,block,64);
/*Round1*/
FF(a,b,c,d,x[0],S11,0xd76aa478);/*1*/
FF(d,a,b,c,x[1],S12,0xe8c7b756);/*2*/
FF(c,d,a,b,x[2],S13,0x242070db);/*3*/
FF(b,c,d,a,x[3],S14,0xc1bdceee);/*4*/
FF(a,b,c,d,x[4],S11,0xf57c0faf);/*5*/
FF(d,a,b,c,x[5],S12,0x4787c62a);/*6*/
FF(c,d,a,b,x[6],S13,0xa8304613);/*7*/
FF(b,c,d,a,x[7],S14,0xfd469501);/*8*/
FF(a,b,c,d,x[8],S11,0x698098d8);/*9*/
FF(d,a,b,c,x[9],S12,0x8b44f7af);/*10*/
FF(c,d,a,b,x[10],S13,0xffff5bb1);/*11*/
FF(b,c,d,a,x[11],S14,0x895cd7be);/*12*/
FF(a,b,c,d,x[12],S11,0x6b901122);/*13*/
FF(d,a,b,c,x[13],S12,0xfd987193);/*14*/
FF(c,d,a,b,x[14],S13,0xa679438e);/*15*/
FF(b,c,d,a,x[15],S14,0x49b40821);/*16*/
/*Round2*/
GG(a,b,c,d,x[1],S21,0xf61e2562);/*17*/
GG(d,a,b,c,x[6],S22,0xc040b340);/*18*/
GG(c,d,a,b,x[11],S23,0x265e5a51);/*19*/
GG(b,c,d,a,x[0],S24,0xe9b6c7aa);/*20*/
GG(a,b,c,d,x[5],S21,0xd62f105d);/*21*/
GG(d,a,b,c,x[10],S22,0x2441453);/*22*/
GG(c,d,a,b,x[15],S23,0xd8a1e681);/*23*/
GG(b,c,d,a,x[4],S24,0xe7d3fbc8);/*24*/
GG(a,b,c,d,x[9],S21,0x21e1cde6);/*25*/
GG(d,a,b,c,x[14],S22,0xc33707d6);/*26*/
GG(c,d,a,b,x[3],S23,0xf4d50d87);/*27*/
GG(b,c,d,a,x[8],S24,0x455a14ed);/*28*/
GG(a,b,c,d,x[13],S21,0xa9e3e905);/*29*/
GG(d,a,b,c,x[2],S22,0xfcefa3f8);/*30*/
GG(c,d,a,b,x[7],S23,0x676f02d9);/*31*/
GG(b,c,d,a,x[12],S24,0x8d2a4c8a);/*32*/
/*Round3*/
HH(a,b,c,d,x[5],S31,0xfffa3942);/*33*/
HH(d,a,b,c,x[8],S32,0x8771f681);/*34*/
HH(c,d,a,b,x[11],S33,0x6d9d6122);/*35*/
HH(b,c,d,a,x[14],S34,0xfde5380c);/*36*/
HH(a,b,c,d,x[1],S31,0xa4beea44);/*37*/
HH(d,a,b,c,x[4],S32,0x4bdecfa9);/*38*/
HH(c,d,a,b,x[7],S33,0xf6bb4b60);/*39*/
HH(b,c,d,a,x[10],S34,0xbebfbc70);/*40*/
HH(a,b,c,d,x[13],S31,0x289b7ec6);/*41*/
HH(d,a,b,c,x[0],S32,0xeaa127fa);/*42*/
HH(c,d,a,b,x[3],S33,0xd4ef3085);/*43*/
HH(b,c,d,a,x[6],S34,0x4881d05);/*44*/
HH(a,b,c,d,x[9],S31,0xd9d4d039);/*45*/
HH(d,a,b,c,x[12],S32,0xe6db99e5);/*46*/
HH(c,d,a,b,x[15],S33,0x1fa27cf8);/*47*/
HH(b,c,d,a,x[2],S34,0xc4ac5665);/*48*/
/*Round4*/
II(a,b,c,d,x[0],S41,0xf4292244);/*49*/
II(d,a,b,c,x[7],S42,0x432aff97);/*50*/
II(c,d,a,b,x[14],S43,0xab9423a7);/*51*/
II(b,c,d,a,x[5],S44,0xfc93a039);/*52*/
II(a,b,c,d,x[12],S41,0x655b59c3);/*53*/
II(d,a,b,c,x[3],S42,0x8f0ccc92);/*54*/
II(c,d,a,b,x[10],S43,0xffeff47d);/*55*/
II(b,c,d,a,x[1],S44,0x85845dd1);/*56*/
II(a,b,c,d,x[8],S41,0x6fa87e4f);/*57*/
II(d,a,b,c,x[15],S42,0xfe2ce6e0);/*58*/
II(c,d,a,b,x[6],S43,0xa3014314);/*59*/
II(b,c,d,a,x[13],S44,0x4e0811a1);/*60*/
II(a,b,c,d,x[4],S41,0xf7537e82);/*61*/
II(d,a,b,c,x[11],S42,0xbd3af235);/*62*/
II(c,d,a,b,x[2],S43,0x2ad7d2bb);/*63*/
II(b,c,d,a,x[9],S44,0xeb86d391);/*64*/
state[0]+=a;
state[1]+=b;
state[2]+=c;
state[3]+=d;
/*Zeroizesensitiveinformation.*/
MD5_memset((POINTER)x,0,sizeof(x));
}
/*
Encodesinput(UINT4)intooutput(unsignedchar).
Assumeslenisamultipleof4.
*/
voidCSecurity::Encode(
unsignedchar*output,
UINT4*input,
size_tlen
)
{
size_ti,j;
for(i=0,j=0;j<len;i++,j+=4){
output[j]=(unsignedchar)(input&0xff);
output[j+1]=(unsignedchar)((input>>8)&0xff);
output[j+2]=(unsignedchar)((input>>16)&0xff);
output[j+3]=(unsignedchar)((input>>24)&0xff);
}
}
/*
Decodesinput(unsignedchar)intooutput(UINT4).
Assumeslenisamultipleof4.
*/
voidCSecurity::Decode(
UINT4*output,
unsignedchar*input,
size_tlen
)
{
size_ti,j;
for(i=0,j=0;j<len;i++,j+=4)
output=((UINT4)input[j])|(((UINT4)input[j+1])<<8)|
(((UINT4)input[j+2])<<16)|(((UINT4)input[j+3])<<24);
}
/*
Note:Replace"forloop"withstandardmemcpyifpossible.
*/
voidCSecurity::MD5_memcpy(
POINTERoutput,
POINTERinput,
size_tlen
)
{
size_ti;
for(i=0;i<len;i++)
output=input;
}
/*
Note:Replace"forloop"withstandardmemsetifpossible.
*/
voidCSecurity::MD5_memset(
POINTERoutput,
intvalue,
size_tlen
)
{
size_ti;
for(i=0;i<len;i++)
((char*)output)=(char)value;
}
/*
Digestsastringandprintstheresult.
*/
voidCSecurity::MD5(constchar*string,char*lpMD5StringBuffer)
{
MD5_CTXcontext;
unsignedchardigest[16];
/*charoutput1[33];*/
staticcharoutput[33]={""};
/*size_t*/size_tlen=strlen(string);
inti;
MD5Init(&context);
MD5Update(&context,(unsignedchar*)string,len);
MD5Final(digest,&context);
for(i=0;i<16;i++)
{
sprintf(&(lpMD5StringBuffer[2*i]),"%02x",(unsignedchar)digest);
sprintf(&(lpMD5StringBuffer[2*i+1]),"%02x",(unsignedchar)(digest<<4));
}
for(i=0;i<32;i++)
{
output=lpMD5StringBuffer;
}
}
/*
getthestringaddone.
*/
voidCSecurity::StringAddOne(char*orstring)
{
size_tlen;
size_ti,n;
len=strlen(orstring);
n=len-1;
for(i=n;i>=0;i--)
{
if(orstring=='9')
{
orstring='A';
break;
}
elseif(orstring=='Z')
{
orstring='a';
break;
}
elseif(orstring=='z')
{
orstring='0';
continue;
}
else
orstring+=1;
break;
}
}
=============================stdafx.h=====================================
//stdafx.h:標準系統(tǒng)包含文件的包含文件,
//或是常用但不常更改的項目特定的包含文件
//
#pragmaonce
//導出
#defineSECURITY_EXPORTS
#defineWIN32_LEAN_AND_MEAN
//從Windows頭中排除極少使用的資料
//Windows頭文件:
#include<windows.h>
//TODO:在此處引用程序要求的附加頭文件
============================stdafx.cpp========================================
//stdafx.cpp:只包括標準包含文件的源文件
//Security.pch將成為預編譯頭
//stdafx.obj將包含預編譯類型信息
#include"stdafx.h"
//TODO:在STDAFX.H中
//引用任何所需的附加頭文件,而不是在此文件中引用
=====================================================================\o"返回頁首"一些破解MD5的網(wǎng)站(一億以上數(shù)據(jù))
這三個網(wǎng)站都是國人做的。
/(對數(shù)字破解比較好)
(對字母破解比較好)
(從1到4位數(shù)字)-好像關了
(美英字典的破解收集和IP地址)
(對數(shù)字破解比較好)
(估計是基礎字典的破解)
(這個倒是說得很厲害,但是在實際中,很多次我在這里都找不到)
http://passcracking.ru
/md5
(這個是我比較喜歡一個.也請你提交一些已破解的MD5)
/tools/hashcrack.php(多種破解.我試過...沒有一次破解出來.非常沒用)
/md5/-(破解挪威人(Norwegian)字典)
http://passcrack.spb.ru/
http://shm.pl/md5/
/
/md5/
/
/
http://md5.khrone.pl/
/md5/index.php
/
/
/
http://md5.xpzone.de/
http://md5.geeks.li/
/
/english.aspx
/
http://md5.overclock.ch/biz/index.php?p=md5crack&l=en
http://alimamed.pp.ru/md5/(如果你看不懂俄文,我告訴你,把你的MD5放到第2個格子)
http://md5crack.it-helpnet.de/index.php?op=add(德國的)
http://cijfer.hua.fi/(Projects->md5reverselookup)
http://shm.hard-core.pl/md5/
/index.php?view=cracker
/services/results.php(我試過破過幾次在這里)
/(需要捐獻)
/cracker/
/index.php?main_page=product_info&cPath=3&products_id=7這個是證明他們的破解商品的質(zhì)量..好讓你來買這個破解程序...但是...只要能破解到即可.你又不一定要買..
http://0ptix.co.nr/md5
lm:
http://sys9five.ath.cx:8080/hak5rtables/
http://lasecwww.epfl.ch/~oechslin/projects/ophcrack/
lm+ntlm:
/tools/hashcrack.php
/services/results.php
/
/index.php?main_page=product_info&cPath=3&products_id=7
md4:
/tools/hashcrack.php
/services/results.php
/
sha1:
/tools/hashcrack.php
http://passcrack.spb.ru/
/
/services/results.php
/
/
http://passcracking.ru
/
密碼學領域重大發(fā)現(xiàn):
山東大學王小云教授成功破解MD5
2004年8月17日的美國加州圣巴巴拉,正在召開的國際密碼學會議(Crypto’2004)安排了三場關于雜湊函數(shù)的特別報告。在國際著名密碼學家EliBiham和AntoineJoux相繼做了對SHA-1的分析與給出SHA-0的一個碰撞之后,來自山東大學的王小云教授做了破譯MD5、HAVAL-128、MD4和RIPEMD算法的報告。在會場上,當她公布了MD系列算法的破解結(jié)果之后,報告被激動的掌聲打斷。王小云教授的報告轟動了全場,得到了與會專家的贊嘆。報告結(jié)束時,與會者長時間熱烈鼓掌,部分學者起立鼓掌致敬,這在密碼學會議上是少見的盛況。王小云教授的報告緣何引起如此大的反響?因為她的研究成果作為密碼學領域的重大發(fā)現(xiàn)宣告了固若金湯的世界通行密碼標準MD5的堡壘轟然倒塌,引發(fā)了密碼學界的軒然大波。會議總結(jié)報告這樣寫道:“我們該怎么辦?MD5被重創(chuàng)了;它即將從應用中淘汰。SHA-1仍然活著,但也見到了它的末日。現(xiàn)在就得開始更換SHA-1了。”
關鍵詞:碰撞=漏洞=別人可以偽造和冒用數(shù)字簽名。
Hash函數(shù)與數(shù)字簽名(數(shù)字手印)
HASH函數(shù),又稱雜湊函數(shù),是在信息安全領域有廣泛和重要應用的密碼算法,它有一種類似于指紋的應用。在網(wǎng)絡安全協(xié)議中,雜湊函數(shù)用來處理電子簽名,將冗長的簽名文件壓縮為一段獨特的數(shù)字信息,像指紋鑒別身份一樣保證原來數(shù)字簽名文件的合法性和安全性。在前面提到的SHA-1和MD5都是目前最常用的雜湊函數(shù)。經(jīng)過這些算法的處理,原始信息即使只更動一個字母,對應的壓縮信息也會變?yōu)榻厝徊煌摹爸讣y”,這就保證了經(jīng)過處理信息的唯一性。為電子商務等提供了數(shù)字認證的可能性。
安全的雜湊函數(shù)在設計時必須滿足兩個要求:其一是尋找兩個輸入得到相同的輸出值在計算上是不可行的,這就是我們通常所說的抗碰撞的;其二是找一個輸入,能得到給定的輸出在計算上是不可行的,即不可從結(jié)果推導出它的初始狀態(tài)?,F(xiàn)在使用的重要計算機安全協(xié)議,如SSL,PGP都用雜湊函數(shù)來進行簽名,一旦找到兩個文件可以產(chǎn)生相同的壓縮值,就可以偽造簽名,給網(wǎng)絡安全領域帶來巨大隱患。
MD5就是這樣一個在國內(nèi)外有著廣泛的應用的雜湊函數(shù)算法,它曾一度被認為是非常安全的。然而,王小云教授發(fā)現(xiàn),可以很快的找到MD5的“碰撞”,就是兩個文件可以產(chǎn)生相同的“指紋”。這意味著,當你在網(wǎng)絡上使用電子簽名簽署一份合同后,還可能找到另外一份具有相同簽名但內(nèi)容迥異的合同,這樣兩份合同的真?zhèn)涡员銦o從辨別。王小云教授的研究成果證實了利用MD5算法的碰撞可以嚴重威脅信息系統(tǒng)安全,這一發(fā)現(xiàn)使目前電子簽名的法律效力和技術體系受到挑戰(zhàn)。因此,業(yè)界專家普林斯頓計算機教授EdwardFelten等強烈呼吁信息系統(tǒng)的設計者盡快更換簽名算法,而且他們強調(diào)這是一個需要立即解決的問題。
國際講壇王氏發(fā)現(xiàn)艷驚四座
面對Hash函數(shù)領域取得的重大研究進展,Crypto2004會議總主席StorageTek高級研究員JimHughes17日早晨表示,此消息太重要了,因此他已籌辦該會成立24年來的首次網(wǎng)絡廣播(Webcast)。Hughes在會議上宣布:“會中將提出三份探討雜湊碰撞(hashcollisions)重要的研究報告?!逼渲幸环菔峭跣≡频葞孜恢袊芯咳藛T的研究發(fā)現(xiàn)。17日晚,王小云教授在會上把他們的研究成果做了宣讀。這篇由王小云、馮登國、來學嘉、于紅波四人共同完成的文章,囊括了對MD5、HAVAL-128、MD4和RIPEMD四個著名HASH算法的破譯結(jié)果。在王小云教授僅公布到他們的第三個驚人成果的時候,會場上已經(jīng)是掌聲四起,報告不得不一度中斷。報告結(jié)束后,所有與會專家對他們的突出工作報以長時的熱烈掌聲,有些學者甚至起立鼓掌以示他們的祝賀和敬佩。當人們掌聲漸息,來學嘉教授又對文章進行了一點頗有趣味的補充說明。由于版本問題,作者在提交會議論文時使用的一組常數(shù)和先行標準不同;在會議發(fā)現(xiàn)這一問題之后,王小云教授立即改變了那個常數(shù),在很短的時間內(nèi)就完成了新的數(shù)據(jù)分析,這段有驚無險的小插曲倒更加證明了他們論文的信服力,攻擊方法的有效性,反而凸顯了研究工作的成功。
會議結(jié)束時,很多專家圍攏到王小云教授身邊,既有簡短的探討,又有由衷的祝賀,褒譽之詞不絕。包含公鑰密碼的主要創(chuàng)始人R.L.Rivest和A.Shamir在內(nèi)的世界頂級的密碼學專家也上前表示他們的欣喜和祝賀。
國際密碼學專家對王小云教授等人的論文給予高度評價。
MD5的設計者,同時也是國際著名的公鑰加密算法標準RSA的第一設計者R.Rivest在郵件中寫道:“這些結(jié)果無疑給人非常深刻的印象,她應當?shù)玫轿易顭崃业淖YR,當然,我并不希望看到MD5就這樣倒下,但人必須尊崇真理?!?/p>
FrancoisGrieu這樣說:“王小云、馮登國、來學嘉和于紅波的最新成果表明他們已經(jīng)成功破譯了MD4、MD5、HAVAL-128、RIPEMD-128。并且有望以更低的復雜度完成對SHA-0的攻擊。一些初步的問題已經(jīng)解決。他們贏得了非常熱烈的掌聲?!?/p>
另一位專家GregRose如此評價:“我剛剛聽了Joux和王小云的報告,王所使用的技術能在任何初始值下用2^40次hash運算找出SHA-0的碰撞。她在報告中對四種HASH函數(shù)都給出了碰撞,她贏得了長時間的起立喝彩,(這在我印象中還是第一次)?!钱斀衩艽a學界的巾幗英雄?!ㄍ跣≡平淌诘墓ぷ鳎┘夹g雖然沒有公開,但結(jié)果是無庸質(zhì)疑的,這種技術確實存在?!易赗onRivest前面,我聽到他評論道:‘我們不得不做很多的重新思考了?!?/p>
石破天驚MD5堡壘轟然倒塌
一石擊起千層浪,MD5的破譯引起了密碼學界的激烈反響。專家稱這是密碼學界近年來“最具實質(zhì)性的研究進展”,各個密碼學相關網(wǎng)站競相報導這一驚人突破。
MD5破解專項網(wǎng)站關閉
MD5破解工程權威網(wǎng)站/是為了公開征集專門針對MD5的攻擊而設立的,網(wǎng)站于2004年8月17日宣布:“中國研究人員發(fā)現(xiàn)了完整MD5算法的碰撞;Wang,Feng,Lai與Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128幾個Hash函數(shù)的碰撞。這是近年來密碼學領域最具實質(zhì)性的研究進展。使用他們的技術,在數(shù)個小時內(nèi)就可以找到MD5碰撞。……由于這個里程碑式的發(fā)現(xiàn),MD5CRK項目將在隨后48小時內(nèi)結(jié)束”。
對此,Readyresponse主頁專門轉(zhuǎn)載了該報道,幾個其它網(wǎng)站也進行了報道。
權威網(wǎng)站相繼發(fā)表評論或者報告這一重大研究成果
經(jīng)過統(tǒng)計,在論文發(fā)布兩周之內(nèi),已經(jīng)有近400個網(wǎng)站發(fā)布、引用和評論了這一成果。國內(nèi)的許多新聞網(wǎng)站也以“演算法安全加密功能露出破綻密碼學界一片嘩然”為題報道了這一密碼學界的重大事件,該消息在各新聞網(wǎng)站上多次轉(zhuǎn)載。
東方神韻MD5終結(jié)者來自中國
MD5破解工作的主要成員王小云教授是一個瘦弱、矜持的女子,厚厚的鏡片透射出雙眸中數(shù)學的靈光。她于1990年在山東大學師從著名數(shù)學家潘承洞教授攻讀數(shù)論與密碼學專業(yè)博士,在潘先生、于秀源、展?jié)榷辔恢淌诘南ば闹笇拢晒?shù)論知識應用到密碼學中,取得了很多突出成果,先后獲得863項目資助和國家自然科學基金項目資助,并且獲得部級科技進步獎一項,撰寫論文二十多篇。王小云教授從上世紀90年代末開始進行HASH函數(shù)的研究,她所帶領的于紅波、王美琴、孫秋梅、馮騏等組成的密碼研究小組,同中科院馮登國教授,上海交大來學嘉等知名學者密切協(xié)作,經(jīng)過長期堅持不懈的努力,找到了破解HASH函數(shù)的關鍵技術,成功的破解了MD5和其它幾個HASH函數(shù)。
近年來她的工作得到了山東大學和數(shù)學院領導的大力支持,特別投資建設了信息安全實驗室。山東大學校長展?jié)淌诟叨戎匾曂跣≡平淌谕怀龅目蒲谐晒?004年6月山東大學領導聽取王小云教授的工作介紹后,展?jié)iL親自簽發(fā)邀請函邀請國內(nèi)知名信息安全專家參加2004年7月在威海舉辦的“山東大學信息安全研究學術研討會”,數(shù)學院院長劉建亞教授組織和主持了會議,會上王小云教授公布了MD5等算法的一系列研究成果,專家們對她的研究成果給予了充分的肯定,對其堅持不懈的科研態(tài)度大加贊揚。一位院士說,她的研究水平絕對不比國際上的差。這位院士的結(jié)論在時隔一個月之后的國際密碼會上得到了驗證,國外專家如此強烈的反響表明,我們的工作可以說不但不比國際上的差,而且是在破解HASH函數(shù)方面已領先一步。加拿大CertainKey公司早前宣布將給予發(fā)現(xiàn)MD5算法第一個碰撞人員一定的獎勵,CertainKey的初衷是利用并行計算機通過生日攻擊來尋找碰撞,而王小云教授等的攻擊相對生日攻擊需要更少的計算時間。
數(shù)字認證你的未來不是夢
由于MD5的破譯,引發(fā)了關于MD5產(chǎn)品是否還能夠使用的大辯論。在麻省理工大學JeffreyI.Schiller教授主持的個人論壇上,許多密碼學家在標題為“Baddayatthehashfunctionfactory”的辯論中發(fā)表了具有價值的意見。這次國際密碼學會議的總主席JimesHughes發(fā)表評論說“我相信這(破解MD5)是真的,并且如果碰撞存在,HMAC也就不再是安全的了,……我認為我們應該拋開MD5了?!盚ughes建議,程序設計人員最好開始舍棄MD5。他說:“既然現(xiàn)在這種算法的弱點已暴露出來,在有效的攻擊發(fā)動之前,現(xiàn)在是撤離的時機?!?/p>
同樣,在普林斯頓大學教授EdwardsFelton的個人網(wǎng)站上,也有類似的評論。他說:“留給我們的是什么呢?MD5已經(jīng)受了重傷;它的應用就要淘汰。SHA-1仍然活著,但也不會很長,必須立即更換SHA-1,但是選用什么樣的算法,這需要在密碼研究人員達到共識。”
密碼學家Markku-Juhani稱“這是HASH函數(shù)分析領域激動人心的時刻。”
而著名計算機公司SUN的LINUX專家ValHenson則說:“以前我們說"SHA-1可以放心用,其他的不是不安全就是未知",現(xiàn)在我們只能這么總結(jié)了:"SHA-1不安全,其他的都完了"。
針對王小云教授等破譯的以MD5為代表的Hash函數(shù)算法的報告,美國國家技術與標準局(NIST)于2004年8月24日發(fā)表專門評論,評論的主要內(nèi)容為:“在最近的國際密碼學會議(Crypto2004)上,研究人員宣布他們發(fā)現(xiàn)了破解數(shù)種HASH算法的方法,其中包括MD4,MD5,HAVAL-128,RIPEMD還有SHA-0。分析表明,于1994年替代SHA-0成為聯(lián)邦信息處理標準的SHA-1的減弱條件的變種算法能夠被破解;但完整的SHA-1并沒有被破解,也沒有找到SHA-1的碰撞。研究結(jié)果說明SHA-1的安全性暫時沒有問題,但隨著技術的發(fā)展,技術與標準局計劃在2010年之前逐步淘汰SHA-1,換用其他更長更安全的算法(如SHA-224、SHA-256、SHA-384和SHA-512)來替代?!?/p>
2004年8月28日,十屆全國人大常委會第十一次會議表決通過了電子簽名法。這部法律規(guī)定,可靠的電子簽名與手寫簽名或者蓋章具有同等的法律效力。電子簽名法的通過,標志著我國首部“真正意義上的信息化法律”已正式誕生,將于2005年4月1日起施行。專家認為,這部法律將對我國電子商務、電子政務的發(fā)展起到極其重要的促進作用。王小云教授的發(fā)現(xiàn)無異于發(fā)現(xiàn)了信息化天空的一個驚人黑洞。我們期待著王小云教授和她的團隊能夠成就“女媧補天”的壯舉,為人類的信息化之路保駕護航。
md5加密算法c實現(xiàn)/////////////////////////////////////////////////////////////////////*
md5.h
*/
#ifndef_MD5_H_
#define_MD5_H_#defineR_memset(x,y,z)memset(x,y,z)
#defineR_memcpy(x,y,z)memcpy(x,y,z)
#defineR_memcmp(x,y,z)memcmp(x,y,z)typedefunsignedlongUINT4;
typedefunsignedchar*POINTER;/*MD5context.*/
typedefstruct{
/*state(ABCD)*/
/*四個32bits數(shù),用于存放最終計算得到的消息摘要。當消息長度〉512bits時,也用于存放每個512bits的中間結(jié)果*/
UINT4state[4];
/*numberofbits,modulo2^64(lsbfirst)*/
/*存儲原始信息的bits數(shù)長度,不包括填充的bits,最長為2^64bits,因為2^64是一個64位數(shù)的最大值*/
UINT4count[2];
/*inputbuffer*/
/*存放輸入的信息的緩沖區(qū),512bits*/
unsignedcharbuffer[64];
}MD5_CTX;voidMD5Init(MD5_CTX*);
voidMD5Update(MD5_CTX*,unsignedchar*,unsignedint);
voidMD5Final(unsignedchar[16],MD5_CTX*);#endif
/*_MD5_H_*/
////////////////////////////////////////////////////////////////////////////*
md5.cpp
*/
#include"stdafx.h"/*ConstantsforMD5Transformroutine.*/
/*md5轉(zhuǎn)換用到的常量,算法本身規(guī)定的*/
#defineS117
#defineS1212
#defineS1317
#defineS1422
#defineS215
#defineS229
#defineS2314
#defineS2420
#defineS314
#defineS3211
#defineS3316
#defineS3423
#defineS416
#defineS4210
#defineS4315
#defineS4421staticvoidMD5Transform(UINT4[4],unsignedchar[64]);
staticvoidEncode(unsignedchar*,UINT4*,unsignedint);
staticvoidDecode(UINT4*,unsignedchar*,unsignedint);/*
用于bits填充的緩沖區(qū),為什么要64個字節(jié)呢?因為當欲加密的信息的bits數(shù)被512除其余數(shù)為448時,
需要填充的bits的最大值為512=64*8。
*/
staticunsignedcharPADDING[64]={
0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};/*
接下來的這幾個宏定義是md5算法規(guī)定的,就是對信息進行md5加密都要做的運算。
據(jù)說有經(jīng)驗的高手跟蹤程序時根據(jù)這幾個特殊的操作就可以斷定是不是用的md5
*/
/*F,G,HandIarebasicMD5functions.
*/
#defineF(x,y,z)(((x)&(y))|((~x)&(z)))
#defineG(x,y,z)(((x)&(z))|((y)&(~z)))
#defineH(x,y,z)((x)^(y)^(z))
#defineI(x,y,z)((y)^((x)|(~z)))/*ROTATE_LEFTrotatesxleftnbits.
*/
#defineROTATE_LEFT(x,n)(((x)<<(n))|((x)>>(32-(n))))/*FF,GG,HH,andIItransformationsforrounds1,2,3,and4.
Rotationisseparatefromadditiontopreventrecomputation.
*/
#defineFF(a,b,c,d,x,s,ac){/
(a)+=F((b),(c),(d))+(x)+(UINT4)(ac);/
(a)=ROTATE_LEFT((a),(s));/
(a)+=(b);/
}
#defineGG(a,b,c,d,x,s,ac){/
(a)+=G((b),(c),(d))+(x)+(UINT4)(ac);/
(a)=ROTATE_LEFT((a),(s));/
(a)+=(b);/
}
#defineHH(a,b,c,d,x,s,ac){/
(a)+=H((b),(c),(d))+(x)+(UINT4)(ac);/
(a)=ROTATE_LEFT((a),(s));/
(a)+=(b);/
}
#defineII(a,b,c,d,x,s,ac){/
(a)+=I((b),(c),(d))+(x)+(UINT4)(ac);/
(a)=ROTATE_LEFT((a),(s));/
(a)+=(b);/
}/*MD5initialization.BeginsanMD5operation,writinganewcontext.*/
/*初始化md5的結(jié)構(gòu)*/
voidMD5Init(MD5_CTX*context)
{
/*將當前的有效信息的長度設成0,這個很簡單,還沒有有效信息,長度當然是0了*/
context->count[0]=context->count[1]=0;
/*Loadmagicinitializationconstants.*/
/*初始化鏈接變量,算法要求這樣,這個沒法解釋了*/
context->state[0]=0x67452301;
context->state[1]=0xefcdab89;
context->state[2]=0x98badcfe;
context->state[3]=0x10325476;
}/*MD5blockupdateoperation.ContinuesanMD5message-digest
operation,processinganothermessageblock,andupdatingthe
context.*/
/*將與加密的信息傳遞給md5結(jié)構(gòu),可以多次調(diào)用
context:初始化過了的md5結(jié)構(gòu)
input:欲加密的信息,可以任意長
inputLen:指定input的長度
*/
voidMD5Update(MD5_CTX*context,unsignedchar*input,unsignedint
inputLen)
{
unsignedinti,index,partLen;
/*Computenumberofbytesmod64*/
/*計算已有信息的bits長度的字節(jié)數(shù)的模64,64bytes=512bits。
用于判斷已有信息加上當前傳過來的信息的總長度能不能達到512bits,
如果能夠達到則對湊夠的512bits進行一次處理*/
index=(unsignedint)((context->count[0]>>3)&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 做瓷磚合同范例
- 大單元背景下初中語文寫作教學策略文獻參考
- 辦公類租房合同范例
- 出口家具安裝合同范例
- 低田閑置轉(zhuǎn)讓合同范例
- 共同商標轉(zhuǎn)讓合同范例
- 切削液購銷合同范例
- 共同購車協(xié)議合同范例
- 公司買房購房合同范例
- 中建鋼筋合同范例
- 血液透常見并發(fā)癥及處理課件
- 全國中小學幼兒園教職工安全素養(yǎng)培訓課程試題
- 長輸管道工程施工組織設計
- 說課比賽一等獎《醫(yī)用化學》說課課件
- 靜設備安裝課件(PPT 91頁)
- 英格索蘭空壓機知識
- 2022年度高等學??茖W研究優(yōu)秀成果獎(科學技術)提名工作手冊
- 完整版地下人防工程施工方案
- (完整word版)格拉布斯(Grubbs)臨界值表
- 汽車離合器的檢測與維修畢業(yè)論文
- 國家自然科學基金項目預算說明書
評論
0/150
提交評論