C BlowFish對稱加密算法詳解
1.算法原理
BlowFish算法基于Feistel網(wǎng)絡(luò),加密函數(shù)迭代執(zhí)行16輪,分組長度為64位,密鑰長度可以從32位到448位。算法由兩部分組成,密鑰擴(kuò)展部分和數(shù)據(jù)加密部分,密鑰擴(kuò)展部分將最長最長為448位的密鑰轉(zhuǎn)化成共4168字節(jié)長度的子密鑰數(shù)組,其中,數(shù)據(jù)加密由一個(gè)16輪的Feistel網(wǎng)絡(luò)完成,每輪由一個(gè)密鑰相關(guān)置換和一個(gè)密鑰與數(shù)據(jù)相關(guān)的替換組成。
(1)子密鑰
BlowFish算法子密鑰在加密前預(yù)計(jì)算產(chǎn)生。
P數(shù)組由18個(gè)32位字的子密鑰組成。P1,P2''''''.P18
4個(gè)8X32的包含總共1024個(gè)32位字的S-box.
子密鑰擴(kuò)展算法如下:
- 按順序使用常數(shù)π的小數(shù)部分初始化P數(shù)組和S-box
- 對P數(shù)組和密鑰進(jìn)行逐位異或,需要時(shí)重用密鑰。
- 使用當(dāng)前的P數(shù)組和S-box,對全0和64位分組使用BlowFish算法進(jìn)行加密,用輸出替代P1,p2,
- 使用當(dāng)前的P和S對第3步的輸出進(jìn)行加密,并輸出替代P3,P4
- 繼續(xù)上面的過程,直到按順序替代所用的P數(shù)組和S-Box中的元素。
2.加密代碼實(shí)現(xiàn)
BlowFish由16輪的Fistel網(wǎng)絡(luò)組成,輸入是一個(gè)64位的數(shù)據(jù)元素X,將X分成兩個(gè)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個(gè)8X32的包含總共1024個(gè)32位字的S-box.但通過動(dòng)態(tài)讀取方式時(shí),較難識別。
到此這篇關(guān)于C BlowFish對稱加密算法詳解的文章就介紹到這了,更多相關(guān)C BlowFish對稱加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析C++中構(gòu)造函數(shù)的默認(rèn)參數(shù)和構(gòu)造函數(shù)的重載
這篇文章主要介紹了解析C++中構(gòu)造函數(shù)的默認(rèn)參數(shù)和構(gòu)造函數(shù)的重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
深入探討POJ 2312 Battle City 優(yōu)先隊(duì)列+BFS
本篇文章是對優(yōu)先隊(duì)列+BFS進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++實(shí)現(xiàn)通訊錄管理系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
利用C++如何實(shí)現(xiàn)一個(gè)阻塞隊(duì)列詳解
這篇文章主要給大家介紹了關(guān)于利用C++如何實(shí)現(xiàn)一個(gè)阻塞隊(duì)列的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

