導航:首頁 > 源碼編譯 > 正則散列演算法

正則散列演算法

發布時間:2022-05-29 09:23:46

① 什麼是安全散列演算法SHA256

安全散列演算法SHA(Secure Hash Algorithm)是美國國家安全局 (NSA) 設計,美國國家標准與技術研究院(NIST) 發布的一系列密碼散列函數,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等變體。主要適用於數字簽名標准(DigitalSignature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。下面以 SHA-1為例,介紹該演算法計算消息摘要的原理。
對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。當接收到消息的時候,這個消息摘要可以用來驗證數據的完整性。在傳輸的過程中,數據很可能會發生變化,那麼這時候就會產生不同的消息摘要。
SHA1有如下特性:不可以從消息摘要中復原信息;兩個不同的消息不會產生同樣的消息摘要。
一、術語和概念
(一)位(Bit),位元組(Byte)和字(Word)
SHA1始終把消息當成一個位(bit)字元串來處理。本文中,一個「字」(Word)是32位,而一個「位元組」(Byte)是8位。比如,字元串「abc」可以被轉換成一個位字元串:01100001 01100010 01100011。它也可以被表示成16進制字元串:0x616263.
(二)運算符和符號
下面的邏輯運算符都被運用於「字」(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位,然後用0填補右邊的n位(最後結果還是32位)。X>>n是拋棄右邊的n位,將各個位依次向右移動n位,然後在左邊的n位填0。因此可以叫Sn(X)位循環移位運算
二、SHA1演算法描述
在SHA1演算法中,我們必須把原始消息(字元串,文件等)轉換成位字元串。SHA1演算法只接受位作為輸入。假設我們對字元串「abc」產生消息摘要。首先,我們將它轉換成位字元串如下:
01100001 0110001001100011
―――――――――――――
『a』=97 『b』=98『c』=99
這個位字元串的長度為24。下面我們需要5個步驟來計算MD5。
(一)補位
消息必須進行補位,以使其長度在對512取模以後的余數是448。也就是說,(補位後的消息長度)%512 = 448。即使長度已經滿足對512取模後余數是448,補位也必須要進行。
補位是這樣進行的:先補一個1,然後再補0,直到長度滿足對512取模後余數是448。總而言之,補位是至少補一位,最多補512位。還是以前面的「abc」為例顯示補位的過程。
原始信息:01100001 01100010 01100011
補位第一步:0110000101100010 01100011 1
首先補一個「1」
補位第二步:0110000101100010 01100011 10…..0
然後補423個「0」
我們可以把最後補位完成後的數據用16進制寫成下面的樣子
61626380 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 00000000
現在,數據的長度是448了,我們可以進行下一步操作。
(二)補長度
所謂的補長度是將原始數據的長度補到已經進行了補位操作的消息後面。通常用一個64位的數據來表示原始消息的長度。如果消息長度不大於2^64,那麼第一個字就是0。在進行了補長度的操作以後,整個消息就變成下面這樣了(16進制格式)
61626380 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000018
如果原始的消息長度超過了512,我們需要將它補成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 ANDC) or ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR CXOR D (20 <= t <= 39)
ft(B,C,D) = (B ANDC) or (B AND D) or (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR CXOR D (60 <= t <= 79).
(五)計算消息摘要
必須使用進行了補位和補長度後的消息來計算消息摘要。計算需要兩個緩沖區,每個都由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個步驟。
在處理每個數據塊之前,緩沖區{Hi} 被初始化為下面的值(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-8XOR 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。你也可以用相似的辦法來計算消息摘要。對消息進行補位的演算法完全是一樣的。
三、SHA演算法被破解了嗎?
2013年9月10日美國約翰霍普金斯大學的計算機科學教授,知名的加密演算法專家,Matthew Green被NSA要求刪除他的一份關於破解加密演算法的與NSA有關的博客。 同時約翰霍普金斯大學伺服器上的該博客鏡像也被要求刪除。

加密演算法專家,美國約翰霍普金斯大學教授Matthew Green
但當記者向該大學求證時,該校稱從未收到來自NSA的要求要刪除博客或鏡像的資料,但記者卻無法在原網址再找到該博客。幸運的是,從谷歌的緩存可以找到該博客。該博客提到NSA每年花費2.5億美元來為自己在解密信息方面獲取優勢,並列舉了NSA的一系列見不得人的做法。

在BitcoinTalk上,已經掀起了一輪爭論:到底SHA-2是否安全?
部分認為不安全的觀點包括:
NSA製造了sha-2, 我們不相信NSA,他們不可能不留後門。
棱鏡事件已經明白的告訴我們,政府會用一切可能的手段來監視與解密。
雖然有很多人會研究SHA-2,且目前沒有公開的證據表明有漏洞。但沒有公開這並不能代表就沒有,因為發現漏洞的人一定更傾向於保留這個秘密來自己利用,而不是公布。
部分認為安全的觀點包括:
SHA-2是應用廣泛的演算法,應該已經經歷了實踐的檢驗。
美國的對頭中國和俄國都有很多傑出的數學家,如果有問題的話,他們肯定已經發現了。
如果真的不安全,世界上安全的東西就太少了,我不能生活在提心吊膽里,所以我選擇相信安全。

② 散列演算法的演算法思想

我也只能說說思想

散列演算法的演算法就是爭取一個蘿卜一個坑的原則

比如說有5個數 12,25,30,45,50,這幾個數有個規律,就是十位數都不相同,

如果我設置一個散列函數f(value)=value/10;平常的時候,我們查找50,要比較

5次(其他演算法可能不同),這里用散列演算法只需要1次,就是解散列函數,key=50/10

=5,要找的數就在第5個位子.但是上面問題還是很多的,比如說查找55呢?就會出

錯<因為55解散列函數之後,也是在第5個位子>,還有等等等問題,很顯然這個是我

散列函數沒設置好,當你把散列函數設置好了後,由於數據的龐大,沖突很有可能

產生,那麼就需要我們來處理沖突了,所以寫散列演算法就是設置好的散列函數和

處理沖突的過程.這里散列演算法涉及的查找就跟查找的數量無關,跟沖突率有直接

的關系

③ 常用的散列函數有哪些

常用的哈希函數

通用的哈希函數庫有下面這些混合了加法和一位操作的字元串哈希演算法。下面的這些演算法在用法和功能方面各有不同,但是都可以作為學習哈希演算法的實現的例子。(其他版本代碼實現見下載)

1.RS

從RobertSedgwicks的Algorithms in C一書中得到了。我(原文作者)已經添加了一些簡單的優化的演算法,以加快其散列過程。

[java]view plainprint?

④ 散列演算法可以做哪些事

查找並判斷狀態是否出現過,出現過幾次
比如說一個物品a有四個特徵,為a[1],a[2],a[3],a[4]
那麼令f(a)=a[1]*(p^1)+a[2]*(p^2)+a[3]*(p^3)+a[4]*(p^4)
hash[f(a)]=a;
若又有一個物品b,特徵b[1],b[2],b[3],b[4]
f(b)=b[1]*(p^1)+b[2]*(p^2)+b[3]*(p^3)+b[4]*(p^4)
那麼a=b時,f(a)=f(b)
反過來f(a)=f(b)時,a很有可能等於b (只要p設定的足夠大,a不等於b的幾率也很小)
為了節省內存,我們可以讓f(a)=f(a)%q;
這樣hash數組只需要開q的大小
就算在mod了之後a不等於b的概率也是非常小的(所以出題人一般不怎麼能卡Hash,反而還天天考Hash)
像這樣一個題:
有n個圖,每個圖都有m個點,有一些帶權的邊,詢問每個圖中的u點能否都不經過權值小於w的邊到達v點(n*m<=200000,邊數<=300000)
首先,你可以dfs,O(n*m)可以過,
但是如果改成q<=200000次詢問,你就不能dfs了
實際上對於一個詢問,當權值大於等於w的邊全部放完之後就轉化為判斷此時uv是否都聯通,
所以我們考慮離線,將詢問按w從大到小,邊也是按權值從大到小,邊放邊,邊判斷聯通,
動態判斷聯通可以用並查集的按大小啟發式合並,id[i][k]表示在第i個圖中k所在並查集的頭,
i圖中u,v聯通等價於id[i][u]==id[i][v](表示第i個圖,需要枚舉n次)。所以可以枚舉i判斷是不是都聯通,總復雜度=O(邊數 * log2(n*m) +邊數 * n)log2(n*m)為啟發式合並的時間復雜度。最後一個n為枚舉i的耗費,如果n>500這方法就炸了,想辦法優化,這時候就可以用哈希。
設f(u)=id[1][u]*(p^1)+id[2][u]*(p^2)+...+id[n][u]*(p^n) % q
如果id[i][u]=id[i][v](i=1~n) 則f(u)==f(v)
如果f(u)==f(v)則很大可能 id[i][u]=id[i][v](i=1~n)
令Hash[u]=f(u)
則在每次修改id[i][u]時順便O(1)修改Hash(u)即可O(1)查詢,判斷Hash[u]是否等於Hash[v].
這樣時間復雜度優化為O(邊數*log2(n*m)+邊數)是一個非常優秀的演算法,散列的魅力就在於此,空間換時間,效率高,比賽時只要p和q設的大一些,一些考演算法的題可以水個八九十分,還特別好寫,不會寫炸。

⑤ 哈希的演算法是什麼

哈希演算法是一個廣義的演算法,也可以認為是一種思想,使用Hash演算法可以提高存儲空間的利用率,可以提高數據的查詢效率,也可以做數字簽名來保障數據傳遞的安全性。所以Hash演算法被廣泛地應用在互聯網應用中。

哈希演算法也被稱為散列演算法,Hash演算法雖然被稱為演算法,但實際上它更像是一種思想。Hash演算法沒有一個固定的公式,只要符合散列思想的演算法都可以被稱為是Hash演算法。

特點:

加密哈希跟普通哈希的區別就是安全性,一般原則是只要一種哈希演算法出現過碰撞,就會不被推薦成為加密哈希了,只有安全度高的哈希演算法才能用作加密哈希。

同時加密哈希其實也能當普通哈希來用,Git 版本控制工具就是用 SHA-1 這個加密哈希演算法來做完整性校驗的。一般來講越安全的哈希演算法,處理速度也就越慢,所以並不是所有的場合都適合用加密哈希來替代普通哈希。



⑥ 一個安全的散列演算法需要具備哪些屬性

一個安全的散列演算法需要具備的屬性:
1、能對抗野蠻的攻擊,能夠抵禦窮舉法的攻勢。
2、具有無限定義域,如任意長度的位元組字元串和有限的值域或者固定長度的比特串。
3、具備應用的多樣性,對於給定的散列值,沒有實用的方法可以計算出一個原始輸入,也就是說很難偽造。
4、能夠因為環境因素的變化,如機器配置或者IP地址的改變而有變動。以保證源文件的安全性。
5、方便錯誤監測和修復函數。當散列函數被用於校驗和的時候可以用相對較短的散列值來驗證任意長度的數據是否被更改過。
6、安全散列演算法接受的輸入文檔小於2的64次方 位,產生160位的報文摘要。該演算法實際的目標使得找出一個能夠匹配給定的散列值的文本是不可能的計算。

⑦ 散列演算法的概念

在信息安全技術中,經常需要驗證消息的完整性,散列(Hash)函數提供了這一服務,它對不同長度的輸入消息,產生固定長度的輸出。這個固定長度的輸出稱為原輸入消息的「散列」或「消息摘要」(Message digest)。一個安全的哈希函數H必須具有以下屬性:
l)H能夠應用到大小不一的數據上。
2)H能夠生成大小固定的輸出。
3)對於任意給定的x,H(x)的計算相對簡單。
4)對於任意給定的代碼h,要發現滿足H(x)=h的x在計算上是不可行的。
5) 對於任意給定的塊x,要發現滿足H(y)=H(x)而y=x在計算上是不可行的。
6)要發現滿足H(X)=H(y)的(X,y)對在計算上是不可行的

