Cs-cipher ( fr. Chiffrement Symètrique , symetrická šifra) je symetrický 64bitový [1] blokový šifrovací algoritmus dat [2] využívající délku klíče až 128 bitů [1] . Podle principu fungování se jedná o 8kolovou SP-síť [3] .
Cs-šifru vyvinuli v roce 1998 Jacques Stern a Serge Vaudenay [ 4 ] s podporou Compagnie des Signaux [ 5] . Byl předložen jako kandidát v projektu NESSIE programu Evropské komise IST ( Information Societies Technology ) v soutěžní skupině pro 64bitové blokové šifry [6] . Navzdory tomu, že studie nenašla žádné zranitelnosti [7] , nebyla šifra vybrána pro 2. fázi projektu [8] , protože se ukázala jako nejpomalejší ve své skupině [7] .
Začněme s následujícím zápisem:
X | 0 | jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | A | b | C | d | E | F |
F | d | b | b | 7 | 5 | 7 | 7 | E | d | A | b | E | d | E | F | |
A | 6 | 0 | 2 | b | E | jeden | osm | d | čtyři | 5 | 3 | F | C | 7 | 9 |
xy | .0 | .jeden | .2 | .3 | .čtyři | .5 | .6 | .7 | .osm | .9 | .A | .b | .C | .d | .E | .F |
0. | 29 | 0d | 61 | 40 | 9c | eb | 9e | 8f | lf | 85 | 5f | 58 | 5b | 01 | 39 | 86 |
jeden. | 97 | 2e | d7 | d6 | 35 | ae | 17 | 16 | 21 | b6 | 69 | 4e | a5 | 72 | 87 | 08 |
2. | 3c | osmnáct | e6 | e7 | fa | inzerát | b8 | 89 | b7 | 00 | f7 | 6f | 73 | 84 | jedenáct | 63 |
3. | 3f | 96 | 7f | 6e | bf | čtrnáct | 9d | ac | a4 | 0e | 7e | f6 | dvacet | 4a | 62 | třicet |
čtyři. | 03 | c5 | 4b | 5a | 46 | a3 | 44 | 65 | 7d | 4d | 3d | 42 | 79 | 49 | 1b | 5c |
5. | f5 | 6c | b5 | 94 | 54 | ff | 56 | 57 | 0b | f4 | 43 | 0c | 4f | 70 | 6d | 0a |
6. | e4 | 02 | 3e | 2f | a2 | 47 | e0 | c1 | d5 | 1a | 95 | a7 | 51 | 5e | 33 | 2b |
7. | 5 d | d4 | 1d | 2c | ee | 75 | ec | dd | 7c | 4c | a6 | b4 | 78 | 48 | 3a | 32 |
osm. | 98 | af | c0 | e1 | 2d | 09 | 0f | 1e | b9 | 27 | 8a | e9 | bd | e3 | 9f | 07 |
9. | b1 | ea | 92 | 93 | 53 | 6a | 31 | deset | 80 | f2 | d8 | 9b | 04 | 36 | 06 | 8e |
A. | být | a9 | 64 | 45 | 38 | 1c | 7a | 6b | f3 | a1 | f0 | CD | 37 | 25 | patnáct | 81 |
b. | fb | 90 | e8 | d9 | 7b | 52 | 19 | 28 | 26 | 88 | fc | d1 | e2 | 8c | a0 | 34 |
C. | 82 | 67 | da | cb | c7 | 41 | e5 | c4 | c8 | ef | db | c3 | cc | ab | ce | vyd |
d. | d0 | bb | d3 | d2 | 71 | 68 | 13 | 12 | 9a | b3 | c2 | ca | de | 77 | DC | df |
E. | 66 | 83 | před naším letopočtem | 8d | 60 | c6 | 22 | 23 | b2 | 8b | 91 | 05 | 76 | srov | 74 | c9 |
F. | aa | f1 | 99 | a8 | 59 | padesáti | 3b | 2a | např | f9 | 24 | b0 | ba | fd | f8 | 55 |
Níže je uveden seznam konstant definovaných tvůrci algoritmu:
Pokud je tajný klíč použitý v šifře menší než 128 bitů, pak jsou první bity vyplněny nulami [1] , takže v budoucnu budeme za tajný klíč považovat 128 bitů.
Podle následujícího algoritmu se v šifře ze 128bitového klíče vygeneruje 9 podklíčů o velikosti 64 bitů:
Vezměme si příklad generování klíče, který popsali tvůrci CS-cipher [13] . Používá tajný klíč
0123456789abcdeffedcba9876543210 .Podle výše uvedeného získáme počáteční parametry pro generování kulatých klíčů:
0123456789abcdef fedcba9876543210Zvažte generování klíčů podrobně :
0123456789abcdef 290d61409ceb9e8f b711fa89ae0394e4 fedcba9876543210 bb21a9e2388bacd4Konečný výsledek generovacího algoritmu:
45fd137a4edf9ec4 1dd43f03e6f7564c ebe26756de9937c7 961704e945bad4fb 0b60dfe9eff473d4 76d3e7cf52c466cf 75ec8cef767d3a0d 82da3337b598fd6d fbd820da8dc8af8cKaždé kolo šifrování začíná operací XOR na příchozím 64bitovém řetězci a podklíči. Poté se 64bitový řetězec rozdělí na 4 16bitové řetězce, nad kterými proběhne nelineární transformace ( ). Řetězce jsou poté znovu rozděleny, tentokrát výsledkem je 8 8bitových řetězců, které jsou poté prohozeny. Tyto akce se v každém kole opakují ještě dvakrát, rozdíl je pouze v tom, že operace XOR nastává s danými konstantami, nikoli s vygenerovaným klíčem. Po posledním kole následuje dodatečná operace XOR se zbývajícím vygenerovaným klíčem [3] .
Nejprve definujme:
Funkce round se skládá z následujících akcí [15] :
Šifrování se skládá z 8 kol, konečný 64bitový šifrovaný text lze vypočítat z fragmentu otevřeného textu pomocí vzorce [9] :
Kde je výše popsaná funkce round [10] .
Příklad šifrování prostého textuVezměme si příklad šifrování prostého textu popsaného tvůrci CS-šifry [13] . Používá následující tajný klíč a prostý text:
0123456789abcdef 0123456789abcdeffedcba9876543210Tajný klíč odpovídá výše uvedenému příkladu generování kulatého klíče, tj. kulaté klíče byly vypočteny výše:
45fd137a4edf9ec4 1dd43f03e6f7564c ebe26756de9937c7 961704e945bad4fb 0b60dfe9eff473d4 76d3e7cf52c466cf 75ec8cef767d3a0d 82da3337b598fd6d fbd820da8dc8af8cPrůběžné výsledky pro výpočet :
d85c19785690b0e3 0f4bfb9e2f8ac7e2V kolech dostáváme následující hodnoty:
c3feb96c0cf4b649 3f54e0c8e61a84d1 b15cb4af3786976e 76c122b7a562ac45 21300b6ccfaa08d8 99b8d8ab9034ec9a a2245ba3697445d2V důsledku toho jsme obdrželi následující šifrovaný text:
88fddfbe954479d7 DešifrováníDešifrování se skládá z 8 kol, opak šifrování [16] . Je důležité, aby dešifrovací algoritmus používal vygenerované klíče v opačném pořadí, tj. [2] . Před zahájením probíhá operace .
Pro pohodlí a konzistenci zápisu ještě jednou uvádíme:
Pro každé kolo se nazývá následující sekvence akcí [13] :
V průběhu účasti v projektu NESSIE bylo provedeno mnoho statistických testů na zašifrovaných datech [17] , včetně:
V důsledku testování šifry nebyly zjištěny žádné odchylky od náhodného rozdělení [23] .
Předpokládejme, že máme kulatou šifru, šifrový text lze získat vzorcem: , ve kterém každé kolo používá svůj vlastní klíč .
Pak Markovova šifra je šifra, pro kterou pro libovolné kolo a libovolné , a , máme [24] :
Analýza využívá modifikovanou CS-šifru, dále jen CSC.
Získává se z CS-šifry následující substitucí:
Výsledná CSC šifra je 24 kruhová bloková Markovova šifra [26] .
Pro šifru CSC bylo prokázáno následující:
Proto se předpokládá, že CS-šifra:
Existuje implementace tohoto šifrovacího algoritmu v C [31] (poskytli autoři):
# definovat CSC_C10 0xbf # definovat CSC_C11 0x71 # definovat CSC_C12 0x58 # definovat CSC_C13 0x80 # definovat CSC_C14 0x9c # definovat CSC_C15 0xf4 # definovat CSC_C16 0xf3 # definovat CSC_C17 0xc7 uint8 tbp[256]={ 0x29,0x0d,0x61,0x40,0x9c,0xeb,0x9e,0x8f, 0x1f,0x85,0x5f,0x58,0x5b,0x01,0x39,0x86, 0x97,0x2e,0xd7,0xd6,0x35,0xae,0x17,0x16, 0x21,0xb6,0x69,0x4e,0xa5,0x72,0x87,0x08, 0x3c,0x18,0xe6,0xe7,0xfa,0xad,0xb8,0x89, 0xb7,0x00,0xf7,0x6f,0x73,0x84,0x11,0x63, 0x3f,0x96,0x7f,0x6e,0xbf,0x14,0x9d,0xac, 0xa4,0x0e,0x7e,0xf6,0x20,0x4a,0x62,0x30, 0x03,0xc5,0x4b,0x5a,0x46,0xa3,0x44,0x65, 0x7d,0x4d,0x3d,0x42,0x79,0x49,0x1b,0x5c, 0xf5,0x6c,0xb5,0x94,0x54,0xff,0x56,0x57, 0x0b,0xf4,0x43,0x0c,0x4f,0x70,0x6d,0x0a, 0xe4,0x02,0x3e,0x2f,0xa2,0x47,0xe0,0xc1, 0xd5,0x1a,0x95,0xa7,0x51,0x5e,0x33,0x2b, 0x5d,0xd4,0x1d,0x2c,0xee,0x75,0xec,0xdd, 0x7c,0x4c,0xa6,0xb4,0x78,0x48,0x3a,0x32, 0x98,0xaf,0xc0,0xe1,0x2d,0x09,0x0f,0x1e, 0xb9,0x27,0x8a,0xe9,0xbd,0xe3,0x9f,0x07, 0xb1,0xea,0x92,0x93,0x53,0x6a,0x31,0x10, 0x80,0xf2,0xd8,0x9b,0x04,0x36,0x06,0x8e, 0xbe,0xa9,0x64,0x45,0x38,0x1c,0x7a,0x6b, 0xf3,0xa1,0xf0,0xcd,0x37,0x25,0x15,0x81, 0xfb,0x90,0xe8,0xd9,0x7b,0x52,0x19,0x28, 0x26,0x88,0xfc,0xd1,0xe2,0x8c,0xa0,0x34, 0x82,0x67,0xda,0xcb,0xc7,0x41,0xe5,0xc4, 0xc8,0xef,0xdb,0xc3,0xcc,0xab,0xce,0xed, 0xd0,0xbb,0xd3,0xd2,0x71,0x68,0x13,0x12, 0x9a,0xb3,0xc2,0xca,0xde,0x77,0xdc,0xdf, 0x66,0x83,0xbc,0x8d,0x60,0xc6,0x22,0x23, 0xb2,0x8b,0x91,0x05,0x76,0xcf,0x74,0xc9, 0xaa,0xf1,0x99,0xa8,0x59,0x50,0x3b,0x2a, 0xfe,0xf9,0x24,0xb0,0xba,0xfd,0xf8,0x55, }; void enc_csc(uint8 m[8],uint8* k) { uint8 tmpx,tmprx,tmpy; int i; #define APPLY_M(cl,cr,adl,adr) \ code=tmpx=m[adl]^cl; \ kód=tmpx=(tmpx<<1)^(tmpx>>7); \ code=tmpy=m[adr]^cr; \ code=m[adl]=tbp[(tmprx&0x55)^tmpx^tmpy]; \ code=m[adr]=tbp[tmprx^tmpy]; for(code=i=0;i<8;i++,k+=8) { APPLY_M(k[0];k[1];0;1) APPLY_M(k[2];k[3];2;3) APPLY_M(k[4];k[5];4;5) APPLY_M(k[6];k[7];6;7) POUŽÍT_M(CSC_C00;CSC_C01;0;2) POUŽÍT_M(CSC_C02;CSC_C03;4;6) POUŽÍT_M(CSC_C04;CSC_C05;1;3) POUŽÍT_M(CSC_C06;CSC_C07;5;7) POUŽÍT_M(CSC_C10;CSC_C11;0;4) POUŽÍT_M(CSC_C12;CSC_C13;1;5) POUŽÍT_M(CSC_C14;CSC_C15;2;6) POUŽÍT_M(CSC_C16;CSC_C17;3;7) } for(code=i=0;i<8;i++) kód=m[i]^=k[i]; }kód šifrovacího algoritmu v C
Autoři také shromáždili statistiku rychlosti šifrování dat, která se ukázala být rychlejší než DES [5] :
plošina | hodinová frekvence | rychlost šifrování |
VLSI 1216n a 1mm | 230 MHz | 73 Mbps |
VLSI 30000n a 15mm | 230 MHz | 2 Gbps |
standardní C 32bit | 133 MHz | 2 Mbps |
bit slice (Pentium) | 133 MHz | 11 Mbps |
bitový řez (Alpha) | 300 MHz | 196 Mbps |
Kód sestavy Pentium | 133 MHz | 8 Mbps |
6805 montážní kód | 4 MHz | 20 kbps |
Na základě CS-šifry v roce 2004 od Toma St. Denis vyvinul 128bitovou šifru -cipher [32] .
Výsledná šifra byla testována a bylo zjištěno, že je odolná vůči:
Symetrické kryptosystémy | |
---|---|
Streamové šifry | |
Síť Feistel | |
Síť SP | |
jiný |