Kryptografi-algoritmen Blowfish er et velkendt symmetrisk blokchiffer med en variabel nøgle, udviklet af Bruce Schneier i 1993. Den blev hurtigt populær og indgik i et stort antal krypteringsprodukter. Blowfish er designet til at være hurtigt i software, men har en relativt langsom nøgleopsætning (key schedule). Selvom der indtil i dag ikke er offentliggjort nogen praktisk kryptoanalytisk metode til at bryde den fulde 16-runds-version, betragtes Blowfish i moderne sammenhænge ofte som et legacy-chiffer på grund af sin 64-bit blokstørrelse.
Historie og licens
Bruce Schneier designede Blowfish som en åben og fri erstatning for den aldrende DES-algoritme. På udgivelsestidspunktet var mange alternative algoritmer proprietære eller hemmelige, og Schneier gjorde det klart, at "Blowfish er ikke patenteret og vil forblive det i alle lande. Algoritmen er hermed placeret i det offentlige domæne og kan frit anvendes af alle."
Design og parametre
- Struktur: Blowfish er en 16-runds Feistel-cipher.
- Blokstørrelse: 64 bit.
- Nøglelængde: Variabel fra 0 op til 448 bit.
- S-boxes og P-array: Implementationerne bruger store nøgleafhængige S-bokse og en P-array. Den typiske specifikation beskriver en P-array bestående af 18 32-bit ord og fire S-bokse med hver 256 32-bit ord. Disse tabeller er ikke faste, men udledes fra nøglen under nøgleopsætningen.
- Nøgleplan (key schedule): Nøglen ekspanderes til P-array og S-bokse ved en proces, der iterativt krypterer en 64-bit nulblok og erstatter indholdet af P- og S-tabellerne. Denne proces er beregningsmæssigt dyr: at indlæse en ny nøgle tager omtrent den tid, det kræver at kryptere ~4 kilobyte data, hvilket gør hyppigt nøgleskift relativt langsomt.
Ydeevne og anvendelser
Blowfish er typisk meget hurtigt ved selve krypteringen i software, hvilket gjorde det populært i mange applikationer i 1990'erne og 2000'erne. Den lange og tunge nøgleopsætning betyder dog, at Blowfish ikke er velegnet, når nøgler konstant skiftes eller i meget ressourcebegrænsede indlejrede systemer (fx tidlige smartcards).
En direkte afledning af Blowfish, kaldet Eksblowfish, bruges i password-hashfunktionen bcrypt, som udnytter den langsomme nøgleplan til at øge arbejdsomkostningen for brute-force- og ordbogsangreb (se nøgleforstærkning).
Sikkerhed og kryptoanalyse
Der er gennem årene foreslået flere angreb mod reducerede eller særligt konstruerede varianter af Blowfish:
- 1996 fandt Serge Vaudenay et kendt klartekst-angreb (på reducerede varianter eller under særlige forudsætninger), og han identificerede desuden en klasse af svage nøgler. Angrebet forudsætter kendskab til nøgleafhængige S-bokse og gælder ikke for den almindelige fuldrunde Blowfish uden yderligere antagelser.
- Vincent Rijmen beskrev i sin ph.d.-afhandling et differentialt angreb af anden orden, som kan bryde op til fire runder, men ikke de fulde 16 runder.
- Der blev også rapporteret en implementeringsfejl i en offentliggjort C-kode fra 1996, hvor en lille udvidelse med et tegn ændrede funktionaliteten — dette var et implementeringsproblem, ikke en matematisk svaghed i selve chiffret.
Generelt er der ingen offentlig, praktisk kryptoanalyse, der effektivt bryder den fulde 16-runds Blowfish; en brute-force-nøgleopsporing er fortsat den mest direkte måde at angribe selve nøglen på. Alligevel er der to vigtige sikkerhedsbegrænsninger at være opmærksom på:
- 64-bit blokstørrelse: Moderne krypteringsstandarder foretrækker 128-bit blokke (som i AES) for at undgå problemer med gentagelser (birthday-problemer) ved store datamængder. Med en 64-bit blokstørrelse kan der opstå blok-kollisioner efter omtrent 2^32 blokke, hvilket gør Blowfish mindre egnet til kryptering af meget store datamængder.
- Langsom nøgleopsætning: På grund af den dyre nøgleudvidelse er Blowfish mindre egnet i scenarier med hyppige nøgleskift eller i ekstremt begrænsede miljøer.
Nuværende status og anbefalinger
Selvom Blowfish stadig anvendes i visse eksisterende systemer og biblioteker, anbefaler mange eksperter i dag at vælge nyere algoritmer til nye systemer. AES (med 128-bit blok og 128/192/256-bit nøgler) er standarden for de fleste moderne anvendelser. Til strømme og højtydende softwarekryptering er også moderne alternativer som ChaCha20 populære.
Twofish — et andet design, som Schneier var med til — blev fremført som en kandidat til AES og er et mere moderne alternativ, men AES dominerer i praksis. Til password hashing og lagring af adgangskoder er bcrypt (baseret på Eksblowfish) fortsat relevant sammen med andre moderne KDFs (key-derivation functions) som Argon2.
Praktisk vejledning
- Undgå at bruge Blowfish til nye projekter, hvor store datamængder krypteres — brug i stedet chifre med 128-bit blokke (fx AES) eller moderne strømchifre (fx ChaCha20).
- Hvis du støder på Blowfish i eksisterende systemer, vurder om migration til en nyere algoritme er nødvendig, især hvis systemet håndterer store mængder data eller kræver høje sikkerhedsgarantier.
- Til password-hashing er det passende at bruge etablerede, tilpassede konstruktioner som bcrypt eller nyere algoritmer som Argon2.
Bemærk: Selvom Blowfish ingen offentlig kendt fuldbruddsmetode har haft i årene efter udgivelsen, gør den 64-bit blokstørrelse og den langsomme nøgleopsætning, at Blowfish primært betragtes som en historisk og legacy-løsning i moderne kryptografi. Schneier selv har i senere år anbefalet nyere designs som Twofish og fremhævet, at AES har fået mest udbredelse.