Krüptograafias on Blowfish võtmega sümmeetriline plokkšiffer, mille töötas välja Bruce Schneier 1993. aastal ja mis on alates selle avaldamisest kasutusse võetud paljudes krüpteerimistoodetes. Blowfish on tarkvaras väga kiire ning kuni 2008. aastani ei olnud avalikult leitud selle täisringi kohta tõsist krüptoanalüütilist rünnemudelit. Samas on viimastel aastatel rohkem tähelepanu pööratud AES plokksüsteemidele ja nende kasutamisele uutes rakendustes.
Taust ja eesmärk
Schneier kavandas Blowfishi üldotstarbeliseks algoritmiks, et pakkuda turvalist ja kiiret asendust tol ajal levinud, kuid piiratud võimalustega DES-ile ning lahendada teiste tollaste krüptosüsteemide puudused. Avaldamise ajal olid paljud teised krüpteerimisalgoritmid patenteeritud või hoidnud oma täpseid detaile saladuses. Schneier rõhutas, et "Blowfish on patenteerimata ja jääb selleks kõikides riikides. Algoritm on käesolevaga avalikustatud ja seda võib igaüks vabalt kasutada." See vabanemine patentidest ja tasuta kättesaadavus aitas Blowfishil laialdaselt levida.
Peamised omadused ja ehitus
Blowfish kasutab 64-bitist plokisuurust ja muutuva võtmepikkusega 0 kuni 448 bitti. See on 16-vooruline Feistel-struktuur, mille olulised komponendid on võtmetest sõltuvad S-kastid ja keerukas võtme ajakava. Konstruktsioon meenutab ülesehituselt mõningal määral CAST-128i, kuid Blowfish kasutab võtmetest lähtuvaid S-kaste, mitte fikseeritud.
Rakenduslikud tehnilised detailid:
- Algoritmi sees on 18 32-bitist P-alaelemendi (P-array) alamvõtit ja neli 32-bitist S-kasti, igaühes 256 elementi.
- Võtme töötlemine (initialization) genereerib need P-elemendid ja S-kastid võtme põhjal, kasutades korduvat plokkide krüpteerimist – see on põhjus, miks uue võtme võtmepõhine eeltöötlus võtab suhteliselt palju aega.
Tõhusus ja piirangud
Blowfish on tavapäraselt väga kiire, kui räägime andmete krüpteerimisest juba eeltöödelduse järel. Kuid iga uus võtme loomine nõuab eeltöötlust, mis võib võtta aega, mis on ligikaudu võrdne ~4 kilobaidi teksti krüpteerimisega; see muudab võtmete sagedase muutmise kalliks. See omadus muudab Blowfishi vähem sobivaks ressurssivaestes seadmetes (näiteks varasemate kiipkaartide tasemel), kus arvutusressursid on piiratud. Teisalt on aeglane võtme ajakava kasulik paroolide töötlemisel: OpenBSD-s kasutatav paroolide peitmise meetod kasutab Blowfishist tuletatud algoritmi, mis tekitab teadliku arvutusliku takistuse ründajale (nt sõnastikurünnakute vastu). See tehnika on tuntud ka kui võtme tugevdamine; Vt võtme tugevdamine.
Turvalisus ja krüptoanalüüs
Kuigi Blowfishile ei ole leitud praktilist rünnet kogu 16-voorulise skeemi purustamiseks, on selle kohta avaldatud mitmeid teoreetilisi tulemusi ja nõrkuste analüüse:
- 1996. aastal leidis Serge Vaudenay teoreetilise teada‑tuntud teksti rünnaku ja tuvastas ka teatud nõrkade võtmete klassi. Need rünnakud nõuavad väga suurt hulka teadaolevaid tekste ning eeldavad võtmetest sõltuvate S-kastide sisemist struktuuri, mistõttu nende praktiline kasutatavus tavalise Blowfishi vastu on piiratud.
- Vincent Rijmen töödes demonstreeriti teise astme diferentsiaalrünnak, mis suudab purustada kuni neli vooru, kuid see ei laiene kogu 16-voorulisele versioonile.
- 1996. aastal avastati avalikus C-koodis järeleandetest tulenenud märkide laiendamise viga (sign-extension bug), mis oli rakendusevea, mitte krüptosüsteemi algpõhjus.
Kuni 2008. aastani ei olnud avalikult teada ühtegi praktilist ja usaldusväärset krüptoanalüüsi Blowfishi täisringi kohta. Siiski märkis Bruce Schneier 2007. aastal, et kuigi Blowfish on endiselt kasutuses, soovitab ta uuemate vajaduste puhul pigem kasutada tema teist algoritmi Twofish, mis lahendab osa Blowfishi piirangutest (nt suurem paindlikkus ja kaasaegsem disain).
Kaasaegne kasutus ja soovitused
Blowfish jääb kasulikuks mitmetes, eriti vanemates või piiratud-liiklusega süsteemides, kuid tänapäevaste nõudmistega tuleb arvesse võtta mõningaid piiranguid:
- 64-bitine plokk tähendab, et suure hulga andmete krüpteerimisel ilmneb küllastumine (birthday attack) kiiremini kui 128-bitise plokiga algoritmide puhul — see teeb Blowfishi vähem sobivaks suuremahuliste andmevoogude jaoks.
- Kui alustavate võtmete sagedane uuendamine on vajalik, võib Blowfishi eeltöötluse aeg olla rakendusele liigne koormus.
- Paroolide hoiustamisel ja auditeeritud rakendustes kasutatakse Blowfishist tuletatud meetodeid (näiteks bcrypt), sest aeglane võtme ajakava annab lisaohutuse murdekatsete vastu.
Kokkuvõttes on Blowfish olnud oluline samm mitmete tasuta ja laialtlevinud krüptosüsteemide kujunemisel: tema patenteerimatus ja head jõudlusomadused on teinud ta populaarseks, kuid tänapäeva soovituste kohaselt peaks uute süsteemide puhul eelistama sageli AESi või muid kaasaegseid plokksifreid või vähemalt arvestama Blowfishi piirangutega (eriti 64-bitise plokisuuruse tõttu).