演算法基礎(md5演算法)
hash演算法有兩種,即sha-1和md5演算法這裡先介紹md5演算法.
md5產生乙個128位的hash值,在經過一寫初始樹立後,將明文分成了512位的塊,再將每一塊分成16個32位的子塊。演算法的輸出是4個32位的塊,連線起來構成128位的hash值。
首先,將訊息填充到比512的倍數少64位,填充時先向訊息末尾填乙個1,然後再填滿0,然後後面再加上乙個64位的訊息長度的表示(不包括填充位)。這兩步使訊息長度恰好是512的倍數,同時保證不同訊息在填充後仍不相同。
初始化4個32位變數:
a=0x01234567
b=0x89abcdef
c=0xfedcba98
d=0x76543210
這些變數成為鏈變數。
然後,開始演算法的主迴圈。這個迴圈對訊息中所有的塊都執行一次。將4個變數複製到不同的變數:a值為a,b值為b,c值為c,d值為d。
主迴圈有4圈,都很相似。每圈使用乙個不同的操作,重複16次。每個操作完成乙個a,b,c和d中三個變數的非線性函式。然後,將結果與第四個變數、文字的乙個子塊和乙個常數相加。然後,將結果混換左移乙個可變值的位數,再將結果與a,b,c和d之一相加。最後用結果來代替a,b,c和d之一。
共有4個非線性函式,每次操作使用乙個,每圈都不相同。
f(x,y,z)=(x∧y)∨((「x)∧z)
g(x,y,z)=(x∧z)∨(y∧(「z))
h(x,y,z)=x㈩y㈩z
i(x,y,z)=y㈩(x∧(「z))
㈩為異或,∧為與,∨為或,「為非
如果mi代表訊息的第i個子塊(0到15),而<<
第一圈:
ff(d,a,b,c,m1,12,0xe8c7b756)
ff(c,d,a,b,m2,17,0x242070db)
ff(b,c,d,a,m3,22,0xclbdceee)
ff(a,b,c,d,m4,7,0xf57c0faf)
ff(d,a,b,c,m5,12,0x4787c62a)
ff(c,d,a,b,m6,17,0xa8304613)
ff(b,c,d,a,m7,22,0xfd469501)
ff(a,b,c,d,m8,7,0x698098d8)
ff(d,a,b,c,m9,12,0x8b44f7af)
ff(c,d,a,b,m10,17,0xffff5bb1)
ff(b,c,d,a,m11,22,0x895cd7be)
ff(a,b,c,d,m12,7,0xf6b901122)
ff(d,a,b,c,m13,12,0xfd987193)
ff(c,d,a,b,m14,17,0xa6794383)
ff(b,c,d,a,m15,22,0x49b40821)
第二圈:
gg(a,b,c,d,m1,5,0xf61e2562)
gg(d,a,b,c,m6,9,0xc040b340)
gg(c,d,a,b,m11,14,0x2b5e5a51)
gg(b,c,d,a,m0,20,0xe9b6c7aa)
gg(a,b,c,d,m5,5,0xd62f105d)
gg(d,a,b,c,m10,9,0x02441453)
gg(c,d,a,b,m15,14,0xd8ale681)
gg(b,c,d,a,m4,20,0xe7d3fbc8)
gg(a,b,c,d,m9,5,0x21elcde6)
gg(d,a,b,c,m14,9.0xc33707d6)
gg(c,d,a,b,m3,14,0xf4d50d87)
gg(b,c,d,a,m8,20,0x45al4ed)
gg(a,b,c,d,m13,5,0xa9e3e905)
gg(d,a,b,c,m2,9,0xfcefaef8)
gg(c,d,a,b,m7,14,0x676f02d9)
gg(b,c,d,a,m12,20,0x8d2a4c8a)
第三圈:
hh(a,b,c,d,m5,4,0xfffa3942)
hh(d,a,b,c,m8,11,0x8771f681)
hh(c,d,a,b,m11,16,0x6d9d6122)
hh(b,c,d,a,m14,23,0xfde5380c)
hh(a,b,c,d,m1,4,0xa4beea44)
hh(d,a,b,c,m4,11,0x4bdecfa9)
hh(c,d,a,b,m7,16,0xf6bb4b60)
hh(b,c,d,a,m10,23,0xbebfbc70)
hh(a,b,c,d,m13,4,0x28967ec6)
hh(d,a,b,c,m0,11,0xeaa127fa)
hh(c,d,a,b,m3,16,0xd4ef3085)
hh(b,c,d,a,m6,23,0x04881d05)
hh(a,b,c,d,m9,4,0xd9d4d039)
hh(d,a,b,c,m12,11,0xe6db99e5)
hh(c,d,a,b,m15,16,0xlfa27cf8)
hh(b,c,d,a,m2,23,0xc4ac5665)
這些常數ti步,ti為2的32次方乘abs(sin(i))的整數部分,其中i為弧度。
完成這些之後,a,b,c,d與a,b,c,d相加,演算法開始處理下一塊。最後的輸出結果為a,b,c,d相連線。
對md5的密碼分析表明,md5還是比較安全的。
演算法基礎 排序演算法
1.氣泡排序 原理有一列資料,從第乙個數開始,第乙個和第二個進行比較,如果第乙個大就交換,如果第二個大就不變,再第二個和第三個比較,一次類推,第二輪是從第乙個數開始比到倒數第二個數,第三輪是從第乙個數比到倒數第三個數.以此類推.def bubble nums for j in range len n...
演算法基礎 Hash演算法
hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊...
演算法基礎 遞迴演算法
遞迴演算法是將重複問題分解為同類的子問題而解決問題的方法,其核心思想是分治策略。簡單來說就是自己呼叫自己。直到達到退出遞迴的條件,則完成遞迴。1 找整個遞迴的終止條件 遞迴應該在什麼時候結束?3 本級遞迴應該做什麼 在這一級遞迴中,應該完成什麼任務?優點 遞迴的核心思想就是將乙個大問題,拆解成乙個小...