雜湊函式sha-1(secure hash algorithm 1)由美國****局於2023年首次發布,對輸入訊息生成160位的訊息摘要,廣泛應用於數字簽名等諸多領域。後來隨著密碼分析人員的研究,發現其存在缺陷並可被實施攻擊,逐漸被更安全的sha-2或sha-3代替。
儘管被拋棄,但是由於其曾經廣泛的使用,存留的很多軟體系統無法短期內完全公升級,所以未來很長一段時間,仍然會看到sha-1的身影,例如開發人員經常使用的版本管理軟體git,每次提交**的commit id 就是使用sha-1來計算的。
雜湊函式的演算法實現,高階程式語言通常都會封裝,供開發人員直接呼叫,一般無需了解其詳細計算過程,其運算邏輯和程式編碼並不難實現,難點在於理解演算法的設計思想,需要具備深厚的數學、密碼學背景才可能理解。
下面以訊息abc為例,逐步解說其計算過程。
取反按位與
按位或異或
左移迴圈左移
迴圈右移
相加模
原始訊息轉為二進位制
a 二進位制 01100001
b 二進位制 01100010
c 二進位制 01100011
對訊息分組,每組512位長度
abc 的二進位制總長度24位,不夠512位,需要補位
補位步驟:
1. 先在abc後面補1
2. 規定末尾64位表示原始訊息的長度
abc的二進位制長度為24,24的二進位制為11000,
末尾就是
3. 中間剩下423個空位全部補0
( 3x8 ) + 1 + 423 + 64 = 512
這樣補位後總長度為512位,剛好湊足1組。
補位完畢,此時訊息為:
補位規則:
補位後的長度為512的整數倍。
如果訊息長度為447,補1後,剛好448,此時不需要補0,直接補末尾64位即可,訊息被分為1組。
如果訊息長度為448,補1後,達到449位,這個時候第1組剩下63位,不夠64位,就需要補63位0,再繼續補448個0,最後補64位訊息長度,訊息被分為2組。
本例只分了一組,如果訊息被分為多組,記為
將按32位切割為16組,標記為
現在已經有到
還需要生成到
生成函式:(向左滑動檢視全部公式)
函式的定義:
按照上面的函式最終生成塊到共組
設定初始雜湊值
這5個初始雜湊值是演算法設定不變的,
僅用於第一組訊息的處理,
處理後續分組的時候使用前一組計算的結果;
定義5個臨時變數並賦值
然後開始80輪的迴圈計算(輪次用t表示)
演算法邏輯圖
常數定義
函式定義
以第一輪計算舉例(t為臨時變數):
可以看到,主要的變化是對下一輪a的計算,
其他幾個變數都是上一輪變數的重新賦值,
以上步驟迴圈計算80輪,最後把的結果和其初始值執行+運算
依次順序拼接就是的雜湊值;
如果有分組將的結果作為的初始雜湊值繼續計算。
雜湊函式的種類很多,但同型別的函式計算過程都有相似的步驟,熟悉其中一種,有助於理解其他函式的計算過程,同時對於從事資訊保安的人員來說,有助於理解相關攻擊方法的原理,比如長度擴充套件攻擊等。
參考文獻
[1]
[2]
[3]
二進位制處理函式
unsigned const stat zero 0x0008 unsigned const stat one 0x0002 unsigned const stat two 0x0004 unsigned const stat three 0x0008 檢測位有1位是1就返回true templat...
二進位制詳解
在計算機的世界裡,只有0和1,也就是二進位制。那如何把乙個十進位制的數轉成二進位制或者其他進製,請下圖 十進位制轉二進位制 十進位制的123轉成二進位制就是1111011,轉成幾進製都是乙個道理。一 二進位制 1.1 二進位制是計算機採用的表示數字的方式,每個數字上只有0和1 1.2 任何整數一定可...
倒水 二進位制 lowbit函式
p1582 倒水,傳送門 題目描述 一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。不能丟棄有水的瓶子 顯然在某些情況下cc無法達...