神秘的密碼學(xué)之BLOWFISH算法
Blowfish是1993年布魯斯·施奈爾(Bruce Schneier)開發(fā)的對(duì)稱密鑰區(qū)塊加密算法,區(qū)塊長(zhǎng)為64位,密鑰為1至448位的可變長(zhǎng)度。與DES等算法相比,其處理速度較快。因?yàn)槠錈o須授權(quán)即可使用,作為一種自由授權(quán)的加密方式在SSH、文件加密軟件等被廣泛地使用。BlowFish算法用來加密64Bit長(zhǎng)度的字符串。 ?BlowFish算法使用兩個(gè)“盒”——ungigned long pbox[18]和unsigned long sbox[4,256]。 ?BlowFish算法中,有一個(gè)核心加密函數(shù):BF_En(后文詳細(xì)介紹)。該函數(shù)輸入64位信息,運(yùn)算后, 以64位密文的形式輸出。 用BlowFish算法加密信息,需要兩個(gè)過程:

密鑰預(yù)處理和信息加密
密鑰預(yù)處理:
BlowFish算法的源密鑰——pbox和sbox是固定的。我們要加密一個(gè)信息,需要自己選擇一個(gè)key, 用這個(gè)key對(duì)pbox和sbox進(jìn)行變換,得到下一步信息加密所要用的key_pbox和key_sbox。具體的變化算法如下:
1)用sbox填充key_sbox
2)用自己選擇的key8個(gè)一組地去異或pbox,用異或的結(jié)果填充key_pbox。key可以循環(huán)使用。
比如說:選的key是"abcdefghijklmn"。則異或過程為:
key_pbox[0]=pbox[0]^abcdefgh
key_pbox[1]=pbox[1]^ijklmnab
…………
…………
如此循環(huán),直到key_box填充完畢。
3)用BF_En加密一個(gè)全0的64位信息,用輸出的結(jié)果替換key_pbox[0]和key_pbox[1]。i=0
4)用BF_En加密替換后的key_pbox[i],key_pbox[i+1],用輸出替代key_pbox[i+2]和key_pbox[i+3]
5)i+2,繼續(xù)第4步,直到key_pbox全部被替換
6)用key_pbox[16]和key_pbox[17]做首次輸入(相當(dāng)于上面的全0的輸入),用類似的方法,替換key_sbox 信息加密。
信息加密:
信息加密就是用函數(shù)把待加密信息x分成32位的兩部分:xL,xR BF_En對(duì)輸入信息進(jìn)行變換,BF_En函數(shù)詳細(xì)過程如下:
對(duì)于i=1至16
xL=xL^Pi
xR=F(xL)^xR
交換xL和xR(最后一輪取消該運(yùn)算)
xR=xR^P17
xL=xL^P18
重新合并xL和xR
函數(shù)F見下圖:
8位? ? ? ? ? ? ? 32位
|-----------S盒1-----------
|? ? ? ? ? ? ? ? ? ? ? ? |加
|? 8位? ? ? ? ? ? ? 32位? |----
|-----------S盒2-----------? |
|? ? ? ? ? ? ? ? ? ? ? ? ? ? |
|? ? ? ? ? ? ? ? ? ? ? ? ? ? |異或----
32位-|? ? ? ? ? ? ? ? ? ? ? ? ? ? |? ? ? |
|? 8位? ? ? ? ? ? ? 32位? ? ? |? ? ? |
|-----------S盒3---------------? ? ? |加
|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |-----------------32位
|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
|? 8位? ? ? ? ? ? ? 32位? ? ? ? ? ? ? |
|-----------S盒4-----------------------
把xL分成4個(gè)8位分組:a,b,c和d
輸出為:F(xL)=((((S[1,a]+S[2,b])MOD 4294967296)^s[3,c])+S[4,d])MOD 4294967296
(2的32次方)? ? ? ? ? ? ? ? ? (2的32次方)
重新合并后輸出的結(jié)果就是我們需要的密文。
用BlowFish算法解密,同樣也需要兩個(gè)過程:
密鑰預(yù)處理和信息解密
密鑰預(yù)處理的過程與加密時(shí)完全相同,信息解密的過程就是把信息加密過程的key_pbox逆序使用即可??梢钥闯觯x擇不同的key,用BlowFish算法加密同樣的信息,可以得出不同的結(jié)果。
要破解BlowFish算法,就是要得到BlowFish算法的key。所以,使用BlowFish算法進(jìn)行加密,最重要的也就是key的選擇以及key的保密。其中key的選擇可以使用bf_sdk中的_WeakKey函數(shù)進(jìn)行檢驗(yàn)。以下是該函數(shù)的說明:
源文:
---------------------------------------------------------------------------------------
_WeakKey
Function : Test if the ?generated Boxes are weak
Argument : none
Return : AX = Status (1=weak, 0=good)
Affects : AX, BX, CX, DX, SI, DI, direction Flag
Description: After "_InitCrypt" you should test the Boxes with this function.
If they provide a weakness which a cryptoanalyst could use to
break the cipher a "1" is returned. In this case you should
reload the original boxes and let the user choose a different password.
譯文:
---------------------------------------------------------------------------------------
_WeakKey
功能:測(cè)試產(chǎn)生的box是否安全
參數(shù):無
返回:AX=1 不安全;AX=0? 安全
影響:AX, BX, CX, DX, SI, DI, 方向標(biāo)志
描述:使用"_InitCrypt"函數(shù)產(chǎn)生用于加密的Boxes后,你應(yīng)該用這個(gè)函數(shù)測(cè)試產(chǎn)生的Boxes是否安全。如果該key產(chǎn)生的Boxes不安全——可以被密碼分析者通過分析Boxes得到key,那么,你應(yīng)該采用另外一個(gè)key產(chǎn)生一個(gè)安全的Boxes用來加密。



