C BlowFish對稱加密算法詳解
1.算法原理
BlowFish算法基于Feistel網(wǎng)絡,加密函數(shù)迭代執(zhí)行16輪,分組長度為64位,密鑰長度可以從32位到448位。算法由兩部分組成,密鑰擴展部分和數(shù)據(jù)加密部分,密鑰擴展部分將最長最長為448位的密鑰轉化成共4168字節(jié)長度的子密鑰數(shù)組,其中,數(shù)據(jù)加密由一個16輪的Feistel網(wǎng)絡完成,每輪由一個密鑰相關置換和一個密鑰與數(shù)據(jù)相關的替換組成。
(1)子密鑰
BlowFish算法子密鑰在加密前預計算產(chǎn)生。
P數(shù)組由18個32位字的子密鑰組成。P1,P2''''''.P18
4個8X32的包含總共1024個32位字的S-box.
子密鑰擴展算法如下:
- 按順序使用常數(shù)π的小數(shù)部分初始化P數(shù)組和S-box
- 對P數(shù)組和密鑰進行逐位異或,需要時重用密鑰。
- 使用當前的P數(shù)組和S-box,對全0和64位分組使用BlowFish算法進行加密,用輸出替代P1,p2,
- 使用當前的P和S對第3步的輸出進行加密,并輸出替代P3,P4
- 繼續(xù)上面的過程,直到按順序替代所用的P數(shù)組和S-Box中的元素。
2.加密代碼實現(xiàn)
BlowFish由16輪的Fistel網(wǎng)絡組成,輸入是一個64位的數(shù)據(jù)元素X,將X分成兩個32位部分,XL,XR,加密如下:
void Blowfish_encipher(unsigned long *xl, unsigned long *xr) { unsigned long Xl; unsigned long Xr; unsigned long temp; short i; Xl = *xl; Xr = *xr; for (i = 0; i < 16; ++i) { //16輪的 Xl = Xl ^ P[i]; Xr = F(Xl) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ P[N]; Xl = Xl ^ P[N + 1]; *xl = Xl; *xr = Xr; }
ANALYZER通過檢測4個8X32的包含總共1024個32位字的S-box.但通過動態(tài)讀取方式時,較難識別。
到此這篇關于C BlowFish對稱加密算法詳解的文章就介紹到這了,更多相關C BlowFish對稱加密內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!