Inom kryptografi är ett stream cipher ett symmetriskt nyckelchiffer där klartextbitar kombineras med en pseudorandomisk chifferbitsström (keystream) med hjälp av en exklusiv-or-operation (xor). I ett stream cipher krypteras klartextsiffrorna en i taget, och omvandlingen av på varandra följande siffror varierar under krypteringstillståndet. Ett alternativt namn är en state cipher, eftersom krypteringen av varje siffra är beroende av det aktuella tillståndet. I praktiken är siffrorna vanligtvis enskilda bitar eller bytes. En formell beskrivning är: C = P ⊕ KS, där P är klartextbitarna, KS är keystream-bitarna och C är chiffertexten.
Stream ciphers är en annan metod för symmetrisk kryptering än block ciphers. Blockchiffrer arbetar med stora block av fast längd medan stream ciphers behandlar data löpande. Stream ciphers körs vanligtvis med högre hastighet än block ciphers och har lägre krav på hårdvara, vilket gör dem lämpliga för realtidsapplikationer och inbyggda system. Däremot kan stream ciphers vara känsliga för allvarliga säkerhetsproblem om de används på fel sätt; exempelvis får samma starttillstånd aldrig användas två gånger (se avsnittet om keystream-reuse nedan).
En stream cipher använder sig av en mycket mindre och bekvämare kryptografisk nyckel, till exempel 128 bitar. Med hjälp av denna nyckel genereras en pseudorandomisk nyckelström som kan kombineras med klartextsiffrorna på ett liknande sätt som vid en engångsblock-krypteringsalgoritmen. Eftersom nyckelströmmen är pseudorandomisk och inte riktigt slumpmässig kan den säkerhet som är förknippad med engångsblocket inte tillämpas fullt ut; det är därför möjligt att en stream cipher kan vara helt osäker om konstruktionen eller användningen är bristfällig.
Typer av stream ciphers
- Synchronous stream ciphers: Keystream genereras oberoende av klartext och chiffertext och måste hållas synkroniserad mellan sändare och mottagare. Ett misstag i synkronisering kan göra data oläsbar.
- Self-synchronizing (asynchronous) stream ciphers: Keystream beror också på tidigare chiffertexter, så mottagaren kan återställa synkroniseringen efter ett antal felaktiga eller borttappade bitar.
Vanliga konstruktioner för keystream-generering
Keystream kan skapas på flera sätt:
- Linjära förskjutningsregister (LFSR) och kombinationer där icke-linjära filter används för att dölja lineariteten.
- Icke-linjära skiftregister (NLFSR) och mer komplicerade interna tillståndsmodeller.
- Kryptografiska strömtillverkare byggda från blockchiffrer (t.ex. blockcipher i CTR-läge) eller med moderna PRNGer.
- Designspecifika algoritmer som RC4, A5/1, Trivium, Grain, Salsa20/ChaCha20 med olika säkerhets- och prestandaegenskaper.
Säkerhetsrisker och attacker
- Keystream-återanvändning (nonce/IV-återanvändning): Om samma keystream används för två olika klartexter P1 och P2 så får man C1 ⊕ C2 = P1 ⊕ P2. Detta gör att skillnader mellan klartexter blir direkt synliga och underlättar återställning av båda klartexterna med kända eller sannolika textstycken. Detta är samma problem som vid tvågångsbruk av engångslåset (two-time pad).
- Kända- eller valda-plaintextattacker: Om angriparen känner till delar av klartext kan denne enkelt extrahera motsvarande keystreambitar och använda dem för att dekryptera andra meddelanden som använder samma keystream.
- Distinguishing attacks: Om keystream inte är tillräckligt slumpmässig kan den skiljas från en riktig slumptalsström, vilket kan leda till vidare kryptanalys.
- Korrelations- och algebraiska attacker: Konstruktioner baserade på LFSR utan tillräckligt icke-linnearisering kan vara sårbara för korrelationsattacker eller algebraiska metoder som återställer intern tillståndet.
- Biaser och initialiseringsfel: Praktiska svagheter, t.ex. biased keystream i vissa lägen (RC4:s initiala bytes) kan utnyttjas för att extrahera nyckelmaterial.
- Integritetsbrist: Stream ciphers ger i allmänhet endast konfidentialitet. De skyddar inte mot manipulation — därför måste en separat autentisering (MAC) användas eller en AEAD-konstruktion väljas.
- Implementationssårbarheter: Sida-kanalattacker, svag RNG för IV/nonce, felaktig hantering av nyckel/IV-livslängd och återanvändning av parametervärden ger ofta praktiska brott mot säkerheten.
Praktiska exempel och historiska misstag
Flera kända svagheter i historiska system illustrerar riskerna med felaktig användning:
- WEP-protokollet för trådlösa nätverk använde RC4 tillsammans med dålig IV-hantering, vilket ledde till att nycklar kunde återställas i praktiken.
- A5/1 som användes i GSM visade sig vara sårbart för olika attacker som återställer internt tillstånd och nycklar.
- Äldre varianter av RC4 uppvisade bias i de första keystream-bytena, vilket öppnade för nyckelåtervinning i vissa protokoll.
Rekommendationer och bästa praxis
- Använd välgranskade, moderna algoritmer: välj etablerade konstruktioner som ChaCha20 (ofta tillsammans med Poly1305 för autentisering) eller beprövade blockchifferlägen (t.ex. AES-GCM) där lämpligt.
- Säkerställ unika noncer/IV för varje krypteringsoperation — aldrig återanvänd samma (nyckel, IV)-par.
- Använd autentiserad kryptering (AEAD) eller lägg till en stark MAC för att skydda integriteten utöver konfidentialiteten.
- Håll nycklar hemliga och begränsa nyckellivslängd; använd om möjligt nyckelavledning och reseeding när det behövs.
- Undvik egen design av kryptografiska algoritmer — förlita dig på öppet granskade lösningar och standarder.
- Var noggrann med implementationen: skydda mot sida-kanaler, använd säkra RNG för IV/nonce och följ bibliotekets rekommendationer.
Sammanfattningsvis erbjuder stream ciphers goda prestanda och lämplighet för vissa användningsfall, men kräver korrekt design och noggrann drift (särskilt hantering av IV/nonce och autentisering) för att undvika allvarliga säkerhetsbrister. Moderna riktlinjer förespråkar ofta AEAD-konstruktioner såsom ChaCha20-Poly1305 eller AES-GCM istället för fristående äldre stream-cipher-implementationer.


