安全體系(三) SHA1演算法詳解

2021-08-07 19:39:21 字數 4913 閱讀 9861

目錄

正文本文主要講述使用sha1演算法計算資訊摘要的過程。

安全體系(零)—— 加解密演算法、訊息摘要、訊息認證技術、數字簽名與公鑰證書

安全體系(一)—— des演算法詳解

安全體系(二)——rsa演算法詳解

為保證傳輸資訊的安全,除了對資訊加密外,還需要對資訊進行認證。認證的目的有兩:一是驗證資訊的傳送者是合法的,二是驗證資訊的完整性。hash函式就是進行資訊認證的一種有效手段。

回到頂部

hash函式也稱為雜湊函式或雜湊函式,函式輸入為一可變長度x,輸出為一固定長度串,該串被稱為輸入x的hash值或數字指紋。

因為hash函式是多對一函式,不同的輸入對應著相同的輸出,求其逆是比較難,通過給定的輸入計算hash值必須是很容易,但從hash值逆推輸入則很難,因此也稱hash函式為單向hash函式。

hash函式一般滿足以下幾個基本需求:

1).輸入x可以任意長度

2).輸出資料長度固定

3).容易計算,給定任何x,容易計算出x的hash值

4).單向函式,即給出乙個hash值,很難反向計算出原始輸入的x

5).唯一性,即難以找出兩個不同的輸入會得到相同的hash輸出值

hash值得長度由演算法的型別決定,與輸入的訊息大小無關,一般為128bit或者160bit,即使兩個訊息的差別很小,如僅差別一兩位,其hash函式的運算結果也會截然不同,用同乙個演算法對某一訊息進行hash運算只能獲得唯一確定的hash值。

乙個安全的單向迭代函式是構造安全訊息hash值得核心和基礎,有了好的單向迭代函式,就可以用合適的迭代方法來構造迭代hash函式,hash函式的安全設計的理論主要有以下兩點:一是函式的單向性,二是函式影射的隨機性。常見的hash演算法有md-5、sha等。

回到頂部

sha(security hash algorithm)是美國的nist和nsa設計的一種標準的hash演算法,最初的版本於93年發表,稱為sha-0,因為很快就被發現存在安全隱患,於是在95年就發布第二個版本sha-1。02年,nist分別發布了sha-256、sha-384、sha-512,這些演算法統稱sha-2。08年又新增了sha-224。目前sha-2各版本已成為主流。

這裡以sha1為例來進行sha演算法的講解,其他系列原理類似。sha1的特性有:

1).不能使用訊息摘要復原資訊;

2).不同的訊息產生不同的訊息摘要。

回到頂部

sha1把訊息當做位(bit)字串進行處理。最小單位稱為位,8位組成乙個位元組,兩個位元組組成乙個字。

例如,字串「abc」轉換成位字串是01100001 01100010 01100011,轉換成16進製制字串是 0x616263。

下面的邏輯運算子作用於「字」

x^y    = x, y邏輯與

x \/ y   = x, y邏輯或

x xor y= x, y邏輯異或

~x     =   x邏輯取反

x+y的定義:字 x 和 y 代表兩個整數 x 和y, 其中 0 <= x < 2^32 且 0 <= y < 2^32. 令整數z = (x + y) mod 2^32. 這時候 0 <= z < 2^32. 將z轉換成字z, 那麼就是 z = x + y.

迴圈左移位操作符sn(x):x是乙個字,n是乙個整數,0<=n<=32。sn(x) = (x<>32-n)。這個很容易理解了,比如x=11111111 00000001 00000001 00000000,n=5,則sn(x)=11100000001 00000001 00000000 11111。

x>n定義:拋棄右邊的n位,將各個位依次向右移動n位,然後在左邊的n位填0。

回到頂部

因為sha1演算法只接受位作為輸入,所以進行計算前必須把原始訊息(比如字串、檔案等)轉換成位字串。

比如,對字串「abc」產生訊息摘要,『a』=97   『b』=98   『c』=99,先轉換成24位的字串:01100001 01100010 01100011

訊息必須進行補位,使其長度在對512取模以後的餘數是448,即(補位後的訊息長度)%512 = 448。

對訊息進行補位時,先在後面補乙個1,如果不滿足要求,再補0直到滿足對512取模餘數為448。這就意味著,補位至少補一位(原訊息位數為512n+447),最多補512位(原訊息位數為512n+448)。

還是以前面的「abc」為例顯示補位的過程:

原始資訊: 01100001 01100010 01100011

