Py (chiffer)
Py är ett strömchiffer som skickats till eSTREAM av Eli Biham och Jennifer Seberry . Det är en av de snabbaste eSTREAM-kandidaterna med cirka 2,6 cykler per byte på vissa plattformar. Den har en struktur lite som RC4 , men lägger till en array med 260 32-bitars ord som indexeras med hjälp av en permutation av bytes, och producerar 64 bitar i varje omgång.
Författarna hävdar att namnet uttalas "Roo", en hänvisning till chifferns australiska ursprung, genom att läsa bokstäverna "Py" som kyrilliska (Ру) snarare än latinska tecken. Detta något perversa uttal tolkas som deras svar, på skämt, på det svåruttalade namnet Rijndael för chifferet som antogs som Advanced Encryption Standard .
- Det ursprungliga förslaget från april 2005 inkluderade chifferet Py och en förenklad version Py6. Det senare minskar storleken på vissa interna tabeller, vilket ger en kraftigt reducerad kostnad för nyckelschemaläggning, på bekostnad av en kortare maximal utmatningslängd.
- I juni 2006 beskrev författarna Pypy (ännu mer förvirrande, halvkyrillisk Pyру och därmed uttalade "Pyroo") som en valfri starkare variant. Detta utelämnar ett av utgående ord från varje iteration av Py och fungerar således med något över halva hastigheten av Py. (Faktiskt ungefär 0,6×.)
- I januari 2007 ändrades nyckelschemaalgoritmen och producerade "tweakade" varianter TPy, TPypy och TPy6. För att vara exakt är den första (nyckelberoende) fasen oförändrad, men den andra (IV-inställningsfasen) har ett felkorrigerat. De runda funktionerna som används för att producera utdata är identiska.
- Vid Indocrypt 2007 föreslog Gautham Sekar, Souradyuti Paul och Bart Preneel två nya chiffer RCR-32 och RCR-64 baserade på designprinciperna för Pypy respektive Py. Dessa ersätter en variabel rotation i Py med en fast rotation, vilket eliminerar en attack och påskyndar chifferet något. TPy-nyckelschemat används oförändrat.
Attacker mot Py-familjen
Från och med 2006 kan den bästa kryptoanalytiska attacken på Py (av Hongjun Wu och Bart Preneel ) under vissa omständigheter (t.ex. där IV är mycket längre än nyckeln) återställa nyckeln som ges partiella nyckelströmmar för 2 24 valda IVs [1] .
I ett svårare scenario ur angriparens synvinkel, givet endast känd klartext (snarare än vald klartext), finns det också en särskiljande attack på nyckelströmmen (av Paul Crowley) som kräver cirka 2 72 byte utdata och jämförbar tid. Detta är en förbättring av en attack presenterad av Gautham Sekar, Souradyuti Paul och Bart Preneel som kräver 2 88 byte. Det finns fortfarande en debatt om huruvida dessa attacker utgör ett akademiskt avbrott av Py. När angriparna hävdar att ovanstående attacker kan byggas med en arbetsbelastning som är mindre än den uttömmande sökningen under designspecifikationerna för Py och därför är det helt klart ett teoretiskt avbrott i chifferet, utesluter designerna attackerna eftersom Pys säkerhetsgränser begränsar alla angripare till totalt 2 64 byte utdata över alla nyckelströmmar överallt. En nyligen genomförd revidering av Paul , Preneel och Sekar paper inkluderar en detaljerad diskussion av denna fråga i avsnitt 9. Det finns inga tvivel om legitimiteten av Wu och Preneel attacken.
Py valdes ut som Fas 2 Focus Candidate för Profil 1 (mjukvara) av eSTREAM -projektet [2] men gick inte vidare till Fas 3 på grund av Wu och Preneel valda IV-attacken. [3] .
I januari 2007 har tre nya chiffer, nämligen TPy, TPypy och TPy6, föreslagits av Pys designers för att eliminera ovanstående attacker. TPy är fortfarande sårbar mot ovanstående utmärkande attacker av Paul et al. (komplexitet 2 88 ) och Crowley (komplexitet 2 72 ), som inte beror på nyckelschemat. Den bästa attacken hittills på TPypy, som antas vara den starkaste av Py-familjen av chiffer, är av Sekar et al. vilket är en utmärkande attack med datakomplexitet 2 281 . Denna attack är bara meningsfull om nyckelstorleken på TPypy är längre än 281 bitar.
För att ta bort attacker på TPy och TPypy gav Sekar, Paul och Preneel vid Indocrypt 2007 förslag på två nya chiffer RCR-32 och RCR-64. Hittills har det inte förekommit några attacker mot RCR-32 och RCR-64.
Runda funktioner
Py är baserad på idén om "sliding arrays": arrays indexeras i förhållande till en startpekare, som flyttas fram med ett ord varje omgång. Där modulo-indexering är tillgänglig (hårdvara och många digitala signalprocessorer ) kan dessa implementeras som cirkulära buffertar . I mjukvara är dessa enklast implementerade som stora arrayer. När slutet av arrayen nås, kopieras arbetsdelarna tillbaka till början och operationerna fortsätter.
P-matrisen på 256 byte innehåller en permutation med 256 poster (varje byte visas exakt en gång), medan Y-matrisen innehåller 260 32-bitars ord.
0
#inkludera <stdint.h> #define ROTL32(x, s) ((x)<<(s) | (x)>>(32-(s))) uint8_t * P ; // P[0] till P[255] är aktiva uint32_t * Y ; // Y[-3] till Y[256] är aktiva uint32_t s ; uint32_t * utgång ; while ( output_words -- ) { int i = Y [ 185 ] % 256 ; P [ 256 ] = P [ i ]; // Detta byter effektivt P[0] och P[i] P [ i ] = P [ ]; // Kopierar sedan P[0] till P[256] P ++ ; // Tidigare P[1] är nytt P[0], nyskrivet P[256] är nytt P[255] s += Y [ P [ 72 ]] - Y [ P [ 239 ]]; s = ROTL32 ( s , ( P [ 116 ] + 18 ) % 32 ); * utgång ++ = ( ROTL32 ( s , 25 ) ^ Y [ 256 ]) + Y [ P [ 26 ]]; // Denna rad utelämnad från Pypy & TPypy * output ++ = ( s ^ Y [ -1 ] ) + Y [ P [ 208 ]]; Y [ 257 ] = ( ROTL32 ( s , 14 ) ^ Y [ -3 ] ) + Y [ P [ 153 ]]; Y ++ ; // Tidigare P[-2] är nytt P[-3], nyskrivet P[257] är nytt P[256] }
När byteutmatning krävs specificerar Py att utdataorden konverteras little-endian.
Rad 17 är utelämnad från Pypy, Tpypy och RCR-32.
RCR-32 och RCR-64 är identiska med ovanstående, förutom att linje 15 ändras till en fast vänsterrotation på 19 bitar.
Py6 har samma struktur, men P- och Y-matriserna är förkortade till 64 byte respektive 68 ord. P-poster är bara 6 bitar långa, en besparing som skulle kunna utnyttjas i dedikerad hårdvara. De olika offseten till P[]
och Y[]
modifieras naturligtvis, vilket gör den inre slingan:
0
while ( output_words -- ) { int i = Y [ 43 ] % 64 ; P [ 64 ] = P [ i ]; P [ i ] = P [ ]; P ++ ; s += Y [ P [ 18 ]] - Y [ P [ 57 ]]; s = ROTL32 ( s , ( P [ 26 ] +18 ) % 32 ) ; * utgång ++ = ( ROTL32 ( s , 25 ) ^ Y [ 64 ]) + Y [ P [ 8 ]]; * utgång ++ = ( s ^ Y [ -1 ]) + Y [ P [ 21 ]]; Y [ 65 ] = ( ROTL32 ( s , 14 ) ^ Y [ -3 ]) + Y [ P [ 48 ]]; Y ++ ; }
externa länkar
- Eli Biham , Jennifer Seberry , Py specifikation ( PostScript )
- Eli Biham , Jennifer Seberry , Tweaking IV-installationen av Py Family of Stream Ciphers - The Chiphers TPy, TPypy och TPy6
- eStream-sida på Py
- Paul Crowley, Cryptanalysis of Py
- Souradyuti Paul , Bart Preneel , Gautham Sekar, Distinguishing attacks on the stream cipher Py , FSE 2006.
- Gautham Sekar, Souradyuti Paul , Bart Preneel , Weaknesses in the Pseudorandom Bit Generation Algorithms of the Stream Chiphers TPypy and TPy , IACR-ePrint-rapport.
- Souradyuti Paul , Bart Preneel , On the (O)security of Stream Ciphers Based on Arrays and Modular Addition (full version) , Asicrypt 2006.
- Gautham Sekar, Souradyuti Paul , Bart Preneel , Related-key Attacks on the Py-family of Ciphers and an Approach to Repair the Weaknesses , Indocrypt 2007.
- Rijndael-sidan - "Rijndael FAQ" är försiktigt parodierad i Appendix B i Py-specifikationen.