SHA課程設(shè)計報告_第1頁
SHA課程設(shè)計報告_第2頁
SHA課程設(shè)計報告_第3頁
SHA課程設(shè)計報告_第4頁
SHA課程設(shè)計報告_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PAGE成都信息工程學(xué)院課程設(shè)計報告SHA1散列算法的實現(xiàn)課程名稱:應(yīng)用密碼算法程序設(shè)計學(xué)生姓名:鄧興全學(xué)生學(xué)號:2007122063專業(yè)班級:信安072任課教師:萬武南2009附件:課程設(shè)計成績評價表附件:課程設(shè)計成績評價表學(xué)習(xí)與工作態(tài)度(30%)選題意義(10%)文獻(xiàn)綜述(10%)研究水平與設(shè)計能力(20%)課程設(shè)計說明說(論文)撰寫質(zhì)量(20%)設(shè)計創(chuàng)新(10%)總分指導(dǎo)老師簽名:年月日課程設(shè)計答辯記錄及評價表學(xué)生講述情況教師主要提問記錄學(xué)生回答問題情況答辯評分評分項目分值評價參考標(biāo)準(zhǔn)評分總分優(yōu)良中及格差選題意義1098764文獻(xiàn)綜述1098764研究水平與設(shè)計能力201917151310課程設(shè)計說明書(論文)撰寫質(zhì)量201917151310設(shè)計創(chuàng)新1098764答辯效果302825221915答辯小組成員簽名答辯小組組長簽名:年月日課程設(shè)計成績評定表成績匯總評分項目評分比例分?jǐn)?shù)課程設(shè)計總分指導(dǎo)老師評分50%答辯小組評分50%

