SHA1演算法原理

2021-05-04 01:25:14 字數 3998 閱讀 5646

1 sha1演算法簡介

安全雜湊演算法(secure hash algorithm)主要適用於數字簽名標準(digital signature standard dss)裡面定義的數字簽名演算法(digital signature algorithm dsa)。對於長度小於2^64位的訊息,sha1會產生乙個160位的訊息摘要。當接收到訊息的時候,這個訊息摘要可以用來驗證資料的完整性。在傳輸的過程中,資料很可能會發生變化,那麼這時候就會產生不同的訊息摘要。

sha1有如下特性:不可以從訊息摘要中復原資訊;兩個不同的訊息不會產生同樣的訊息摘要。

2 術語和概念

2.1位(bit),位元組(byte)和字(word)

sha1始終把訊息當成乙個位(bit)字串來處理。本文中,乙個「字」(word)是32位,而乙個「位元組」(byte)是8位。比如,字串「abc」可以被轉換成乙個位字串: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 代表兩個整數 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<>n是拋棄右邊的n位,將各個位依次向右移動n位,然後在左邊的n位填0。因此可以叫sn(x)位迴圈移位運算

3 sha1演算法描述

在sha1演算法中,我們必須把原始訊息(字串,檔案等)轉換成位字串。sha1演算法只接受位作為輸入。假設我們對字串「abc」產生訊息摘要。首先,我們將它轉換成位字串如下:

01100001 01100010 01100011

『a』=97   『b』=98   『c』=99

這個位字串的長度為24。下面我們需要5個步驟來計算md5。

3.1 補位

訊息必須進行補位,以使其長度在對512取模以後的餘數是448。也就是說,(補位後的訊息長度)%512 = 448。即使長度已經滿足對512取模後餘數是448,補位也必須要進行。

補位是這樣進行的:先補乙個1,然後再補0,直到長度滿足對512取模後餘數是448。總而言之,補位是至少補一位,最多補512位。還是以前面的「abc」為例顯示補位的過程。

原始資訊: 01100001 01100010 01100011

補位第一步:01100001 01100010 01100011 1

首先補乙個「1」

補位第二步:01100001 01100010 01100011 10…..0

然後補423個「0」

我們可以把最後補位完成後的資料用16進製制寫成下面的樣子

61626380 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000

現在,資料的長度是448了,我們可以進行下一步操作。

3.2 補長度

所謂的補長度是將原始資料的長度補到已經進行了補位操作的訊息後面。通常用乙個64位的資料來表示原始訊息的長度。如果訊息長度不大於2^64,那麼第乙個字就是0。在進行了補長度的操作以後,整個訊息就變成下面這樣了(16進製制格式)

61626380 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000018

如果原始的訊息長度超過了512,我們需要將它補成512的倍數。然後我們把整個訊息分成乙個乙個512位的資料塊,分別處理每乙個資料塊,從而得到訊息摘要。

3.3 使用的常量

一系列的常量字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).

3.4 需要使用的函式

在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).

3.5 計算訊息摘要

必須使用進行了補位和補長度後的訊息來計算訊息摘要。計算需要兩個緩衝區,每個都由5個32位的字組成,還需要乙個80個32位字的緩衝區。第乙個5個字的緩衝區被標識為a,b,c,d,e。第乙個5個字的緩衝區被標識為h0, h1, h2, h3, h4

。80個字的緩衝區被標識為w0, w1,..., w79

另外還需要乙個乙個字的temp緩衝區。

為了產生訊息摘要,在第4部分中定義的16個字的資料塊m1, m2,..., mn

會依次進行處理,處理每個資料塊mi 包含80個步驟。

在處理每個資料塊之前,緩衝區 被初始化為下面的值(16進製制)

h0 = 0x67452301

h1 = 0xefcdab89

h2 = 0x98badcfe

h3 = 0x10325476

h4 = 0xc3d2e1f0.

現在開始處理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,執行下面的迴圈

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。你也可以用相似的辦法來計算訊息摘要。對訊息進行補位的演算法完全是一樣的。

4 參考文獻

SHA1 摘要演算法

sha1 演算法 訊息摘要演算法,把訊息按照512 bits進行分組,不斷的對5個int型變數進行計算,直到所有訊息都運算完畢。最終得到 160 bit 即 20 位元組的雜湊值。流程圖 c語言實現 用到的資料結構 sha1演算法的上下文,儲存一些狀態,中間資料,結果 typedef struct ...

Sha 1演算法詳解

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

SHA 1摘要演算法原始碼

public class sha1 摘要資料儲存陣列 private int digestint new int 5 計算過程中的臨時資料儲存陣列 private int tmpdata new int 80 計算sha 1摘要 private int process input bytes byt...