SHA1算法詳解

0x00 前言

SHA1算法也是哈希算法的一種,只要理解了MD5算法,SHA1也很快就能理解。
MD5算法可以參考:MD5算法詳解
MD5算法得出的MD5值長度為16個字節(8*16=128位)
SHA1算法得出的SHA1值長度為20個字節(8*20=160位)

0x01 填充信息

和MD5算法類似,對信息的第一步也是填充信息直至滿足條件。

填充的過程如下:
1.先判斷文件(消息)的大小(長度) mod 512 == 448 mod 512 ,就是大小(長度)對512求余等于448。(這里的512、448是“位”為單位,轉成“字節”就是64、56,即mod 64 == 56 mod 64)

2.如果大小(長度)滿足 mod 512 == 448 mod 512,就在文件(消息)的末尾處添加64位(8字節)的值,值的內容是原消息的長度(以位為單位)

3.如果大小(長度)不滿足要求,就執行以下操作:
(1)填充1個1
(2)填充0,直到滿足滿足過程的第一步。

注意:這里是以位為單位,假如是以字節為單位,第一個填充的是0x80(1000 0000),然后就填0x0
舉例:消息內容為“gnubd”,就能得到以下內容

67 6E 62 75 64 80 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 

還需要注意到的是最后原消息的長度是以大端存儲的方式存到內存中的,這里與MD5的存儲是有區別的。

0x02 數據說明

這里列舉出所用到的數據

DWORD sha1::A = 0x67452301;
DWORD sha1::B = 0xEFCDAB89;
DWORD sha1::C = 0x98BADCFE;
DWORD sha1::D = 0x10325476;
DWORD sha1::E = 0xC3D2E1F0;

這里相對MD5算法多了4個字節。(因為SHA1值就是比MD5值多4個字節嘛)

常量:

DWORD sha1::k[4] = {0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6};

MD5就有64個,這個就簡單一點,4個

0x03 處理信息

和MD5算法類似,也是需要將消息分組,每64個字節(512位)一組,分成多個組(n個)。
對與每一組MiMi(0 < i <= n)都要做如下處理。
將64個字節分成16組w0w0-w15w15,每組剛好4個字節
然后生成w16w16-w79w79,生成的方法如下:

for(DWORD i = 16;i<80;i++){DWORD temp = w[i-3]^w[i-8]^w[i-14]^w[i-16];w[i] = temp<<1 | temp>>31;}

