安全散列算法SHA_第1頁(yè)
安全散列算法SHA_第2頁(yè)
安全散列算法SHA_第3頁(yè)
安全散列算法SHA_第4頁(yè)
安全散列算法SHA_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

簡(jiǎn)介安全散列算法SHA(SecureHashAlgorithm,SHA)是美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所發(fā)布的國(guó)家標(biāo)準(zhǔn)FIPSPUB180,最新的標(biāo)準(zhǔn)已經(jīng)于2008年更新到FIPSPUB180-3。其中規(guī)定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512這幾種單向散列算法。SHA-1,SHA-224和SHA-256適用于長(zhǎng)度不超過(guò)2"64二進(jìn)制位的消息。SHA-384和SHA-512適用于長(zhǎng)度不超過(guò)2"128二進(jìn)制位的消息。散列算法散列是信息的提煉,通常其長(zhǎng)度要比信息小得多,且為一個(gè)固定長(zhǎng)度。加密性強(qiáng)的散列一定是不可逆的,這就意味著通過(guò)散列結(jié)果,無(wú)法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將導(dǎo)致散列結(jié)果的明顯變化,這稱之為雪崩效應(yīng)。散列還應(yīng)該是防沖突的,即找不出具有相同散列結(jié)果的兩條信息。具有這些特性的散列結(jié)果就可以用于驗(yàn)證信息是否被修改。單向散列函數(shù)一般用于產(chǎn)生消息摘要,密鑰加密等,常見的有:lMD5(MessageDigestAlgorithm5):是RSA數(shù)據(jù)安全公司開發(fā)的一種單向散列算法。lSHA(SecureHashAlgorithm):可以對(duì)任意長(zhǎng)度的數(shù)據(jù)運(yùn)算生成一個(gè)160位的數(shù)值;SHA-1在1993年,安全散列算法(SHA)由美國(guó)國(guó)家標(biāo)準(zhǔn)和技術(shù)協(xié)會(huì)(NIST)提出,并作為聯(lián)邦信息處理標(biāo)準(zhǔn)(FIPSPUB180)公布;1995年又發(fā)布了一個(gè)修訂版FIPSPUB180-1,通常稱之為SHA-1。SHA-1是基于MD4算法的,并且它的設(shè)計(jì)在很大程度上是模仿MD4的?,F(xiàn)在已成為公認(rèn)的最安全的散列算法之一,并被廣泛使用。原理SHA-1是一種數(shù)據(jù)加密算法,該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉(zhuǎn)換成一段(通常更?。┟芪?,也可以簡(jiǎn)單的理解為取一串輸入碼(稱為預(yù)映射或信息),并把它們轉(zhuǎn)化為長(zhǎng)度較短、位數(shù)固定的輸出序列即散列值(也稱為信息摘要或信息認(rèn)證代碼)的過(guò)程。單向散列函數(shù)的安全性在于其產(chǎn)生散列值的操作過(guò)程具有較強(qiáng)的單向性。如果在輸入序列中嵌入密碼,那么任何人在不知道密碼的情況下都不能產(chǎn)生正確的散列值,從而保證了其安全性。SHA將輸入流按照每塊512位(64個(gè)字節(jié))進(jìn)行分塊,并產(chǎn)生20個(gè)字節(jié)的被稱為信息認(rèn)證代碼或信息摘要的輸出。該算法輸入報(bào)文的長(zhǎng)度不限,產(chǎn)生的輸出是一個(gè)160位的報(bào)文摘要。輸入是按512位的分組進(jìn)行處理的°SHA-1是不可逆的、防沖突,并具有良好的雪崩效應(yīng)。通過(guò)散列算法可實(shí)現(xiàn)數(shù)字簽名實(shí)現(xiàn),數(shù)字簽名的原理是將要傳送的明文通過(guò)一種函數(shù)運(yùn)算(Hash)轉(zhuǎn)換成報(bào)文摘要(不同的明文對(duì)應(yīng)不同的報(bào)文摘要),報(bào)文摘要加密后與明文一起傳送給接受方,接受方將接受的明文產(chǎn)生新的報(bào)文摘要與發(fā)送方的發(fā)來(lái)報(bào)文摘要解密比較,比較結(jié)果一致表示明文未被改動(dòng),如果不一致表示明文已被篡改。MAC(信息認(rèn)證代碼)就是一個(gè)散列結(jié)果,其中部分輸入信息是密碼,只有知道這個(gè)密碼的參與者才能再次計(jì)算和驗(yàn)證MAC碼的合法性。SHA-1與MD5的比較因?yàn)槎呔蒑D4導(dǎo)出,SHA-1和MD5彼此很相似。相應(yīng)的,他們的強(qiáng)度和其他特性也是相似,但還有以下幾點(diǎn)不同:l對(duì)強(qiáng)行攻擊的安全性:最顯著和最重要的區(qū)別是SHA-1摘要比MD5摘要長(zhǎng)32位。使用強(qiáng)行技術(shù),產(chǎn)生任何一個(gè)報(bào)文使其摘要等于給定報(bào)摘要的難度對(duì)MD5是2"128數(shù)量級(jí)的操作,而對(duì)SHA-1則是2"160數(shù)量級(jí)的操作。這樣,SHA-1對(duì)強(qiáng)行攻擊有更大的強(qiáng)度。l對(duì)密碼分析的安全性:由于MD5的設(shè)計(jì),易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊。l速度:在相同的硬件上,SHA-1的運(yùn)行速度比MD5慢。2應(yīng)用計(jì)算MD5或sha-1加密哈希值的文件當(dāng)您將哈希算法應(yīng)用于任意數(shù)量的如一個(gè)二進(jìn)制文件的數(shù)據(jù)時(shí)結(jié)果將是一個(gè)哈希或消息摘要。此哈希具有固定的大小。MD5是創(chuàng)建一個(gè)128位的哈希值的哈希算法。sha-1是創(chuàng)建一個(gè)160位哈希值的哈希算法。文件校驗(yàn)和完整性驗(yàn)證程序(FCW)實(shí)用程序可以用于計(jì)算MD5或sha-1加密哈希值的文件。若要計(jì)算在MD5和文件的sha-1哈希值,請(qǐng)?jiān)诿钚墟I入以下命令:FCW-md5-sha1path\filename.ext例如對(duì)于計(jì)算Shdocvw.dll文件%Systemroot%\System32文件夾中的MD5和sha-1哈希值,鍵入以下命令:FCW-md5-sha1c:\windows\system32\shdocvw.dllSHA-1Java實(shí)現(xiàn)源碼/*安全散列算法SHA(SecureHashAlgorithm,SHA)*/publicclassSHA1((0x67452301,0xefcdab89,0x98badcfe,privatefinalint口abcde=0x10325476,0xc3d2e1f0);(0x67452301,0xefcdab89,0x98badcfe,//摘要數(shù)據(jù)存儲(chǔ)數(shù)組privateint[]digestInt=newint[5];//計(jì)算過(guò)程中的臨時(shí)數(shù)據(jù)存儲(chǔ)數(shù)組privateint[]tmpData=newint[80];//計(jì)算sha-1摘要privateintprocess_input_bytes(byte[]bytedata)(//初試化常量System.arraycopy(abcde,0,digestInt,0,abcde.length);//格式化輸入字節(jié)數(shù)組,補(bǔ)10及長(zhǎng)度數(shù)據(jù)byte[]newbyte=byteArrayFormatData(bytedata);//獲取數(shù)據(jù)摘要計(jì)算的數(shù)據(jù)單元個(gè)數(shù)intMCount=newbyte.length/64;//循環(huán)對(duì)每個(gè)數(shù)據(jù)單元進(jìn)行摘要計(jì)算for(intpos=0;pos<MCount;pos++)(//將每個(gè)單元的數(shù)據(jù)轉(zhuǎn)換成16個(gè)整型數(shù)據(jù),并保存到tmpData的前16個(gè)數(shù)組元素中for(intj=0;j<16;j++)(tmpData[j]=byteArrayToInt(newbyte,(pos*64)+(j*4));}//摘要計(jì)算函數(shù)encrypt();}return20;}//格式化輸入字節(jié)數(shù)組格式privatebyte[]byteArrayFormatData(byte[]bytedata)(//補(bǔ)0數(shù)量intzeros=0;//補(bǔ)位后總位數(shù)intsize=0;//原始數(shù)據(jù)長(zhǎng)度intn=bytedata.length;//模64后的剩余位數(shù)intm=n%64;//計(jì)算添加0的個(gè)數(shù)以及添加10后的總長(zhǎng)度if(m<56)(zeros=55-m;size=n-m+64;}elseif(m==56)(zeros=63;size=n+8+64;}else(zeros=63-m+56;size=(n+64)-m+64;}//補(bǔ)位后生成的新數(shù)組內(nèi)容byte[]newbyte=newbyte[size];//復(fù)制數(shù)組的前面部分System.arraycopy(bytedata,0,newbyte,0,n);//獲得數(shù)組Append數(shù)據(jù)元素的位置intl=n;//補(bǔ)1操作newbyte[l++]=(byte)0x80;//補(bǔ)0操作for(inti=0;i<zeros;i++)(newbyte[l++]=(byte)0x00;}//計(jì)算數(shù)據(jù)長(zhǎng)度,補(bǔ)數(shù)據(jù)長(zhǎng)度位共8字節(jié),長(zhǎng)整型longN=(long)n*8;byteh8=(byte)(N&0xFF);byteh7=(byte)((N>>8)&0xFF);byteh6 = (byte) ((N >> 16)& 0xFF);byteh5 = (byte) ((N >> 24)& 0xFF);byteh4 = (byte) ((N >> 32)& 0xFF);byteh3 = (byte) ((N >> 40) & 0xFF);byteh2 = (byte) ((N >> 48)& 0xFF);bytehl=(byte)(N>>56);newbyte[l++]=hl;newbyte[l++]=h2;newbyte[l++]=h3;newbyte[l++]=h4;newbyte[l++]=h5;newbyte[l++]=h6;newbyte[l++]=h7;newbyte[l++]=h8;returnnewbyte;}privateintf1(intx,inty,intz)(return(x&y)|(~x&z);}privateintf2(intx,inty,intz)(returnx"y"z;}privateintf3(intx,inty,intz)(return(x&y)|(x&z)|(y&z);}privateintf4(intx,inty)(return(x<<y)|x>>>(32-y);}//單元摘要計(jì)算函數(shù)privatevoidencrypt()(for(inti=16;i<=79;i++)(tmpData[i]=f4(tmpData[i-3]"tmpData[i-8]"tmpData[i-14]"tmpData[i-16],1);}int[]tmpabcde=newint[5];for(inti1=0;i1<tmpabcde.length;i1++)(tmpabcde[i1]=digestInt[i1];}for(intj=0;j<=19;j++)(inttmp=f4(tmpabcde[0],5)+f1(tmpabcde[1],tmpabcde[2],tmpabcde[3])+tmpabcde[4]+tmpData[j]+0x5a827999;tmpabcde[4]=tmpabcde[3];tmpabcde[3]=tmpabcde[2];tmpabcde[2]=f4(tmpabcde[1],30);tmpabcde[1]=tmpabcde[0];tmpabcde[0]=tmp;}for(intk=20;k<=39;k++)(inttmp=f4(tmpabcde[0],5)+f2(tmpabcde[1],tmpabcde[2],tmpabcde[3])+tmpabcde[4]+tmpData[k]+0x6ed9eba1;tmpabcde[4]=tmpabcde[3];tmpabcde[3]=tmpabcde[2];tmpabcde[2]=f4(tmpabcde[1],30);tmpabcde[1]=tmpabcde[0];tmpabcde[0]=tmp;}for(intl=40;l<=59;l++)(inttmp=f4(tmpabcde[0],5)+f3(tmpabcde[1],tmpabcde[2],tmpabcde[3])+tmpabcde[4]+tmpData[l]+0x8f1bbcdc;tmpabcde[4] = tmpabcde[3];tmpabcde[3] = tmpabcde[2];tmpabcde[2] = f4(tmpabcde[1],30);tmpabcde[1] = tmpabcde[0];tmpabcde[0] = tmp;}for(intm=60;m<=79;m++)(inttmp=f4(tmpabcde[0],5)+f2(tmpabcde[1],tmpabcde[2],tmpabcde[3])+tmpabcde[4]+tmpData[m]+0xca62c1d6;tmpabcde[4] = tmpabcde[3];tmpabcde[3] = tmpabcde[2];tmpabcde[2] = f4(tmpabcde[1],30);tmpabcde[1] = tmpabcde[0];tmpabcde[0] = tmp;}for(inti2=0;i2<tmpabcde.length;i2++)(digestInt[i2]=digestInt[i2]+tmpabcde[i2];}for(intn=0;n<tmpData.length;n++)(tmpData[n]=0;}}//4字節(jié)數(shù)組轉(zhuǎn)換為整數(shù)privateintbyteArrayToInt(byte[]bytedata,inti)(return((bytedata[i]&0xff)<<24)|((bytedata[i+1]&0xff)<<1)|((bytedata[i+2]&0xff)<<8)|(bytedata[i+3]&0xff);}//整數(shù)轉(zhuǎn)換為4字節(jié)數(shù)組privatevoidintToByteArray(intintValue,byte[]byteData,inti)(byteData[i]=(byte)(intValue>>>24);byteData[i+1]=(byte)(intValue>>>16);byteData[i+2]=(byte)(intValue>>>8);byteData[i+3]=(byte)intValue;}//將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串privatestaticStringbyteToHexString(byteib)(char[]Digit={'0',T','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};char[]ob=newchar[2];ob[0]=Digit[(ib>>>4)&0X0F];ob[1]=Digit[ib&0X0F];Strings=newString(ob);returns;}//將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串privatestaticStringbyteArrayToHexString(byte[]bytearray)(Stringst

溫馨提示

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

評(píng)論

0/150

提交評(píng)論