# Blowfish
Blowfish, Bruce Schneier tarafından 1993 yılında tasarlanmış, çok sayıda şifreleyici ve şifreleme ürününe dahil olan; anahtarlanmış, simetrik bir blok şifreleme yöntemi (öbek şifreleyici)dir. Blowfish ile ilgili olarak şu ana kadar etkin bir şifre çözme analizi var olmasa da, artık AES ya da Twofish gibi daha büyük ebatlı öbek şifreleyicilerine daha fazla önem verilmektedir.
Schneier; Blowfish'i bir genel kullanım algoritması olarak, eskiyen DES'ın yerini alması için ve diğer algoritmalarla yaşanan sorunlara çözüm olarak tasarlamıştır. O zamanlarda, birçok diğer tasarım lisanslı, patentle korunmakta ya da devlet sırrı olarak saklanmaktaydı.
Bruce Schneier, bunu şu şekilde ortaya koymaktadır:
" Blowfish, patentsizdir ve tüm ülkelerde bu şekilde yer alacaktır. Algoritma genel kamusal alanda bulunmakta olup, herkes tarafından özgürce kullanılabilir."
Tasarımın belirgin özellikleri anahtar-bağımlı S-boxes ve oldukça karmaşık anahtar çizelgesini içerir.


## Algoritma.
Blowfish, 64-bit öbek büyüklüğüne ve 32 bit'ten 448 bit'e kadar anahtar uzunluğuna sahiptir. 16-tur Feistel Cipher'dır ve anahtar-bağımlı S-boxes kullanır. Sabit S-boxes kullanan CAST-128 yapısına benzer.
Blowfish'in hareketi; algoritma iki alt anahtar sırası (subkey array) tutar: 18-girişli P-sırası ve dört 256-girişli S-boxes. S-boxes 8-bit girdi kabul eder ve 32-bit çıktı oluşturur. P-sırasının bir girişi her turda kullanılır ve son turdan sonra veri öbeğinin her bir yarısı geri kalan kullanılmamış iki P-girişinden biri tarafından XOR'lanır.


### F-işlevi.
İşlev, 32-bit girdiyi, dört adet sekiz-bitlik çeyreğe böler ve çeyrekleri S-boxes'lara girdi olarak kullanır. Çıktılar modulo 2^32 a eklenir ve son 32-bit çıktıyı oluşturmak üzere XOR'lanır.
Blowfish bir Feistel ağı olduğundan, basitçe P17 XOR'layarak ve şifreleyici metin öbeğine P18 ile, daha sonra P-girişlerini ters sırayla kullanarak ters çevrilebilir.
Blowfish'in anahtar çizelgesi P-sıralarını ve S-box'ları, hiçbir belirgin şablon (pattern) içermeyen; pi sayısının hexadecimal (onaltılık) dijitlerinden türetilen değerlerle başlangıç konumuna getirerek başlar. Sonra, gizli anahtar, sırayla P-girişleri ile XOR'lanır (gerekirse anahtarı devrederek). 64-bit sıfır öbeği olduğu gibi algoritma ile şifrelenir. Sonuç şifreleyici metni P1 ve P2 nin yerini alır. Şifreleyici metin yeni alt anahtarlarla yeniden şifrelenir ve yeni şifreleyici metin P3 ve P4 yerini alır. Tüm P-sıraları ve S-box girişlerinin yerini alarak devam eder. Sonuçta, Blowfish şifreleme algoritması tüm alt anahtarları oluşturmak için 521 kez çalışacaktır - yaklaşık 4KB veri işlenmiş olur.


## Şifre Çözümü.
2006 itibarıyla Blowfish'in genel olarak bilinen etkin bir kriptanalizi mevcut değildir. 64 bit öbek büyüklüğü günümüzde çok kısa olarak düşünülse de; 2^32den fazla veri öbeğini şifrelemek doğumgünü saldırıları nedeniyle plaintext hakkında bilgi sızmasını başlatabilir. Buna rağmen, Blowfish şu ana kadar güvenli görünmektedir. Kısa öbek büyüklüğü, e-posta gibi rutin kullanıcı uygulamaları konusunda ciddi endişeler yaratmasa da, Blowfish veri arşivleme gibi büyük şifresiz metinler konusunda uygun olmayabilir.
1996'da Serge Vaudenay kırmak için 28r + 1 şifresiz metin gerektiren (r turların sayısını ifade eder) bir bilinen-şifresiz metin saldırısı keşfetti. Daha da fazlası, yalnızca 24r + 1 bilinen-şifresiz metinlerle aynı saldırılarla kırılabilecek bir weak key (zayıf anahtar) sınıfı buldu. Bu saldırı tam 16-tur Blowfish 'e karşı kullanılamadığından; Vaudenay Blowfish'in indirgenmiş-turlu bir türevini kullandı. Vincent Rijmen, doktora tezinde, dört turdan fazlasını kıramayan ikincil-sıra diferansiyel saldırıyı sundu. Halen, tam 16-tur'u kırabilecek, brute-force search dışında bir yol bilinmemektedir.
2005'te Dieter Schmidt, Blowfish anahtar çizelgesini araştırdı ve üçüncü ve dördüncü turlar için alt anahtarların ilk 64 bitlik kullanıcı anahtarından bağımsız olduğunu ortaya koydu.


## Pratikte Blowfish.
Blowfish, anahtar değiştirme dışında; geniş kullanımdaki en hızlı öbek şifreleyecilerden biridir. Her yeni anahtar metnin yaklaşık 4 KB'ını şifrelemek için ön-işleme (pre-processing) eşdeğeri gerektirir ki bu diğer öbek şifreleyicilerine kıyasla çok yavaştır. Bu, bazı uygulamalarda kullanımı engeller. Bir uygulamada, aslında bu bir faydadır: OpenBSD'de kullanılan parola-bozma (password-hashing) yöntemi Blowfish'ten türetilen yavaş anahtarlı bir algoritma kullanır; burada düşünce, gereken fazladan hesaba dayalı çabanın dictionary attack (sözlük saldırılarına) karşı koruma sağlamasıdır.
Bazı uygulamalarda, Blowfish, 4 kilobyte RAM dan biraz fazla, göreceli olarak büyük hafıza ayakizine sahiptir. Bu, eski daha küçük masa üstü ve diz üstü bilgisayarlar için bile bir sorun değildir, ancak, ilk smartcard (akıllı kartlar) gibi en küçük embedded systems 'lerde kullanımı engeller.