Salsa20 je systém šifrování streamu vyvinutý Danielem Bernsteinem. Algoritmus byl prezentován na soutěži eSTREAM , jejímž účelem bylo vytvořit evropské standardy pro šifrování dat přenášených poštovními systémy. Algoritmus se stal vítězem soutěže v prvním profilu (streamové šifry pro softwarové aplikace s vysokou propustností).
Šifra Salsa20 používá následující operace:
Algoritmus používá hashovací funkci s 20 cykly . Jeho hlavní transformace se podobají algoritmu AES .
Dále nazveme prvek množiny {0,1,…,2 32 −1} slovem a zapíšeme jej v hexadecimálním tvaru s předponou 0x.
Operace přidání dvou slov modulo 2 32 bude označena znaménkem " ".
Exkluzivní nebo (bitová sumace) bude označeno symbolem " "
- bitový cyklický levý posun slova bude označen . Když si představíte jak , tak
Hlavní jednotkou systému je transformace přes čtyři slova. Z toho jsou konstruovány obecnější transformace popsané níže.
Jeho podstata spočívá v tom, že ke každému slovu sečteme dvě předchozí, posuneme (cyklicky) součet o určitý počet bitů a bit po bitu sečteme výsledek s vybraným slovem. Následné operace se provádějí s novými významy slov.
Řekněme, že jde o posloupnost 4 slov, pak je funkce kde
Například:
čtvrtletí (0x00000001; 0x00000000; 0x00000000; 0x00000000)Tuto funkci si můžete představit jako transformaci slov y 0 , y 1 , y 2 a y 3 . Každá z těchto transformací je vratná, stejně jako funkce jako celek.
rowround(y)
V této transformaci vezmeme 16 slov. Reprezentujeme je ve formě matice 4x4. Vezmeme každý řádek této matice a transformujeme slova této matice pomocí funkce . Slova z řádku se berou v pořadí, počínaje i -tým pro i -tý řádek, kde i = {0,1,2,3}.
Nechť je posloupnost 16 slov, pak také posloupnost 16 slov kde
columnround(y)Zde vezmeme sloupce stejné matice. Transformujme je pomocí funkce , analogicky do ní dosadíme hodnoty, počínaje j -tým sloupcem za j -tý sloupec, kde j = {0,1,2,3}.
Funkce columnround(y)=(z) také pracuje se sekvencí 16 slov, takže
doubleround(y)Funkce doubleround(y) je sekvenční aplikací funkcí columnround a poté rowround : doubleround (y) = rowround(columnround(y))
Salsa20()Tento algoritmus používá vstup slova začínající nízkým byte . K tomu je zde transformace
Nechť je 4bajtová sekvence, pak je slovo takové, že
Konečná transformace je bitovým součtem původní sekvence a výsledkem 20 kol střídání sloupcových a řádkových transformací.
Kde
…x[i] jsou byty x a xj jsou slova použitá ve výše uvedených funkcích.
Pokud
,
pak Salsa20(x) je posloupnost výsledků
Rozšíření převádí 32bajtový nebo 16bajtový klíč k a 16bajtové číslo n na 64bajtovou sekvenci .
Rozšíření k používá konstanty
pro 32bajtové k a
pro 16bajtové k .
Jedná se o "rozbalit 32 bajtů k" a "rozbalit 16 bajtů k" v kódu ASCII .
Nechť k 0 ,k 1 ,n má 16bajtové sekvence, pak .
Pokud máme pouze jednu 16bajtovou sekvenci k , pak
Byte-sequence cipher , for will be
— jedinečné 8bajtové číslo (nonce).
Šifrovaný text bude mít velikost bajtů , stejně jako prostý text.
Salsa20 k ( v ) je sekvence 270 bajtů.
Kde je jedinečná sekvence 8 bajtů taková, že resp
Kde
Vzhledem k tomu, že transformace každého sloupce a každého řádku jsou na sobě nezávislé, lze výpočty potřebné pro šifrování snadno paralelizovat . To poskytuje významný nárůst rychlosti pro většinu moderních platforem.
Algoritmus nemá prakticky žádné režijní výpočty potřebné ke spuštění šifrovacího cyklu. To platí i pro klíčové změny. Mnoho šifrovacích systémů se spoléhá na předběžné výpočty, jejichž výsledky musí být uloženy v mezipaměti procesoru první úrovně (L1) . Protože závisí na klíči, bude nutné provést výpočty znovu. V Salsa20 stačí klíč jednoduše nahrát do paměti.
Salsa20/8 a Salsa20/12 jsou šifrovací systémy využívající stejný mechanismus jako Salsa20, ale s 8, respektive 12 šifrovacími koly, namísto původních 20. Salsa20 byla vyrobena s velkou výdrží. Zatímco Salsa20/8 vykazuje dobré výsledky v rychlosti, ve většině případů předčí mnoho jiných šifrovacích systémů, včetně AES a RC4 [1] .
Existuje varianta algoritmu Salsa20, rovněž navržená Danielem Bernsteinem, která zvyšuje délku nonce z 64 bitů na 192 bitů. Tato varianta se nazývá XSalsa20. Zvětšená velikost nonce umožňuje použít k jeho generování kryptograficky silný generátor pseudonáhodných čísel , zatímco bezpečné šifrování s 64bitovým nonce vyžaduje použití čítače kvůli vysoké pravděpodobnosti kolizí [2] .
V roce 2005 Paul Crowley oznámil útok na Salsu20/5 s odhadovanou časovou složitostí 2165 . Tento a následující útoky jsou založeny na zkrácené diferenciální kryptoanalýze . Za tuto kryptoanalýzu obdržel od autora Salsa20 odměnu 1 000 $.
V roce 2006 Fischer, Meier, Berbain , Biasse a Robshaw ohlásili útok na složitost 2117 proti Salsa/6 a složitost 2217 proti Salsa20 /7 s propojenými klíči .
V roce 2008 Aumasson, Fischer, Khazaei, Meier a Rechberger ohlásili útok na Salsu20/7 s obtížností 2153 a první útok na Salsu20/8 s obtížností 2251 .
Dosud nebyly zveřejněny žádné veřejné zprávy o útocích na Salsu20/12 a celou Salsu20/20.
V roce 2008 publikoval Daniel Bernstein příbuznou rodinu proudových šifer nazvanou ChaCha, jejímž cílem bylo zlepšit míchání dat v jednom kole a údajně zlepšit šifrovací sílu při stejné nebo dokonce mírně vyšší rychlosti [3] .
ChaCha20 je popsán v RFC 7539 (květen 2015).
Hlavní jednotka systému zde funguje jinak. Nyní každá operace změní jedno ze slov. Změny probíhají cyklicky „v opačném směru“, počínaje 0. slovem. Operace sčítání a bitového součtu se střídají spolu s posunem, slovo je přidáno k předchozímu.
Funkce čtvrtletí (a, b, c, d), kde slova a, b, c, d, v ChaCha vypadá takto:
Jsou zde použity stejné aritmetické operace, ale každé slovo se při převodu změní dvakrát místo jednou.
Navíc je oproti Salse změněn počáteční stav šifry (rozšíření klíče): prvních 128 bitů jsou konstanty, následuje 256 bitů klíče, 32 bitů čítače a poté 96 bitů jedinečné sekvence nonce.
Symetrické kryptosystémy | |
---|---|
Streamové šifry | |
Síť Feistel | |
Síť SP | |
jiný |