Blowfish
概述 | |
---|---|
設計者 | 布魯斯·施奈爾 |
首次發佈 | 1993 |
繼承演算法 | Twofish |
密碼細節 | |
金鑰長度 | 32-448位元 |
分組長度 | 64位元 |
結構 | 費斯妥密碼 |
重複回數 | 16 |
最佳公開破解 | |
Four rounds of Blowfish are susceptible to a second-order differential attack (Rijmen, 1997);[1] for a class of weak keys, 14 rounds of Blowfish can be distinguished from a pseudorandom permutation (Vaudenay, 1996). |
Blowfish是一個對稱金鑰加密區塊加密法演算法,由布魯斯·施奈爾於1993年設計,現已應用在多種加密產品。Blowfish演算法由於分組長度太小已被認為不安全,施奈爾更建議在現代應用中使用Twofish密碼。[2]
施奈爾設計的Blowfish演算法用途廣泛,意在替代老舊的DES及避免其他演算法的問題與限制。Blowfish剛剛研發出的時候,大部分其他加密演算法是專利所有的或屬於商業(政府)機密,所以發展起來非常受限制。施奈爾則聲明Blowfish的使用沒有任何限制,任何國家任何人任何時候都可以隨意使用Blowfish演算法。
Blowfish主要包括關鍵的幾個S盒和一個複雜的核心變換函數。
Blowfish的偽代碼
uint32_t P[18];
uint32_t S[4][256];
uint32_t f (uint32_t x) {
uint32_t h = S[0][x >> 24] + S[1][x >> 16 & 0xff];
return ( h ^ S[2][x >> 8 & 0xff] ) + S[3][x & 0xff];
}
void encrypt (uint32_t & L, uint32_t & R) {
for (int i=0 ; i<16 ; i += 2) {
L ^= P[i];
R ^= f(L);
R ^= P[i+1];
L ^= f(R);
}
L ^= P[16];
R ^= P[17];
swap (L, R);
}
void decrypt (uint32_t & L, uint32_t & R) {
for (int i=16 ; i > 0 ; i -= 2) {
L ^= P[i+1];
R ^= f(L);
R ^= P[i];
L ^= f(R);
}
L ^= P[1];
R ^= P[0];
swap (L, R);
}
// ...
// initializing the P-array and S-boxes with values derived from pi; omitted in the example
// ...
{
for (int i=0 ; i<18 ; ++i)
P[i] ^= key[i % keylen];
uint32_t L = 0, R = 0;
for (int i=0 ; i<18 ; i+=2) {
encrypt (L, R);
P[i] = L; P[i+1] = R;
}
for (int i=0 ; i<4 ; ++i)
for (int j=0 ; j<256; j+=2) {
encrypt (L, R);
S[i][j] = L; S[i][j+1] = R;
}
}
參考資料
- ^ Vincent Rijmen. Cryptanalysis and Design of Iterated Block Ciphers. Ph.D thesis. 1997 [2015-03-16]. (原始內容 (PostScript)存檔於2013-05-08).
- ^ Dahna, McConnachie. Bruce Almighty: Schneier preaches security to Linux faithful. Computerworld: 3. 2007-12-27 [2018-01-26]. (原始內容存檔於2016-12-02).
At this point, though, I'm amazed it's still being used. If people ask, I recommend Twofish instead.