801 WORKPLACE

          追尋夢想,自由生活

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            10 Posts :: 1 Stories :: 1 Comments :: 0 Trackbacks
          首先介紹下SHA1,老美的東西當然得看原文了,而且原文簡單易懂。
          1: FIPS 180-1 Secure Hash Standard:http://www.itl.nist.gov/fipspubs/fip180-1.htm

          2: Secure Hash Standard: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf

          看過原文,對SHA1就會有個大致了解了,這里再貼出個中文翻譯吧。


          1 SHA1算法簡介
          安全哈希算法(Secure Hash Algorithm)主要適用于數(shù)字
          簽名標準(Digital Signature Standard DSS)里面定義的
          數(shù)字簽名算法(Digital Signature Algorithm DSA)。對
          于長度小于2^64位的消息,SHA1會產(chǎn)生一個160位的消息摘
          要。當接收到消息的時候,這個消息摘要可以用來驗證數(shù)據(jù)
          的完整性。在傳輸?shù)倪^程中,數(shù)據(jù)很可能會發(fā)生變化,那么這時候就會產(chǎn)生不同的消息摘要。
          SHA1有如下特性:不可以從消息摘要中復(fù)原信息;兩個不同的消息不會產(chǎn)生同樣的消息摘要。
          2 術(shù)語和概念
          2.1位(Bit),字節(jié)(Byte)和字(Word)
          SHA1始終把消息當成一個位(bit)字符串來處理。本文中,一個“字”(Word)是32位,而一個“字
          節(jié)”(Byte)是8位。比如,字符串“abc”可以被轉(zhuǎn)換成一個位字符串:01100001 01100010 01100011。它
          也可以被表示成16進制字符串: 0x616263.
          2.2 運算符和符號
          下面的邏輯運算符都被運用于“字”(Word)
          X^Y = X, Y邏輯與
          X \/ Y = X, Y邏輯或
          X XOR Y= X, Y邏輯異或
          ~X = X邏輯取反
          X+Y定義如下:
          字 X 和 Y 代表兩個整數(shù) x 和y, 其中 0 <= x < 2^32 且 0 <= y < 2^32. 令整數(shù)z = (x + y) mod 2^32.
          這時候 0 <= z < 2^32. 將z轉(zhuǎn)換成字Z, 那么就是 Z = X + Y.
          循環(huán)左移位操作符Sn(X)。X是一個字,n是一個整數(shù),0<=n<=32。Sn(X) = (X<<n)OR(X>>32-n)
          X<<n定義如下:拋棄最左邊的n位數(shù)字,將各個位依次向左移動n位,然后用0填補右邊的n位(最后結(jié)果還是
          32位)。X>>n是拋棄右邊的n位,將各個位依次向右移動n位,然后在左邊的n位填0。因此可以叫Sn(X)位循環(huán)
          移位運算
          3 SHA1算法描述
          在SHA1算法中,我們必須把原始消息(字符串,文件等)轉(zhuǎn)換成位字符串。SHA1算法只接受位作為輸入。假
          設(shè)我們對字符串“abc”產(chǎn)生消息摘要。首先,我們將它轉(zhuǎn)換成位字符串如下:
          01100001 01100010 01100011
          ―――――――――――――
          ‘a’=97 ‘b’=98 ‘c’=99
          這個位字符串的長度為24。下面我們需要5個步驟來計算MD5。
          3.1 補位
          消息必須進行補位,以使其長度在對512取模以后的余數(shù)是448。也就是說,(補位后的消息長度)%512 =
          448。即使長度已經(jīng)滿足對512取模后余數(shù)是448,補位也必須要進行。
          補位是這樣進行的:先補一個1,然后再補0,直到長度滿足對512取模后余數(shù)是448。總而言之,補位是至少
          補一位,最多補512位。還是以前面的“abc”為例顯示補位的過程。
          原始信息: 01100001 01100010 01100011
          補位第一步:01100001 01100010 01100011 1
          首先補一個“1”
          補位第二步:01100001 01100010 01100011 10…..0
          然后補423個“0”
          我們可以把最后補位完成后的數(shù)據(jù)用16進制寫成下面的樣子
          61626380 00000000 00000000 00000000
          00000000 00000000 00000000 00000000
          00000000 00000000 00000000 00000000
          00000000 00000000
          現(xiàn)在,數(shù)據(jù)的長度是448了,我們可以進行下一步操作。
          3.2 補長度
          所謂的補長度是將原始數(shù)據(jù)的長度補到已經(jīng)進行了補位操作的消息后面。通常用一個64位的數(shù)據(jù)來表示原始
          消息的長度。如果消息長度不大于2^64,那么第一個字就是0。在進行了補長度的操作以后,整個消息就變成
          下面這樣了(16進制格式)
          61626380 00000000 00000000 00000000
          00000000 00000000 00000000 00000000
          00000000 00000000 00000000 00000000
          00000000 00000000 00000000 00000018
          如果原始的消息長度超過了512,我們需要將它補成512的倍數(shù)。然后我們把整個消息分成一個一個512位的數(shù)
          據(jù)塊,分別處理每一個數(shù)據(jù)塊,從而得到消息摘要。
          3.3 使用的常量
          一系列的常量字K(0), K(1), ... , K(79),如果以16進制給出。它們?nèi)缦拢?br /> Kt = 0x5A827999 (0 <= t <= 19)
          Kt = 0x6ED9EBA1 (20 <= t <= 39)
          Kt = 0x8F1BBCDC (40 <= t <= 59)
          Kt = 0xCA62C1D6 (60 <= t <= 79).
          3.4 需要使用的函數(shù)
          在SHA1中我們需要一系列的函數(shù)。每個函數(shù)ft (0 <= t <= 79)都操作32位字B,C,D并且產(chǎn)生32位字作為輸
          出。ft(B,C,D)可以如下定義
          ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)
          ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
          ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)
          ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).
          3.5 計算消息摘要
          必須使用進行了補位和補長度后的消息來計算消息摘要。計算需要兩個緩沖區(qū),每個都由5個32位的字組成,
          還需要一個80個32位字的緩沖區(qū)。第一個5個字的緩沖區(qū)被標識為A,B,C,D,E。第一個5個字的緩沖區(qū)被標
          識為H0, H1, H2, H3, H4
          。80個字的緩沖區(qū)被標識為W0, W1,..., W79
          另外還需要一個一個字的TEMP緩沖區(qū)。
          為了產(chǎn)生消息摘要,在第4部分中定義的16個字的數(shù)據(jù)塊M1, M2,..., Mn
          會依次進行處理,處理每個數(shù)據(jù)塊Mi 包含80個步驟。
          在處理每個數(shù)據(jù)塊之前,緩沖區(qū) 被初始化為下面的值(16進制)
          H0 = 0x67452301
          H1 = 0xEFCDAB89
          H2 = 0x98BADCFE
          H3 = 0x10325476
          H4 = 0xC3D2E1F0.
          現(xiàn)在開始處理M1, M2, ... , Mn。為了處理 Mi,需要進行下面的步驟
          (1). 將 Mi 分成 16 個字 W0, W1, ... , W15, W0 是最左邊的字
          (2). 對于 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16).
          (3). 令 A = 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位的字符串,以下面的順序標識
          H0 H1 H2 H3 H4.
          對于SHA256,SHA384,SHA512。你也可以用相似的辦法來計算消息摘要。對消息進行補位的算法完全是一樣
          的。
          posted on 2010-11-22 14:30 WangShishuai 閱讀(708) 評論(0)  編輯  收藏 所屬分類: 加密算法

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 铁岭市| 旬阳县| 政和县| 西和县| 庆城县| 南溪县| 望谟县| 葫芦岛市| 海盐县| 广东省| 边坝县| 嘉兴市| 长白| 凌源市| 宜黄县| 新昌县| 高密市| 揭东县| 平乐县| 南宁市| 湘阴县| 延津县| 吉安县| 山阴县| 栾城县| 梁平县| 南丹县| 治县。| 樟树市| 温泉县| 项城市| 萝北县| 内丘县| 郓城县| 天气| 新沂市| 托克逊县| 沂水县| 天全县| 比如县| 苗栗县|