A Cs-cipher ( fr. Chiffrement Symètrique , szimmetrikus titkosítás ) egy szimmetrikus 64 bites [1] blokk adattitkosítási algoritmus [2] , amely legfeljebb 128 bites kulcsot használ [1] . Működési elve szerint 8 körből álló SP-hálózat [3] .
A Cs- ciphert 1998-ban fejlesztette ki Jacques Stern és Serge Vaudenay [ 4 ] a Compagnie des Signaux [ 5] támogatásával . Az Európai Bizottság IST ( Information Societies Technology ) programjának NESSIE projektjében jelölték be a 64 bites blokk titkosítások versenycsoportjában [6] . Annak ellenére, hogy a tanulmány nem talált sebezhetőséget [7] , a titkosítást nem választották a projekt 2. fázisához [8] , mert az bizonyult a leglassabbnak a csoportjában [7] .
Kezdjük a következő jelöléssel:
x | 0 | egy | 2 | 3 | négy | 5 | 6 | 7 | nyolc | 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 | egy | nyolc | d | négy | 5 | 3 | f | c | 7 | 9 |
xy | .0 | .egy | .2 | .3 | .négy | .5 | .6 | .7 | .nyolc | .9 | .a | .b | .c | .d | .e | .f |
0. | 29 | 0d | 61 | 40 | 9c | eb | 9e | 8f | 1f | 85 | 5f | 58 | 5b | 01 | 39 | 86 |
egy. | 97 | 2e | d7 | d6 | 35 | ae | 17 | 16 | 21 | b6 | 69 | 4e | a5 | 72 | 87 | 08 |
2. | 3c | tizennyolc | e6 | e7 | fa | hirdetés | b8 | 89 | b7 | 00 | f7 | 6f | 73 | 84 | tizenegy | 63 |
3. | 3f | 96 | 7f | 6e | bf | tizennégy | 9d | ac | a4 | 0e | 7e | f6 | húsz | 4a | 62 | harminc |
négy. | 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. | 5d | d4 | 1d | 2c | ee | 75 | ec | dd | 7c | 4c | a6 | b4 | 78 | 48 | 3a | 32 |
nyolc. | 98 | af | c0 | e1 | 2d | 09 | 0f | 1e | b9 | 27 | 8a | e9 | bd | e3 | 9f | 07 |
9. | b1 | ea | 92 | 93 | 53 | 6a | 31 | tíz | 80 | f2 | d8 | 9b | 04 | 36 | 06 | 8e |
a. | lenni | a9 | 64 | 45 | 38 | 1c | 7a | 6b | f3 | a1 | f0 | CD | 37 | 25 | tizenöt | 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 | szerk |
d. | d0 | bb | d3 | d2 | 71 | 68 | 13 | 12 | 9a | b3 | c2 | kb | de | 77 | dc | df |
e. | 66 | 83 | időszámításunk előtt | 8 D | 60 | c6 | 22 | 23 | b2 | 8b | 91 | 05 | 76 | vö | 74 | c9 |
f. | aa | f1 | 99 | a8 | 59 | ötven | 3b | 2a | fe | f9 | 24 | b0 | ba | fd | f8 | 55 |
Az alábbiakban az algoritmus készítői által meghatározott állandók listája található:
Ha a rejtjelezésben használt titkos kulcs 128 bitnél kisebb, akkor az első biteket nullákkal töltjük fel [1] , így a jövőben a titkos kulcsot 128 bitesnek fogjuk tekinteni.
A következő algoritmus szerint egy 128 bites kulcsból 9 db 64 bites alkulcs jön létre a titkosításban:
Vegyünk egy példát a kulcsgenerálásra, amelyet a CS-cipher [13] alkotói írnak le . Titkos kulcsot használ
0123456789abcdeffedcba9876543210 .A fentiek szerint megkapjuk a kerek kulcsok generálásához szükséges kezdeti paramétereket:
0123456789abcdef fedcba9876543210Fontolja meg részletesen a kulcsgenerálást :
0123456789abcdef 290d61409ceb9e8f b711fa89ae0394e4 fedcba9876543210 bb21a9e2388bacd4A generáló algoritmus végeredménye:
45fd137a4edf9ec4 1dd43f03e6f7564c ebe26756de9937c7 961704e945bad4fb 0b60dfe9eff473d4 76d3e7cf52c466cf 75ec8cef767d3a0d 82da3337b598fd6d fbd820da8dc8af8cA titkosítás minden köre egy XOR művelettel kezdődik a bejövő 64 bites karakterláncon és alkulcson. Ezután a 64 bites karakterlánc 4 darab 16 bites stringre oszlik, amelyeken egy nemlineáris transzformáció ( ) történik. A karakterláncok ezután ismét felosztásra kerülnek, ezúttal 8 darab 8 bites karakterláncot eredményezve, amelyeket ezután felcserélnek. Ezek a műveletek minden körben még kétszer megismétlődnek, az egyetlen különbség az, hogy az XOR művelet a megadott konstansokkal történik, és nem a generált kulccsal. Az utolsó kört egy további XOR művelet követi a fennmaradó generált kulccsal [3] .
Először határozzuk meg:
A kerek funkció a következő műveletekből áll [15] :
A titkosítás 8 körből áll, a végső 64 bites titkosított szöveg a nyílt szöveg töredékből a [9] képlet segítségével számítható ki :
Hol van a fent leírt kerek függvény [10] .
Példa egyszerű szöveges titkosításraVegyünk egy példát a CS-cipher [13] alkotói által leírt egyszerű szöveges titkosításra . A következő titkos kulcsot és egyszerű szöveget használja:
0123456789abcdef 0123456789abcdeffedcba9876543210A titkos kulcs megfelel a fenti körkulcsgenerálási példának, azaz a kerek kulcsokat fentebb kiszámítottuk:
45fd137a4edf9ec4 1dd43f03e6f7564c ebe26756de9937c7 961704e945bad4fb 0b60dfe9eff473d4 76d3e7cf52c466cf 75ec8cef767d3a0d 82da3337b598fd6d fbd820da8dc8af8cKöztes eredmények a számításhoz :
d85c19785690b0e3 0f4bfb9e2f8ac7e2A fordulókon a következő értékeket kapjuk:
c3feb96c0cf4b649 3f54e0c8e61a84d1 b15cb4af3786976e 76c122b7a562ac45 21300b6ccfaa08d8 99b8d8ab9034ec9a a2245ba3697445d2Ennek eredményeként a következő rejtjelezett szöveget kaptuk:
88fddfbe954479d7 MegfejtésA visszafejtés 8 körből áll, a titkosítás fordítottja [16] . Fontos, hogy a visszafejtő algoritmus a generált kulcsokat fordított sorrendben használja, azaz [2] . Kezdés előtt a művelet megtörténik .
A jelölések egyszerűsége és következetessége érdekében még egyszer jelezzük:
Minden körben a következő akciósorozatot nevezzük [13] :
A NESSIE projektben való részvétel során számos statisztikai tesztet végeztek titkosított adatokon [17] , többek között:
A rejtjel tesztelésének eredményeként nem találtunk eltérést a véletlenszerű eloszlástól [23] .
Tegyük fel, hogy van egy kerek rejtjel, a rejtjelezett szöveget a következő képlettel kaphatjuk meg: , amelyben minden kör a saját kulcsát használja .
Ekkor a Markov-rejtjel olyan rejtjel, amelyhez bármely körhöz és bármely , és , van [24] :
Az elemzés egy módosított CS-rejtjelet használ, a továbbiakban: CSC.
A CS-rejtjelből a következő helyettesítéssel kapjuk meg:
A kapott CSC-rejtjel egy 24 körből álló Markov-rejtjel [26] .
A CSC-rejtjel esetében a következők bizonyultak:
Ezért feltételezzük, hogy a CS-rejtjel:
Ennek a titkosítási algoritmusnak van egy implementációja a C-ben [31] (a szerzők által biztosított):
# definiálja a CSC_C10 0xbf-t # definiálja a CSC_C11 0x71-et # definiálja a CSC_C12 0x58-at # definiálja a CSC_C13 0x80-at # definiálja a CSC_C14 0x9c-t # definiálja a CSC_C15 0xf4-et # definiálja a CSC_C16 0xf3-at # definiálja a CSC_C17 0xc7-et 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) \ kód=tmpx=m[adl]^cl; \ kód=tmpx=(tmpx<<1)^(tmpx>>7); \ code=tmpy=m[adr]^cr; \ kód=m[adl]=tbp[(tmprx&0x55)^tmpx^tmpy]; \ kód=m[adr]=tbp[tmprx^tmpy]; for(kód=i=0;i<8;i++,k+=8) { ALKALMAZÁS_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) APPLY_M(CSC_C00;CSC_C01;0;2) APPLY_M(CSC_C02;CSC_C03;4;6) APPLY_M(CSC_C04;CSC_C05;1,3) APPLY_M(CSC_C06;CSC_C07;5;7) APPLY_M(CSC_C10;CSC_C11;0,4) APPLY_M(CSC_C12;CSC_C13;1,5) APPLY_M(CSC_C14;CSC_C15;2;6) APPLY_M(CSC_C16;CSC_C17;3;7) } for(code=i=0;i<8;i++) kód=m[i]^=k[i]; }titkosítási algoritmus kódja C-ben
A szerzők adattitkosítási sebességi statisztikákat is gyűjtöttek, amelyek gyorsabbnak bizonyultak, mint a DES [5] :
Adattitkosítási sebesség CS-rejtjelfelület | órajel frekvenciája | titkosítási sebesség |
VLSI 1216n és 1mm | 230 MHz | 73 Mbps |
VLSI 30000n és 15mm | 230 MHz | 2 Gbps |
szabványos C 32 bites | 133 MHz | 2 Mbps |
bit szelet (Pentium) | 133 MHz | 11 Mbps |
bit szelet (alfa) | 300 MHz | 196 Mbps |
Pentium összeállítási kód | 133 MHz | 8 Mbps |
6805 összeállítási kód | 4 MHz | 20 Kbps |
A CS-cipher alapján 2004 -ben, Tom St. Denis kifejlesztett egy 128 bites titkosítást [ 32] .
A kapott titkosítást tesztelték, és ellenállónak találták:
Szimmetrikus titkosítási rendszerek | |
---|---|
Rejtjelfolyam adatfolyam | |
Feistel hálózat | |
SP hálózat | |
Egyéb |