補位第一步,首先補乙個1:01100001 01100010 011000111

可以確定的是,如果用乙個位元組來表示乙個字元,補1之後肯定不滿足條件,仍需繼續補位。

補位第二步,後面補0直到總長度對512取模餘數為448,這裡補423個0,使總長度達到為448:

01100001 01100010 01100011

1000…..00

補位完成後的資料轉換為16進製制:

616263

80 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000

從16進製制資料裡可以看到,我們也可以直接採用16進製制的方式進行補位,我們先補80,看是否滿足長度對64取餘的結果為56,不滿足則繼續補0。

大家可以自己考慮一下為什麼可以補80。

4.3 附加長度資訊

這一步中,要將原始訊息(沒有進行補位操作之前)的長度(二進位制位數)附加到已經補位的訊息之後。

通常用乙個64位的資料來表示原始訊息的長度。如果訊息長度不大於2^64,那麼第乙個字就是0。

補長度的操作以後,整個訊息(16進製制)如下:

616263

80 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000

00000000 00000018

然後,將整個訊息拆分為乙個乙個的512位的資料塊m1,m2,…,mn,然後分別對每乙個資料塊mi (1≤i≤n)做處理,得到訊息摘要。

注意,這裡是64位,上一步補位後的長度是512k+448,k≥0,這樣,512k+448+64=512(k+1),恰好可以被512整除。

在我們舉得例子裡,一共只有512位,因此做為乙個資料塊進行處理。

一系列的常量字k(0), k(1), ... , k(79),如果以16進製制給出,它們如下:

kt = 0x5a827999  (0 <= t <= 19)

kt = 0x6ed9eba1 (20 <= t <= 39)

kt = 0x8f1bbcdc (40 <= t <= 59)

kt = 0xca62c1d6 (60 <= t <= 79)

在sha1中我們需要一系列的函式。每個函式ft (0 <= t <= 79)都操作32位字b,c,d並且產生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)

使用進行了補位和補長度後的訊息來計算訊息摘要。

計算需要的緩衝區:

1).兩個都由5個32位的字組成緩衝區buf1和buf2, buf1的5個32位緩衝區被標識為a,b,c,d,e,buf2的5個32位緩衝區被標識為h0,h1,h2,h3,h4。

2).乙個80個32位字的緩衝區buf3,按照32位劃分,依次被標識為w0, w1,..., w79。

3).乙個1個字的temp緩衝區。

計算訊息摘要:

在3.2中,我們把補位之後的資料附加了長度資訊,然後劃分為乙個乙個的512位(16個字)的資料塊m1,m2,…,mn,這裡會依次對每個資料塊mi (1≤i≤n)做處理。

在處理每個資料塊mi (1≤i≤n)之前,先將緩衝區h0,h1,h2,h3,h4 初始化為下面的值(16進製制):

h0 = 0x67452301

h1 = 0xefcdab89

h2 = 0x98badcfe

h3 = 0x10325476

h4 = 0xc3d2e1f0.

接下來處理 mi(1≤i≤n),步驟如下:

1). 將每個mi 分成 16 個字(每個字32位) w0, w1, ... , w15,  w0 是最左邊的字;

n個mi就劃分之後,就變成w0,w1,…,w15,w16,…,w31,w32,…w79;

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,執行下面的迴圈

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. 

在處理完所有的  mi(1≤i≤n) 後,會得到乙個160位(5個32位字)的字串訊息摘要h0 h1 h2 h3 h4

Sha 1演算法詳解

一 hash函式和訊息完整性 二 常見的hash函式 三 sha 1演算法實現的基本步驟 1 將訊息摘要轉換成位字串 01100001 01100010 01100011 2 對轉換後的位字串進行補位操作 初始的資訊摘要 01100001 01100010 01100011 第一步補位 011000...

SHA1演算法實現及詳解

1 sha1演算法簡介 安全雜湊演算法 secure hash algorithm 主要適用於數字簽名標準 digital signature standard dss 裡面定義的數字簽名演算法 digital signature algorithm dsa 對於長度小於2 64位的訊息,sha1會...

安全體系(二) RSA演算法詳解

正文 本文主要講述rsa演算法使用的基本數學知識 秘鑰的計算過程以及加密和解密的過程。安全體系 零 加解密演算法 訊息摘要 訊息認證技術 數字簽名與公鑰證書 安全體系 一 des演算法詳解 安全體系 三 sha1演算法詳解 回到頂部 rsa公鑰加密演算法是1977年由羅納德 李維斯特 ron riv...