⑧ 單向散列演算法的介紹

單向散列演算法,又稱hash函數,Hash函數(也稱雜湊函數或雜湊演算法)就是把任意長的輸入消息串變化成固定長的輸出串的一種函數。這個輸出串稱為該消息的雜湊值。一般用於產生消息摘要,密鑰加密等。

⑨ 什麼是散列法

散列法(Hashing)或哈希法是一種將字元組成的字元串轉換為固定長度(一般是更短長度)的數值或索引值的方法,稱為散列法,也叫哈希法。由於通過更短的哈希值比用原始值進行資料庫搜索更快,這種方法一般用來在資料庫中建立索引並進行搜索,同時還用在各種解密演算法中。

⑩ 散列法的散列演算法

也稱為哈希函數——哈希的英文意思為「無用信息」,因此哈希函數一詞的由來可能是因為最終形成的哈希表裡面是各種看起來毫無意義的描述值的混合。除用來快速搜索數據外,散列法還用來完成簽名的加密解密工作,這種簽名可以用來對收發消息時的用戶簽名進行鑒權。先用哈希函數對數據簽名進行轉換,然後將數字簽名本身和轉換後的信息摘要分別獨立的發送給接收人。通過利用和發送人一樣的哈希函數,接收人可以從數字簽名獲得一個信息摘要,然後將此摘要同傳送過來的摘要進行比較,這兩個值相等則表示數字簽名有效。
利用哈希函數對資料庫中的原始值建立索引,以後每獲取一次數據時都要利用哈希函數進行重新轉換。因此,哈希函數始終是單向操作。沒有必要通過分析哈希值來試圖逆推哈希函數。實際上,一個典型的哈希函數是不可能逆推出來的。好的哈希函數還應該避免對於不同輸入產生相同的哈希值的情況發生。如果產生了哈希值相同的情況,稱為沖突。可接受的哈希函數應該將沖突情況的可能性降到非常小。

閱讀全文

與正則散列演算法相關的資料

熱點內容
javaoa開發 瀏覽:875
單片機的用途和使用方法 瀏覽:944
程序員在新公司上班 瀏覽:430
發信如何設置伺服器 瀏覽:77
源代碼查詢加密數字 瀏覽:605
附帶編譯 瀏覽:108
海康螢石雲app怎麼回放 瀏覽:404
寫一個編譯器怎麼寫 瀏覽:285
單片機蜂鳴器發聲原理 瀏覽:137
程序員那麼可愛陸離跳水是哪集 瀏覽:17
如何製作cdn伺服器 瀏覽:111
寫java加密程序 瀏覽:659
菜鳥數據分析pdf 瀏覽:291
單片機做實用東西 瀏覽:651
我的世界最強斗羅伺服器怎麼覺醒武魂 瀏覽:931
密友圈app怎麼切換用戶登錄 瀏覽:217
我把程序員當愛豆追 瀏覽:978
android判斷電話接通 瀏覽:646
大孔文件夾 瀏覽:785
反詐騙app在哪裡下載 瀏覽:527