In FIPS-197 ( Gelişmiş Şifreleme Standardı AES olarak bilinen), bu ağır kullanımı yapıldığı SubBytes
halinde uygulanması mümkündür,
unsigned char SubBytes(unsigned char x) {
static const unsigned char t[256] = {
0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,
0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,
0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,
0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,
0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,
0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,
0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,
0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,
0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,
0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,
0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,
0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,
0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,
0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,
0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16};
return t[x];}
Bu işlev keyfi değildir; bir Galois Alanındaki bir inversiyon ve ardından bir afin dönüşümden oluşan geri dönüşümlü bir haritadır. Tüm detaylar FIPS-197 bölüm 5.1.1 veya burada bölüm 4.2.1'de (biraz farklı bir isim altında).
Tablo olarak uygulama ile ilgili bir sorun, önbellek zamanlama saldırılarına sözde açılmış olmasıdır .
Böylece göreviniz, SubBytes()
sabit zamanlı davranış sergileyen yukarıdaki işlev için tam bir yedek oluşturmaktır ; Biz hiçbir şey girişine bağlı olarak zaman Bu durumda varsayıyoruz x
arasında SubBytes
ya kullanılır:
- dizi dizini olarak,
- Kontrol işlene olarak
if
,while
,for
,case
, veya operatör?:
; - operatörlerin herhangi işlenen olarak
&&
,||
,!
,==
,!=
,<
,>
,<=
,>=
,*
,/
,%
; - Operatörlerin sağ terim olarak
>>
,<<
,*=
,/=
,%=
,<<=
,>>=
.
Kazanan tekli operatörler için 5 ağırlık ile giriş bağımlı veri yolu yürütülen işletmeci sayısında elde edilen en düşük maliyetle biri olacak -
ve ~
de için olduğu kadar <<1
, >>1
, +1
, -1
; diğer tüm operatörler için ağırlık 7, diğer sayılarla kaymalar veya diğer sabitler ekler / alçalır (tür yayınları ve promosyonlar ücretsizdir). Prensip olarak, bu maliyet döngüler (varsa) ve girişten bağımsız olarak değiştirilerek değiştirilmez x
. Bir kravat kırıcı olarak, boşluk ve yorumları kaldırdıktan sonra en kısa kod ile cevap kazanır.
2013 yılında, UTC'de olabildiğince erken bir cevap vermeyi planlıyorum. Bildiğim dillerdeki cevapları, bunları boyut için optimize edilmeyen C'ye doğrudan bir çeviri olarak sıralayacağım.
Tercih edilen operatörlerin, serbest atmaların ve promosyonların ilk ihmali +1
ve -1
büyüklük ve boyut sıralamasından dolayı özür dileriz . *
Hem tekli hem de çarpma olarak yasaklandığını unutmayın .