Cs-cipher ( fr. Chiffrement Symètrique , simetric cipher) este un algoritm simetric de criptare a datelor bloc de 64 de biți [1] [2] care utilizează o lungime a cheii de până la 128 de biți [1] . Conform principiului de funcționare, este o rețea SP cu 8 runde [3] .
Cs-cipher a fost dezvoltat în 1998 de Jacques Stern și Serge Vaudenay [ 4 ] cu sprijinul Compagnie des Signaux [5] . A fost depus ca candidat în proiectul NESSIE al programului IST ( Information Societies Technology ) al Comisiei Europene în grupul de concurs pentru cifruri bloc pe 64 de biți [6] . În ciuda faptului că studiul nu a găsit vulnerabilități [7] , cifrul nu a fost ales pentru faza a 2-a a proiectului [8] deoarece s-a dovedit a fi cel mai lent din grupul său [7] .
Să începem cu următoarea notație:
X | 0 | unu | 2 | 3 | patru | 5 | 6 | 7 | opt | 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 | unu | opt | d | patru | 5 | 3 | f | c | 7 | 9 |
X y | .0 | .unu | .2 | .3 | .patru | .5 | .6 | .7 | .opt | .9 | .A | .b | .c | .d | .e | .f |
0. | 29 | 0d | 61 | 40 | 9c | eb | 9e | 8f | 1f | 85 | 5f | 58 | 5b | 01 | 39 | 86 |
unu. | 97 | 2e | d7 | d6 | 35 | ae | 17 | 16 | 21 | b6 | 69 | 4e | a5 | 72 | 87 | 08 |
2. | 3c | optsprezece | e6 | e7 | fa | anunț | b8 | 89 | b7 | 00 | f7 | 6f | 73 | 84 | unsprezece | 63 |
3. | 3f | 96 | 7f | 6e | bf | paisprezece | 9d | ac | a4 | 0e | 7e | f6 | douăzeci | 4a | 62 | treizeci |
patru. | 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 |
opt. | 98 | af | c0 | e1 | 2d | 09 | 0f | 1e | b9 | 27 | 8a | e9 | bd | e3 | 9f | 07 |
9. | b1 | ea | 92 | 93 | 53 | 6a | 31 | zece | 80 | f2 | d8 | 9b | 04 | 36 | 06 | 8e |
A. | fi | a9 | 64 | 45 | 38 | 1c | 7a | 6b | f3 | a1 | f0 | CD | 37 | 25 | cincisprezece | 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 | ed |
d. | d0 | bb | d3 | d2 | 71 | 68 | 13 | 12 | 9a | b3 | c2 | ca | de | 77 | DC | df |
e. | 66 | 83 | bc | 8 D | 60 | c6 | 22 | 23 | b2 | 8b | 91 | 05 | 76 | cf | 74 | c9 |
f. | aa | f1 | 99 | a8 | 59 | cincizeci | 3b | 2a | fe | f9 | 24 | b0 | ba | fd | f8 | 55 |
Mai jos este o listă de constante definite de creatorii algoritmului:
Dacă cheia secretă folosită în cifru este mai mică de 128 de biți, atunci primii biți sunt umpluți cu zerouri [1] , așa că în viitor vom considera cheia secretă a fi de 128 de biți.
Conform următorului algoritm, 9 subchei cu dimensiunea de 64 de biți sunt generate în cifr de la o cheie de 128 de biți:
Luați în considerare un exemplu de generare a cheilor descris de creatorii CS-cipher [13] . Folosește o cheie secretă
0123456789abcdeffedcba9876543210 .Conform celor de mai sus, obținem parametrii inițiali pentru generarea cheilor rotunde:
0123456789abcdef fedcba9876543210Luați în considerare generarea cheilor în detaliu :
0123456789abcdef 290d61409ceb9e8f b711fa89ae0394e4 fedcba9876543210 bb21a9e2388bacd4Rezultatul final al algoritmului de generare:
45fd137a4edf9ec4 1dd43f03e6f7564c ebe26756de9937c7 961704e945bad4fb 0b60dfe9eff473d4 76d3e7cf52c466cf 75ec8cef767d3a0d 82da3337b598fd6d fbd820da8dc8af8cFiecare rundă de criptare începe cu o operațiune XOR pe șirul și subcheia primite pe 64 de biți. Apoi șirul de 64 de biți este împărțit în 4 șiruri de 16 biți, peste care are loc o transformare neliniară ( ). Șirurile sunt apoi împărțite din nou, de data aceasta rezultând 8 șiruri de 8 biți, care sunt apoi schimbate. Aceste acțiuni se repetă încă de două ori în fiecare rundă, singura diferență este că operația XOR are loc cu constantele date, și nu cu cheia generată. Ultima rundă este urmată de o operație XOR suplimentară cu cheia generată rămasă [3] .
Să definim mai întâi:
Funcția rotundă constă din următoarele acțiuni [15] :
Criptarea constă din 8 runde, textul cifrat final pe 64 de biți poate fi calculat din fragmentul de text simplu folosind formula [9] :
Unde este funcția rotundă [10] , descrisă mai sus.
Exemplu de criptare în text simpluLuați în considerare un exemplu de criptare în text simplu descris de creatorii CS-cipher [13] . Utilizează următoarea cheie secretă și text simplu:
0123456789abcdef 0123456789abcdeffedcba9876543210Cheia secretă corespunde exemplului de generare a cheii rotunde de mai sus, adică cheile rotunde au fost calculate mai sus:
45fd137a4edf9ec4 1dd43f03e6f7564c ebe26756de9937c7 961704e945bad4fb 0b60dfe9eff473d4 76d3e7cf52c466cf 75ec8cef767d3a0d 82da3337b598fd6d fbd820da8dc8af8cRezultate intermediare pentru calcul :
d85c19785690b0e3 0f4bfb9e2f8ac7e2Obținem următoarele valori pe runde:
c3feb96c0cf4b649 3f54e0c8e61a84d1 b15cb4af3786976e 76c122b7a562ac45 21300b6ccfaa08d8 99b8d8ab9034ec9a a2245ba3697445d2Drept urmare, am primit următorul text cifrat:
88fddfbe954479d7 DescifrareDecriptarea constă din 8 runde, inversul criptării [16] . Este important ca algoritmul de decriptare să folosească cheile generate în ordine inversă, adică [2] . Înainte de începere, operația are loc .
Pentru comoditate și coerență a notării, indicăm încă o dată:
Pentru fiecare rundă, următoarea secvență de acțiuni se numește [13] :
Pe parcursul participării la proiectul NESSIE au fost efectuate multe teste statistice pe date criptate [17] , printre care:
Ca urmare a testării cifrului, nu s-au găsit abateri de la distribuția aleatorie [23] .
Să presupunem că avem un cifru rotund, textul cifrat poate fi obținut prin formula: , în care fiecare rundă folosește propria cheie .
Atunci un cifr Markov este un cifr pentru care, pentru orice rundă și orice , și , avem [24] :
Analiza utilizează un cifr CS modificat, denumit în continuare CSC.
Se obține din cifrul CS prin următoarea substituție:
Cifrul CSC rezultat este un cifr Markov cu 24 blocuri rotunde [26] .
Pentru cifrul CSC, s-au dovedit următoarele:
Prin urmare, se presupune că CS-cipher:
Există o implementare a acestui algoritm de criptare în C [31] (furnizată de autori):
# definiți CSC_C10 0xbf # definește CSC_C11 0x71 # definiți CSC_C12 0x58 # definiți CSC_C13 0x80 # definiți CSC_C14 0x9c # definiți CSC_C15 0xf4 # definiți CSC_C16 0xf3 # definiți 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) \ cod=tmpx=m[adl]^cl; \ cod=tmpx=(tmpx<<1)^(tmpx>>7); \ cod=tmpy=m[adr]^cr; \ cod=m[adl]=tbp[(tmprx&0x55)^tmpx^tmpy]; \ cod=m[adr]=tbp[tmprx^tmpy]; pentru(cod=i=0;i<8;i++,k+=8) { APPLY_M(k[0],k[1],0,1) APLICĂ_M(k[2],k[3],2,3) APLICĂ_M(k[4],k[5],4,5) APLICĂ_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) } pentru(cod=i=0;i<8;i++) cod=m[i]^=k[i]; }codul algoritmului de criptare în C
Autorii au colectat, de asemenea, statistici privind viteza de criptare a datelor, care s-au dovedit a fi mai rapide decât DES [5] :
Viteza de criptare a datelor CS-cipherplatformă | frecvența ceasului | viteza de criptare |
VLSI 1216n și 1mm | 230 MHz | 73 Mbps |
VLSI 30000n și 15mm | 230 MHz | 2 Gbps |
standard C 32 de biți | 133 MHz | 2 Mbps |
felie de biți (Pentium) | 133 MHz | 11 Mbps |
felie de biți (Alpha) | 300 MHz | 196 Mbps |
Cod de asamblare Pentium | 133 MHz | 8 Mbps |
6805 cod de asamblare | 4 MHz | 20 Kbps |
Bazat pe CS-cipher în 2004 de Tom St. Denis a dezvoltat un cifru de 128 de biți [ 32] .
Cifrul rezultat a fost testat și s-a dovedit a fi rezistent la:
Criptosisteme simetrice | |
---|---|
Cifruri în flux | |
Rețeaua Feistel | |
Rețeaua SP | |
Alte |