接下來就是做核心運算了。
將a、b、c、d、e分別賦值為上面的A、B、C、D、E,作為MiMi的初始值
然后循環80次,從0-79:

        for(DWORD j = 0;j<80;j++){DWORD temp;DWORD temp2 = a<<5|a>>27; //循環左移5位,等下需要用到switch(j/20){   case 0:   //0-19步執行這里temp = (b&c)|((~(b))&d);temp += sha1::k[0];  //這個是常數break;case 1:  //20-39步執行這里temp = (b^c^d);temp += sha1::k[1];break;case 2: //40-59步執行這里temp = (b&c)|(b&d)|(c&d);temp += sha1::k[2];break;case 3: //60-79步執行這里temp = (b^c^d);temp += sha1::k[3];break;}temp += temp2 + e + w[j]; //這里就是上面生成的80個分組了e = d;d = c;c = b<<30 | b>>2; //循環左移30位b = a;a = temp;}A+=a;B+=b;C+=c;D+=d;E+=e;

注意最后這里和MD5類似,也是再將abcde分別加上初始值ABCDE,作為下一個消息分組Mi+1Mi+1的初始值,直到最后一個分組MnMn計算完后,得出的結果就是SHA1值。
即:
MnAMnBMnCMnDMnEMnAMnBMnCMnDMnE
這里只需按直接輸出就好了,不必像md5那樣調整字節位置后再輸出,

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376337.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML5 地理位置定位(HTML5 Geolocation)

地理位置&#xff08;Geolocation&#xff09;是 HTML5 的重要特性之一&#xff0c;提供了確定用戶位置的功能&#xff0c;借助這個特性能夠開發基于位置信息的應用。今天這篇文章向大家介紹一下HTML5 地理位置定位的基本原理及各個瀏覽器的數據精度情況。 在訪問位置信息前&a…

2016騰訊安全挑戰賽第一輪-PC游戲方向

0x00 查殼 無殼的VC程序 0x01 測試 沒有消息彈窗&#xff0c;嘗試對函數下斷點。 OD載入后&#xff0c;CtrlN查找函數&#xff0c;找到GetDlgItem 程序運行起來&#xff0c;等輸入完后點擊確定后程序斷下。一路F8就來到這里 00401EED . E8 6A5B0000 call Tenc…

49-今日交易總結.(2015.1.13)

49-今日交易總結今天交易情況不好&#xff0c;主要犯了虧損時還連續加倉的錯誤。作為一個交易者&#xff0c;虧損時&#xff0c;繼續加倉&#xff0c;認為市場會向交易的方向變化&#xff0c;一次性把虧損的全部撈回來&#xff0c;還能賺一筆。這是一種賭徒心理。永遠不要再虧損…

電商導購過冬:蘑菇街醞釀出售 美麗說轉型時尚

一度紅火的第三方導購網站正因為阿里巴巴過山車式的態度而呈現出急劇下滑的軌跡。 2011年&#xff0c;以美麗說、蘑菇街為代表的導購網站蜂擁而起。彼時&#xff0c;兩者還能頻繁出現在阿里巴巴的官方活動中。然而&#xff0c;2012年5月&#xff0c;阿里巴巴集團董事局主席馬云…

JavascriptDOM(三)

簡介 今天學習第二天的知識,js和BOM對象,再接再厲,fighting~學習原則 腳踏實地的走好每一步,要想學好高級部分,基礎知識必須扎實呀 掌握基本語法,完成小案例,寫博客作總結,基本就是這個節奏,下面我們一起快速入門吧JavaScript快速入門 1. js簡介 1.js基于對象和事件驅動的腳本語…

看雪 2016CrackMe 攻防大賽 - 1-Crack_Me-涼颼颼

環境&#xff1a; Windows xp 工具&#xff1a; IDA EXEINFOPE OD 0x00 查殼 EXEINFOPE查殼&#xff0c; 無殼 0x01 分析 if ( (unsigned __int16)wParam 0x40B ) // 成功{*(_OWORD *)v22 xmmword_41DB98;v25 0;v23 xmmword_41DBA8;v24 xmmword_41DBB8;memset_4039D0…

JS 或css教程 識別 IE版本的幾種方法

今天收藏了這幾種關于識別ie版本的幾種代碼&#xff0c;有需要的朋友參考一下&#xff1a;var isIE!!window.ActiveXObject;var isIE6isIE&&!window.XMLHttpRequest;var isIE8isIE&&!!document.documentMode;var isIE7isIE&&!isIE6&&!isIE8;if…

使用CSDN-markdown編輯器

這里寫自定義目錄標題歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants創建一個自定義列表如何創建一個注…

C++ vector類詳解

轉自http://blog.csdn.net/whz_zb/article/details/6827999 vector簡介 vector是STL中最常見的容器&#xff0c;它是一種順序容器&#xff0c;支持隨機訪問。vector是一塊連續分配的內存&#xff0c;從數據安排的角度來講&#xff0c;和數組極其相似&#xff0c;不同的地方就是…

ViewPager的使用方法和實現過程

看圖先&#xff1a; 頁面中填充內容是隨機關鍵詞飛入和飛出動畫效果&#xff0c;隨后會更新&#xff0c;現在請先無視吧 首先是 導入jar包 下載地址&#xff1a; android-support-v4.jar 布局文件里添加viewPager布局 [html] view plaincopyprint?<android.support.v4.vi…

如何通過瀏覽器在所有響應內容中查找文本

使用瀏覽器的開發者工具查找響應文件的內容 ** Chrome ** 版本&#xff1a; 快捷鍵&#xff1a;CtrlShiftF 可以看到已經查找出來了 ** firefox ** 版本

【Leetcode】【Easy】Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 解題&#xff1a; 本題為典型的KMP算法考察題&#xff0c;KMP算法描述為&#xff1a; 設主串S&#xff0c;匹配串P&#xff0c;i為S的索引下…

Android Animations動畫使用詳解

一、動畫類型 Android的animation由四種類型組成&#xff1a;alpha、scale、translate、rotate XML配置文件中 alpha漸變透明度動畫效果scale漸變尺寸伸縮動畫效果translate畫面轉換位置移動動畫效果rotate畫面轉移旋轉動畫效果Java Code代碼中 AlphaAnimation漸變透明度動畫效…

Jenkins入門指南

新手學習使用Jenkins 安裝好Jenkins后如何運行腳本 1.新建item 2.輸入任務名稱&#xff0c;選擇項目類型&#xff0c;點擊確定 3.填個描述就好了&#xff0c;新手學jenkins&#xff0c;其他都不看&#xff0c;跑起來再說 4.點這個高級&#xff0c;選擇你要運行的腳本所在…

Sublime Text 3 史上最性感的編輯器

↑ ↑ ↑ ↑ ↑ 請看文件夾 ↑ ↑ ↑ ↑ ↑ 下載 / 安裝 windows / MAC OS 官網下載&#xff0c;雙擊安裝&#xff0c;這個都會吧&#xff5e; linux linux下安裝&#xff0c;一種辦法是從官網下載 tar.bz &#xff0c;手動安裝。 這里介紹用 apt-get 自己主動安裝方法&#xf…

[轉]怎么查看和修改 MySQL 的最大連接數?

使用 MySQL 數據庫的站點&#xff0c;當訪問連接數過多時&#xff0c;就會出現 "Too many connections" 的錯誤。出現這種錯誤有兩種情況&#xff0c;一種是網站訪問量實在太大&#xff0c;服務器已經負擔不起&#xff0c;此時就應該考慮負載均衡或者其它減少服務器壓…

對qps、tps、pv、uv的理解

QPS &#xff08;Queries Per Second&#xff09;&#xff1a;每秒查詢數&#xff08;個別地方叫每秒查詢率&#xff1f;每秒查詢率是個奇怪的東西&#xff0c;每小時時速&#xff1f;&#xff09;&#xff0c;表示系統在一秒內處理的查詢次數。 TPS&#xff08;Transactions …

swift入門之TableView

IOS8更新了&#xff0c;oc還將繼續但新增了swift語言&#xff0c;能夠代替oc編寫ios應用&#xff0c;本文將使用swift作為編寫語言&#xff0c;為大家提供step by step的教程。 工具 ios每次更新都須要更新xcode&#xff0c;這次也不例外&#xff0c;但使用xcode6&#xff0c;須…

Training-ActionBar

閱讀&#xff1a;http://developer.android.com/training/basics/actionbar/index.html 對于API11以下的兼容&#xff1a; Update your activity so that it extends ActionBarActivity. For example: public class Main Activit yextends ActionBarActivity{...} In your mani…

Jmeter BeanShell學習(一) - BeanShell取樣器(一)

通過利用BeanShell取樣器設置請求發送的參數。 第一步&#xff1a;添加BeanShell取樣器 第二步&#xff1a;在BeanShell中輸入執行的代碼 log.info("腳本開始執行"); //意思是將字符串輸出到日志消息中 vars.put("username","123163.com");//…