目錄1. 引言 11.1背景 11.2目的 11.3算法描述 12.系統(tǒng)設(shè)計 22.1系統(tǒng)主要目標(biāo) 22.1.1主要軟件需求 22.1.2運(yùn)行環(huán)境 22.2系統(tǒng)結(jié)構(gòu) 32.2.1軟件操作流程 32.2.2功能模塊與系統(tǒng)結(jié)構(gòu) 33系統(tǒng)功能程序設(shè)計 33.1基本要求部分 33.1.1消息轉(zhuǎn)換成二進(jìn)制 33.1.2消息填充 43.1.3初始化消息摘要的緩沖區(qū) 53.1.4各輪使用到的邏輯函數(shù) 53.1.5十六進(jìn)制轉(zhuǎn)換 63.1.6分組hash 93.1.7消息hash 103.2較高要求部分 114.測試報告 125.結(jié)論 13參考文獻(xiàn) 14第2頁共14頁引言1.1背景SHA_1是由美國尺度技術(shù)局(NIST)公布的國度尺度,是一種利用最為普遍的hash函數(shù)算法,也是目前最先進(jìn)的加密技術(shù),被政府部門和企業(yè)用來處置敏感的信息。1.2目的安全哈希算法(SecureHashAlgorithm)主要適用于數(shù)字簽名標(biāo)準(zhǔn)(DigitalSignatureStandardDSS)里面定義的數(shù)字簽名算法(DigitalSignatureAlgorithmDSA)。對于長度小于2^64位的消息,SHA1會產(chǎn)生一個160位的消息摘要。當(dāng)接收到消息的時候,這個消息摘要可以用來驗證數(shù)據(jù)的完整性。在傳輸?shù)倪^程中,數(shù)據(jù)很可能會發(fā)生變化,那么這時候就會產(chǎn)生不同的消息摘要。SHA1特性:不可以從消息摘要中復(fù)原信息;兩個不同的消息不會產(chǎn)生同樣的消息摘要。1.3算法描述在SHA1算法中,我們必須把原始消息(字符串,文件等)轉(zhuǎn)換成位字符串。SHA1算法只接受位作為輸入,以512位為單位分組處理。消息必須進(jìn)行填充,以使其長度在對512取模以后的余數(shù)是448,然后再添加消息本身的長度,通常用一個64位的數(shù)據(jù)來表示原始消息的長度。算法中使用到的常量:一系列的常量字K(0),K(1),...,K(79),如果以16進(jìn)制給出。它們?nèi)缦拢篕t=0x5A827999(0<=t<=19),Kt=0x6ED9EBA1(20<=t<=39),Kt=0x8F1BBCDC(40<=t<=59),Kt=0xCA62C1D6(60<=t<=79).在SHA1中我們需要一系列的函數(shù),每個函數(shù)ft(0<=t<=79)都操作32位字B,C,D并且產(chǎn)生32位字作為輸出。ft(B,C,D)可以如下定義ft(B,C,D)=(BANDC)or((NOTB)ANDD)(0<=t<=19),ft(B,C,D)=BXORCXORD(20<=t<=39),ft(B,C,D)=(BANDC)or(BANDD)or(CANDD)(40<=t<=59),ft(B,C,D)=BXORCXORD(60<=t<=79).必須使用進(jìn)行了補(bǔ)位和補(bǔ)長度后的消息來計算消息摘要。計算需要兩個緩沖區(qū),每個都由5個32位的字組成,還需要一個80個32位字的緩沖區(qū)。第一個5個字的緩沖區(qū)被標(biāo)識為A,B,C,D,E。第一個5個字的緩沖區(qū)被標(biāo)識為H0,H1,H2,H3,H4。80個字的緩沖區(qū)被標(biāo)識為W0,W1,...,W79,另外還需要一個一個字的TEMP緩沖區(qū)。為了產(chǎn)生消息摘要,在第4部分中定義的16個字的數(shù)據(jù)塊M1,M2,...,Mn會依次進(jìn)行處理,處理每個數(shù)據(jù)塊Mi包含80個步驟。在處理每個數(shù)據(jù)塊之前,緩沖區(qū)被初始化為下面的值(16進(jìn)制)H0=0x67452301,H1=0xEFCDAB89,H2=0x98BADCFE,H3=0x10325476,H4=0xC3D2E1F0。為了處理Mi,需要進(jìn)行下面的步驟(1).將Mi分成16個字W0,W1,...,W15,W0是最左邊的字(2).對于t=16到79令Wt=S1(Wt-3XORWt-8XORWt-14XORWt-16).(3).令A(yù)=H0,B=H1,C=H2,D=H3,E=H4.(4)對于t=0到79,執(zhí)行下面的循環(huán)TEMP=S5(A)+ft(B,C,D)+E+Wt+Kt;E=D;D=C;C=S30(B);B=A;A=TEMP;(5).令H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E.在處理完所有的Mn,后,消息摘要是一個160位的字符串,以下面的順序標(biāo)識H0H1H2H3H4.2.系統(tǒng)設(shè)計2.1系統(tǒng)主要目標(biāo)2.1.1主要軟件需求使用編程語言(如Java、VC++等)實現(xiàn)SHA-1算法的軟件系統(tǒng)設(shè)計?;疽螅?1)在深入理解算法的基礎(chǔ)上,設(shè)計一個生成消息摘要的軟件系統(tǒng);(2)要求輸入信息是ASCII碼等,允許只有一個分組,運(yùn)行后生成固定長度的消息摘要;(3)消息摘要值計算的中間結(jié)果輸出并與標(biāo)準(zhǔn)對比;(4)提供所設(shè)計的報告及完整的軟件。高級要求:(1)要求輸入信息可以是漢字或英文,或者是文本文檔,可以是多個分組;也可以是各種類型的文件;(2)程序有比較好的結(jié)構(gòu),方便代碼重用。2.1.2運(yùn)行環(huán)境本軟件使用c#語言編寫測試平臺:Windows2003使用軟件:Visualstudio2008C#簡介C#是可用于創(chuàng)建運(yùn)行在.NETCLR上的應(yīng)用程序語言之一,它從C和C++語言演化而來,是microsoft專門為使用.NET平臺而創(chuàng)建的。因為C#是近期發(fā)展起來的,所以吸取了以前的教訓(xùn),考慮了其他語言的許多有點,并解決了它們的問題。2.2系統(tǒng)結(jié)構(gòu)2.2.1軟件操作流程進(jìn)入軟件界面后按要求輸入消息并點擊相應(yīng)的功能鍵。2.2.2功能模塊與系統(tǒng)結(jié)構(gòu)編號模塊名稱模塊標(biāo)識1消息的二進(jìn)制轉(zhuǎn)換ConvertTo(輸入為字符串或文件輸出為二進(jìn)制數(shù)組)2消息填充Pad(對二進(jìn)制數(shù)組按算法要求進(jìn)行填充)3初始化寄存器Init(初始化五個寄存器的值)4初始化常數(shù)值ktInit(初始化常數(shù)值kt)5邏輯函數(shù)Zip(四輪循環(huán)中使用到的邏輯函數(shù))6十六進(jìn)制轉(zhuǎn)換HEX(將int32或者byte轉(zhuǎn)換成十六進(jìn)制)7512位塊hash_512Hash(單獨512位分組摘要值計算)8消息hashMessageHash(整個消息的摘要值計算)9上傳文件openFileDialog(上傳文件并調(diào)用響應(yīng)的摘要值計算方法)3系統(tǒng)功能程序設(shè)計3.1基本要求部分3.1.1消息轉(zhuǎn)換成二進(jìn)制程序從文本框得到消息字符串,并將其以參數(shù)形式傳到二進(jìn)制轉(zhuǎn)換函數(shù)B_message(Stringmessage)。函數(shù)首先用一個字符數(shù)組Byte[]接收字符串,然后再用Bitarray的帶字節(jié)數(shù)組參數(shù)的構(gòu)造方法將字節(jié)數(shù)組轉(zhuǎn)換成布爾數(shù)組,得到消息的二進(jìn)制表示。由于sha-1函數(shù)采用高位在前的處理方式(即大端序列),所以為了能與后續(xù)的(填充)處理銜接,此處我們將輸入的二進(jìn)制轉(zhuǎn)換為大端序列,即以八位二進(jìn)制位為單位進(jìn)行逆轉(zhuǎn)處理(處理機(jī)默認(rèn)的是小端序列),在填充完成之后再以同樣的方式再從大端序列轉(zhuǎn)成小端序列以得到在系統(tǒng)下的正確結(jié)果。程序如ConvertTo所示。classConvertTo{將消息轉(zhuǎn)換成二進(jìn)制數(shù)組publicstaticBitArrayB_message(Stringmessage){Byte[]_byte=newByte[message.Length];for(inti=0;i<message.Length;i++){_byte[i]=(Byte)message[i];}BitArray_bitArray=newBitArray(_byte);bool_exchange;序列轉(zhuǎn)換for(inti=0;i<message.Length;i++){for(intj=0;j<4;j++){_exchange=_bitArray[8*i+j];_bitArray[8*i+j]=_bitArray[8*(i+1)-j-1];_bitArray[8*(i+1)-j-1]=_exchange;}}return_bitArray;}3.1.2消息填充算法是以512位為單位進(jìn)行處理的,必須首先進(jìn)行填充使得消息長度=448mod512.,并且處理的二進(jìn)制序列最后需添加消息長度的二進(jìn)制表示(64位)。首先用一個int32的數(shù)通過Bitarry的Count屬性獲消息長度,程序為了能方便的將其轉(zhuǎn)換成Bitarry形式的bool數(shù)組,將此int32放在一個int32[]數(shù)組中,方法同上字節(jié)數(shù)組的轉(zhuǎn)換,得到一個32位的bool數(shù)組,即消息長度的二進(jìn)制表示。然后進(jìn)行第一個填充位1的添加,若消息長度模512等于448,則直接進(jìn)入消息長度的添加,若不等則通過Bitarry的Length屬性將消息長度加1,并賦值為true。再進(jìn)行填充位0的添加,程序通過設(shè)置Bitarry的元素個數(shù)來實現(xiàn),因為Bitarry元素的默認(rèn)值是1。若消息長度小于等于448則將消息長度設(shè)置為448,若大于448則需要進(jìn)行下一步判斷:若消息長度模512等于448則長度不變,不等則消息長度設(shè)置為原消息長度加512-(message.Count-448)%512;最后再將消息長度加64,用以添加消息長度的二進(jìn)制表示,程序用一個循環(huán)賦值的方法實現(xiàn)。privateBitArrayPad(BitArraymessage){獲取消息的二進(jìn)制位數(shù),此處用數(shù)組是為了向后轉(zhuǎn)換成bitarry提供參數(shù)Int32[]_messageL=newInt32[1];_messageL[0]=message.Count;下標(biāo)加1并對該位賦值true,即在消息后面第一位填充1if(message.Count%512!=448){message.Length+=1;message.Set(_messageL[0],true);}添加需要的零if(message.Count>448){message.Length+=(message.Count-448)%512==0?0:512-(message.Count-448)%512;}else{message.Length=448;}在最后添加消息長度BitArraylength=newBitArray(_messageL);message.Length+=64;for(intj=0;j<32;j++){message[message.Count-j-1]=length[j];}returnmessage;}3.1.3初始化程序使用160比特長的緩沖區(qū)存儲中間結(jié)果和最終消息摘要值,緩沖區(qū)可表示為5個32比特長的寄存器(A,B,C,D,E),其初始值分別為A=67452301B=EFCDAB89D=10325476E=C3D2E1F0。UInt32[]_Hvalue=newUInt32[5];_Hvalue[0]=0x67452301;_Hvalue[1]=0xEFCDAB89;_Hvalue[2]=0x98BADCFE;_Hvalue[3]=0x10325476;_Hvalue[4]=0xC3D2E1F0;以同樣的方法可以初始化分別要在四輪循環(huán)中用到的常數(shù)值kt,Kt值如上算法中所描述。3.1.4四輪循環(huán)中的每一輪循環(huán)都用到各自的邏輯函數(shù),一輪循環(huán)中的二十步是一樣的,所以事先提取出來,如第一輪循環(huán)中即t=0到19使用的邏輯函數(shù)為((B&C)|((UInt32)(~B)&D)),用以寄存器A的值運(yùn)算。代碼如下:privateUInt32Zip(UInt32B,UInt32C,UInt32D,intt){各輪使用到的邏輯函數(shù)if(t<20){return((B&C)|((UInt32)(~B)&D));}elseif(t<40){returnB^C^D;}elseif(t<60){return(B&C)|(B&D)|(C&D);}else{returnB^C^D;}每一輪循環(huán)都以當(dāng)前處理的512位和160位的緩存值A(chǔ)BCDE為輸入,然后更新緩存的內(nèi)容。每個循環(huán)還使用到之前所初始化的常數(shù)值。最后第四輪的輸出加到第一輪循環(huán)的輸入產(chǎn)生產(chǎn)生最后的消息摘要值。3.1.5十六進(jìn)制轉(zhuǎn)換程序的結(jié)果顯示中要用到十六進(jìn)制的轉(zhuǎn)換,一個是在分組hash中的強(qiáng)制類型轉(zhuǎn)換:_Wvalue[t]=Convert.ToUInt32(HEX.Hex(_byte[4*t])+HEX.Hex(_byte[4*t+1])+HEX.Hex(_byte[4*t+2])+HEX.Hex(_byte[4*t+3]),16)這是由于程序采用Convert.ToUInt32里第一個參數(shù)是指定基數(shù)的數(shù)字的字符串表式。這個十六進(jìn)制轉(zhuǎn)換函數(shù)以byte為處理參數(shù),結(jié)果是用兩個十六進(jìn)制數(shù)分別表示byte數(shù)中的高四位和低四位,具體實現(xiàn)方法是將byte除以16和byte模16的值(即高四位和低四位)賦給兩個int型的整數(shù),然后對這兩個數(shù)進(jìn)行同樣的處理:若在0到9之間則進(jìn)行強(qiáng)制類型轉(zhuǎn)換(char)(number+48);若在10到15之間則用switch將10到15對應(yīng)A到F顯示出來,最后將這兩個十六進(jìn)制數(shù)合并成一個字符串返回。代碼如下:classHEX{publicstaticstringHex(Byte_number){int_number1=_number/16;int_number2=_number%16;StringhexResult="";if(_number1<10){hexResult+=(char)(_number1+48);}else{switch(_number1){case10:hexResult+="A";break;case11:hexResult+="B";break;case12:hexResult+="C";break;case13:hexResult+="D";break;case14:hexResult+="E";break;case15:hexResult+="F";break;}}if(_number2<10){hexResult+=(char)(_number2+48);}else{switch(_number2){case10:hexResult+="A";break;case11:hexResult+="B";break;case12:hexResult+="C";break;case13:hexResult+="D";break;case14:hexResult+="E";break;case15:hexResult+="F";break;}}returnhexResult;}publicstaticstringHex(UInt32_number){stringhexResult="";inti=0;while(_number!=0){if(_number%16<10){hexResult+=(char)(_number%16+48);}else{switch(_number%16){case10:hexResult+="A";break;case11:hexResult+="B";break;case12:hexResult+="C";break;case13:hexResult+="D";break;case14:hexResult+="E";break;case15:hexResult+="F";break;}}_number/=16;i++;}while(i<8){hexResult+="0";i++;}Stringrresult="";for(i=7;i>=0;i--){rresult+=hexResult[i];}returnrresult;}另一個用到十六進(jìn)制轉(zhuǎn)換的地方就是最后的輸出是以十六進(jìn)制顯示的,而直接的輸出是五個寄存器中的32位字,所以需要進(jìn)行一個將int32轉(zhuǎn)化成十六進(jìn)制顯示的函數(shù),當(dāng)然兩個的處理其實是類似的。3.1.6分組hash前后的準(zhǔn)備工作都做好了,接下來進(jìn)入本程序最核心的部分,對每一個分組進(jìn)行hash。此過程以512位的字節(jié)數(shù)組表示為輸入,首先將消息拆分成十六個三十二位字得到W0到W15,具體實現(xiàn)是通過下標(biāo)尋找到響應(yīng)的byte值進(jìn)行強(qiáng)制類型轉(zhuǎn)換,后續(xù)的W[t]值由下標(biāo)為W[t-3],W[t-8],W[t-14],和W[t-16]異或之后循環(huán)左移一位得到:privatevoid_512Hash(Byte[]_byte){for(intt=0;t<16;t++){拆分消息得到w0到w15,w0是做左邊的一個._Wvalue[t]=Convert.ToUInt32(HEX.Hex(_byte[4*t])+HEX.Hex(_byte[4*t+1])+HEX.Hex(_byte[4*t+2])+HEX.Hex(_byte[4*t+3]),16);}for(intt=16;t<80;t++){_Wvalue[t]=Shift(_Wvalue[t-3]^_Wvalue[t-8]^_Wvalue[t-14]^_Wvalue[t-16],1);}將之前初始化的寄存器值裝入寄存器:UInt32AUInt32B=_Hvalue[1];UInt32CUInt32D=_Hvalue[3];UInt32E=_Hvalue[4];然后更新寄存器的值從t=0到79A寄存器的值TEMP=S5(A)(循環(huán)左移五位)+zip(B,C,D)(相應(yīng)的邏輯函數(shù))+E+Wt+Kt,%4294967296指的是模2^32次方加E=D;D=C;C=S30(B);B=A;A=TEMPfor(intt=0;t<80;t++){UInt32TEMP=(UInt32)((Shift(A,5)+Zip(B,C,D,t)+E+_Wvalue[t]+_Kvalue[t])%4294967296);E=D;D=C;C=Shift(B,30);B=A;A=TEMP;以string的形式記錄中間結(jié)果用以輸出mvalue+="A"+t+""+HEX.Hex(_Hvalue[0])+""+"B"+t+""+HEX.Hex(_Hvalue[1])+""+"C"+t+""+HEX.Hex(_Hvalue[2])+""+"D"+t+""+HEX.Hex(_Hvalue[3])+""+"E"+t+""+HEX.Hex(_Hvalue[4])+"\r\n";}最后的變換函數(shù)H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E.得到消息摘要_Hvalue[0]=(UInt32)((_Hvalue[0]+A)%4294967296);_Hvalue[1]=(UInt32)((_Hvalue[1]+B)%4294967296);_Hvalue[2]=(UInt32)((_Hvalue[2]+C)%4294967296);_Hvalue[3]=(UInt32)((_Hvalue[3]+D)%4294967296);_Hvalue[4]=(UInt32)((_Hvalue[4]+E)%4294967296);}這便是一個分組的整個處理過程。3.1.7消息hash然后進(jìn)行整個消息摘要值的計算,以消息字符轉(zhuǎn)轉(zhuǎn)換成的bitarry為輸入首先初始化寄存器init();然后進(jìn)行消息填充message=Pad(message);計算消息分組for(inti=0;i<message.Count/512;i++){以512位為處理單位一塊一塊處理BitArray_512Message=newBitArray(512);for(intj=0;j<512;j++){_512Message[j]=message[512*i+j];}這里是要轉(zhuǎn)換成為小端序列,即以字節(jié)為單位將位的順序逆轉(zhuǎn)bool_exchange;for(intj=0;j<64;j++){for(intk=0;k<4;k++){_exchange=_512Message[8*j+k];_512Message[8*j+k]=_512Message[8*(j+1)-k-1];_512Message[8*(j+1)-k-1]=_exchange;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論