Salsa20 är ett strömkrypteringssystem utvecklat av Daniel Bernstein. Algoritmen presenterades vid eSTREAM- tävlingen , vars syfte var att skapa europeiska standarder för kryptering av data som överförs av postsystem. Algoritmen blev vinnaren av tävlingen i den första profilen (strömningschiffer för mjukvaruapplikationer med hög genomströmning).
Salsa20-chifferet använder följande operationer:
Algoritmen använder en hashfunktion med 20 cykler . Dess huvudsakliga transformationer liknar AES- algoritmen .
I det följande kallar vi ett element i mängden {0,1,…,2 32 −1} för ett ord och skriver det i hexadecimal form med prefixet 0x.
Operationen att lägga till två ord modulo 2 32 kommer att betecknas med tecknet " ".
Exklusiv eller (bitvis summering) kommer att betecknas med symbolen " "
- bit cyklisk vänsterförskjutning av ett ord kommer att betecknas med . Om du föreställer dig hur , då
Systemets huvudenhet är transformationen över fyra ord. De mer allmänna transformationerna som beskrivs nedan är konstruerade utifrån det.
Dess väsen ligger i det faktum att vi för varje ord lägger till de två föregående, skiftar (cykliskt) summan med ett visst antal bitar och bit för bit summerar resultatet med det valda ordet. Efterföljande operationer utförs med nya ordbetydelser.
Låt oss säga att det är en sekvens av 4 ord, då är funktionen var
Till exempel:
quarterround(0x00000001; 0x00000000; 0x00000000; 0x00000000)Du kan tänka på denna funktion som en transformation av orden y 0 , y 1 , y 2 och y 3 . Var och en av dessa transformationer är reversibel, liksom funktionen som helhet.
rowround(y)
I denna förvandling tar vi 16 ord. Vi representerar dem i form av en 4x4-matris. Vi tar varje rad i denna matris och transformerar orden i denna matris med funktionen . Ord från raden tas i ordning, med början från i -th för i -th rad, där i = {0,1,2,3}.
Låta vara en sekvens av 16 ord, då också vara en sekvens av 16 ord där
columnround(y)Här tar vi kolumnerna i samma matris. Låt oss omvandla dem med funktionen , genom att analogt ersätta värdena i den, med början från den j -:e kolumnen för den j -:e kolumnen, där j = {0,1,2,3}.
Funktionen columnround(y)=(z) fungerar också på en sekvens av 16 ord så att
doubleround(y)Doubleround (y) -funktionen är en sekventiell tillämpning av kolumnrunda och sedan rowround-funktioner : doubleround(y) = rowround(kolumnrunda(y))
Salsa20()Denna algoritm använder en ordpost som börjar med den låga byten . För att göra detta, här är en förvandling
Låt vara en 4-byte sekvens, sedan vara ett ord som
Den slutliga transformationen är den bitvisa summeringen av den ursprungliga sekvensen och resultatet av 20 omgångar av alternerande kolumn- och radtransformationer.
Var
…x[i] är byte x och x j är ord som används i ovanstående funktioner.
Om en
,
då är Salsa20(x) resultatsekvensen
Tillägget konverterar en 32-byte eller 16-byte nyckel k och ett 16-byte nummer n till en 64-byte sekvens .
Förlängningen k använder konstanterna
för 32-byte k och
för 16-byte k .
Dessa är "expandera 32-byte k" och "expandera 16-byte k" i ASCII -kod.
Låt k 0 , k 1 ,n ha 16-byte-sekvenser, då .
Om vi bara har en 16-byte sekvens k då
Byte-sekvens chiffer , för kommer att vara
— unikt 8-byte nummer (icke).
Chiffertexten kommer att vara bytestor , precis som klartexten.
Salsa20 k ( v ) är en sekvens på 270 byte.
Var är en unik sekvens på 8 byte så att resp
Var
På grund av det faktum att transformationerna av varje kolumn och varje rad är oberoende av varandra, kan de beräkningar som krävs för kryptering enkelt parallelliseras . Detta ger en betydande hastighetsökning för de flesta moderna plattformar.
Algoritmen har praktiskt taget ingen overheadberäkning som krävs för att köra krypteringscykeln. Detta gäller även viktiga förändringar. Många chiffersystem förlitar sig på förberäkningar, vars resultat måste lagras i processorns första nivå (L1) cache . Eftersom de beror på nyckeln måste beräkningarna utföras igen. I Salsa20 räcker det att helt enkelt ladda nyckeln i minnet.
Salsa20/8 och Salsa20/12 är chiffersystem som använder samma mekanism som Salsa20, men med 8 respektive 12 krypteringsrundor istället för de ursprungliga 20. Salsa20 gjordes med mycket uthållighet. Medan Salsa20/8 visar goda resultat i hastighet, kör om i de flesta fall många andra chiffersystem, inklusive AES och RC4 [1] .
Det finns en variant av Salsa20-algoritmen, också föreslagen av Daniel Bernstein, som ökar nonce- längden från 64 bitar till 192 bitar. Denna variant kallas XSalsa20. Den ökade storleken på nonce tillåter användning av en kryptografiskt stark pseudoslumptalsgenerator för att generera den, medan säker kryptering med en 64-bitars nonce kräver användning av en räknare på grund av den höga sannolikheten för kollisioner [2] .
2005 meddelade Paul Crowley en attack mot Salsa20/5 med en beräknad tidskomplexitet på 2165 . Denna och efterföljande attacker är baserade på trunkerad differentiell kryptoanalys . För denna kryptoanalys fick han en belöning på 1 000 $ från författaren till Salsa20.
2006 rapporterade Fischer, Meier, Berbain , Biasse och Robshaw en 2117 komplexitetsattack mot Salsa/6 och en 2217 komplexitet mot Salsa20 /7 med länkade nycklar .
2008 rapporterade Aumasson, Fischer, Khazaei, Meier och Rechberger en attack på Salsa20/7 med en svårighetsgrad på 2153 och den första attacken på Salsa20/8 med en svårighetsgrad på 2251 .
Hittills har det inte förekommit några offentliga rapporter om attacker mot Salsa20/12 och hela Salsa20/20.
2008 publicerade Daniel Bernstein en relaterad familj av strömchiffer som heter ChaCha, som syftade till att förbättra datablandningen i en omgång och förmodligen förbättra kryptografisk styrka med samma eller till och med något snabbare hastighet [3] .
ChaCha20 beskrivs i RFC 7539 (maj 2015).
Systemets huvudenhet fungerar annorlunda här. Nu ändrar varje operation ett av orden. Förändringar sker cykliskt "i motsatt riktning", med början från det 0:e ordet. Operationerna addition och bitvis summa alternerar tillsammans med skiftet, ordet läggs till det föregående.
Funktionen quarterround(a, b, c, d), där a, b, c, d-ord, i ChaCha ser ut så här:
Samma aritmetiska operationer används här, men varje ord ändras två gånger per omvandling istället för en gång.
Dessutom ändras det initiala tillståndet för chifferet (nyckelförlängningen) jämfört med Salsa: de första 128 bitarna är konstanter, följt av 256 bitar av nyckeln, 32 bitar av räknaren och sedan 96 bitar av en unik nonce-sekvens.
Symmetriska kryptosystem | |
---|---|
Streama chiffer | |
Feistel nätverk | |
SP nätverk | |
Övrig |