在我之前的文章中理了一下sha-256演算法的實現過程:
為什麼要對其改進呢?
先來看一下如何加密防刷:使用sha-256可以針對原始檔生成加密key,為乙個256位二進位制格式,表述為64位16進製制的字串格式,可以用於對網路鏈結中的核心引數進行加密處理,做法是:選用幾個核心引數,連成乙個源字串,然後使用sha-256生成乙個加密串,放入url中,在服務端使用相同法則生成加密串,如果一樣,則可以確認該鏈結為有效鏈結。
上面的這個加密方式有乙個簡單的破解方式:當偽裝者猜到或者是試出加密key生成演算法是使用sha-256,且猜出所使用的生成源字串的話,即可自己使用sha-256生成相應的串,因為sha-256為標準演算法,隨處可以獲得,自己寫也並不費力,上面的加密防刷機制即會失效,因此我們需要將sha-256做個改進,使偽裝者即使知道規則,也難以通過規則及演算法(得不到)生成出相應的key。
說一下具體的實現方式
從sha-256的演算法實現來看,如果要改其中的策略,是非常困難的,需要嚴謹的數學理論支撐,而且該演算法目前已經經過了多方考證其正確性,改掉其中的策略後的正確也無法驗證,因而,決定從外圍入手。
然後出現了第二種處理方式:直接修改sha-256執行前的原始檔,對原始檔的二進位制序列進行干擾。
我們的做法是獲得原檔案的二進位制序列之後,在頭部插入特殊字串0x00010101,然後生成新的原始檔,再進行sha-256演算法運算,得到相應的key。好,下面通過公式來證明該演算法的正確性:
1.前提條件:
a.輸入字串a != b
b.sha-256演算法不存在碰撞性
2.我們需要的結果是:
a1 = sha-256改進演算法(a)
b1 = sha-256改進演算法(b)
a1 != b1
3.過程:
從前提條件可知:
a != b (前提a)
定義 s = 特殊字串0x00010101
可以得到s + a != s + b
sha-256(s + a) != sha-256(s + b)
a1 = sha-256改進演算法(a) = sha-256(s + a)
b1 = sha-256改進演算法(b) = sha-256(s + b)
a1 != b1
因此,該思路所改進的sha-256演算法是沒有問題,確實可用的。
第三種思路:是在第二種思路上的進一步加強,可以將特殊字串的插入位置變為可變的,取原字串的第乙個byte的值b,可能的情況有0-255,再取整個字串的長度l,根據l及b的值,計算插入位置:
若l>b,則插入間隔會大於等於1,為l/b
若l這種思路也可以用第二種思路的方法來證明其正確性:
直接看證明過程:
假調a的第乙個byte為ab1,b的第乙個byte為bb1
若ab1 != bb1 ,則不管後面字串怎麼插入,插入完畢的字串均不等,最終 a1 != b1 (前提b)
若ab1 == bb1,則a與b的插入串的位置一致,可以表述為:
插入後的串 :as = af + s + au,其中 a = af + au
插入後的串 :bs = bf + s + bu,其中 b = bf + bu
因為a != b(前提a)所以必然有af != bf || au != bu(注意,插入位是相同的)
兩種情況一樣,隨便舉個例子,假設af != bf,則不管s + au 是否等於 s + bu,則as != bs,繼而a1 != b1
證明完畢。
以上演算法均已在專案中完成驗證。
SHA 256演算法流程
sha 256 輸入訊息 m 輸出訊息 256位 bit hash值 步驟 訊息填充 m的長度 mod 512 r,考慮r r為輸入訊息長度按512bit進行分組後,最後一組的長度 系統給出8個32位暫存器 a,b,c,d,e,f,g,h,其初始值分別取自8個素數 2,3,5,7,11,13,17,...
SHA 256演算法實現過程
1.定義8個32位常量 h0 0x6a09e667 h1 0xbb67ae85 h2 0x3c6ef372 h3 0xa54ff53a h4 0x510e527f h5 0x9b05688c h6 0x1f83d9ab h7 0x5be0cd192.再定義乙個k的32位整形陣列,陣列大小為64 k ...
雜湊函式 SHA1和SHA256演算法
sha2演算法是對sha1演算法的繼承。區別在於兩者的構造和簽名長度不同。sha 1通過4輪運算 每輪20步,共80步 將長度不超過264的輸入壓縮成為160bit的訊息摘要。初始化md緩衝區,需要160位來存放雜湊函式的初始變數 中間摘要和最終摘要。需要5個32位的暫存器。sha 1的框圖 sha...