BLOWFISH

密碼演演算法

Blowfish是一個對稱密鑰加密分組密碼演演算法,由布魯斯·施奈爾於1993年設計,現已應用在多種加密產品。Blowfish主要包括關鍵的幾個S盒和一個複雜的核心變換函數。

概要


Blowfish演演算法用途廣泛,意在替代老舊的DES及避免其他演演算法的問題與限制。Blowfish剛剛研發出的時候,大部分其他加密演演算法是專利所有的或屬於商業(政府)機密,所以發展起來非常受限制。施奈爾則聲明Blowfish的使用沒有任何限制,任何國家任何人任何時候都可以隨意使用Blowfish演演算法。

演演算法原理


blowfish加密演演算法是一種對稱的分組加密演演算法,每次加密一個64位分組,使用32位~448位的可變長度密鑰,應用於內部加密。加密過程分為兩個階段:密鑰預處理和信息加密。
blowfish加密演演算法中使用兩個盒key—pbox[18]和key—sbox[4][256],以及一個核心的加密函數blowfish—encrypt()。這兩個盒所佔存儲空間為(18×32+4×256×32)位元組,即4186位元組。加密函數blowfish—encrypt()輸入64位明文,輸出64位密文。

演演算法說明


BlowFish演演算法用來加密64Bit長度的字元串。
BlowFish演演算法使用兩個“盒”——ungignedlongpbox[18]和unsignedlongsbox[4,256]。
BlowFish演演算法中,有一個核心加密函數:BF_En(後文詳細介紹)。該函數輸入64位信息,運算后,以64位密文的形式輸出。用BlowFish演演算法加密信息,需要兩個過程:
● ● 密鑰預處理
● ● 信息加密
分別說明如下:
密鑰預處理:
BlowFish演演算法的源密鑰——pbox和sbox是固定的。我們要加密一個信息,需要自己選擇一個key,用這個key對pbox和sbox進行變換,得到下一步信息加密所要用的key_pbox和key_sbox。具體的變化演演算法如下:
1)用sbox填充key_sbox
2)用自己選擇的key8個一組地去異或pbox,用異或的結果填充key_pbox。key可以循環使用。
比如說:選的key是"abcdefghijklmn"。則異或過程為:
key_pbox[0]=pbox[0]^abcdefgh
key_pbox[1]=pbox[1]^ijklmnab
…………
…………
如此循環,直到key_box填充完畢。
3)用BF_En加密一個全0的64位信息,用輸出的結果替換key_pbox[0]和key_pbox[1]。i=0
4)用BF_En加密替換后的key_pbox,key_pbox[i+1],用輸出替代key_pbox[i+2]和key_pbox[i+3]
5)i+2,繼續第4步,直到key_pbox全部被替換
6)用key_pbox[16]和key_pbox[17]做首次輸入(相當於上面的全0的輸入),用類似的方法,替換key_sbox信息加密。信息加密就是用函數把待加密信息x分成32位的兩部分:xL,xRBF_En對輸入信息進行變換,BF_En函數詳細過程如下:
對於i=1至16
xL=xL^Pi
xR=F(xL)^xR
交換xL和xR(最後一輪取消該運算)
xR=xR^P17
xL=xL^P18
重新合併xL和xR
函數F見下圖:
8位32位
|-----------s盒1-----------
||加
|8位32位|----
|-----------S盒2-----------|
||
||異或----
32位-|||
|8位32位||
|-----------S盒3---------------|加
||-----------------32位
||
||
|8位32位|
|-----------S盒4-----------------------
把xL分成4個8位分組:a,b,c和d
輸出為:F(xL)=((((S[1,a]+S[2,b])MOD4294967296)^s[3,c])+S[4,d])MOD4294967296
(2的32次方)(2的32次方)
重新合併后輸出的結果就是需要的密文。
用BlowFish演演算法解密,同樣也需要兩個過程。
1.密鑰預處理
2.信息解密
密鑰預處理的過程與加密時完全相同
信息解密的過程就是把信息加密過程的key_pbox逆序使用即可。
可以看出,選擇不同的key,用BlowFish演演算法加密同樣的信息,可以得出不同的結果。

偽代碼