U¿ytkownik "J.F." <jfox snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:1icuael7xhem8$. snipped-for-privacy@40tude.net...
W konkursie na AES wybrali jeden z 3 czy 5 finalistów. Wcale nie wybrali tego najbezpieczniejszego tylko ten najefektywniejszy w implementacji. Nie mogê teraz znale¼æ, gdzie mam zanotowane wyniki ró¿nych prób. Wed³ug mojej najlepszej pamiêci: DES - oko³o 0,45us (64 bitowy algorytm z kluczem 56bitów - dostosowany bardziej do realizacji sprzêtowej ni¿ programowej) AES128 - oko³o 1,2us (128 bitowy z kluczem 128 bitowym) SHA256 stosujê do wyd³u¿enia has³a - 1 000 000 wykonañ (dane mieszcz± siê w jednym bloku) trwa poni¿ej 2s.
Wszystkie algorytmy nie w jakiej¶ absolutnie nieczytelnej super optymalnej formie, która ró¿nymi #define i #ifdef dopasowuje siê do systemu i maszyny i najlepiej robi wszystko jako jeden wielki ci±g instrukcji bez pêtli i wywo³ywania podprocedur tylko zapisane przeze mnie tak, aby by³y wed³ug mnie jak najczytelniejsze.
Tak by³o w DESie - sprzêtowo banalne - odpowiednie druciki lec± w odpowiednie miejsca, programowo koszmarek.
Najwiêksz± wad± AES (wed³ug pewnych ekspertów) jest to, ¿e jest piêknie zapisany matematycznie (w jakiej¶ tam algebrze czy jak to siê zwie) bez ¿adnych takich kombinacji. Nie mo¿na wykluczyæ, ¿e kiedy¶ jaki¶ student matematyki wpadnie na jakie¶ analityczne rozwi±zanie i swój referat zakoñczy s³owami: "stosuj±c tê metodê na moim PC z³amanie AES zajmuje ..... minut."
byte AES::SBox[256]={0x63,0x7C,0x77,..........,0x54,0xBB,0x16};
void __fastcall AES::Encode(byte d[16]) { static byte M2[256]={0x00,0x02,0x04,........,0xE1,0xE7,0xE5}; static byte M3[256]={0x00,0x03,0x06,.........0x1C,0x19,0x1A};
int i,j; byte b[16]; byte *k=Key; for(j=0;j<16;j+=4){*(dword*)(d+j)^=*(dword*)(k);k+=4;}
for(i=Nr;i--;) // kolejne rundy { for(j=0;j<16;++j)b[j]=SBox[d[(j+((j&3)<<2))&0xF]]; // ShiftRows i SubBytes
if(i)for(j=0;j<16;j+=4) // MixColumns i AddRoundKey { d[j] = M2[b[j]] ^ M3[b[j+1]] ^ b[j+2] ^ b[j+3] ^ *(k++); d[j+1]= b[j] ^ M2[b[j+1]] ^ M3[b[j+2]] ^ b[j+3] ^ *(k++); d[j+2]= b[j] ^ b[j+1] ^ M2[b[j+2]] ^ M3[b[j+3]] ^ *(k++); d[j+3]= M3[b[j]] ^ b[j+1] ^ b[j+2] ^ M2[b[j+3]] ^ *(k++); } else for(j=0;j<16;j+=4){*(dword*)(d+j)=*(dword*)(b+j)^*(dword*)(k);k+=4;} } }
Skróci³em tabele M2 i M3 (to nie s± tabele "z sufitu" tylko ztabelaryzowane policzalne funkcje (chyba druga i trzecia potêga ale w jakim¶ dziwnym matematycznym ¶wiecie). Z komentarza // ShiftRows i SubBytes wnioskujê, ¿e SBox to tylko jakie¶ przesuniêcia (nie to co SBox w DES). Nie pamiêtam - pisa³em to 5 lat temu.
Albo wyprowadzi w totalne maliny..... Jecha³em Zakopane-Bia³ystok. Zaplanowa³em poprzedniego dnia. Sprawdzi³em jak przeje¿d¿a przez Kraków - by³o OK. Ale w Krakowie zjecha³em na stacjê benzynow± i przeliczy³ od nowa. Ju¿ po chwili jechali¶my uliczkami osiedlowymi, potem ko³o jakiego¶ cmentarza i na dzia³ki na poln± drogê na ¶rodku której by³a wysoka na 1m sterta gruzu nie do przejechania (znaczy czo³giem by siê da³o). P.G.