Trong Trin-197 ( Tiêu chuẩn mã hóa nâng cao , được gọi là AES), nó được sử dụng rất nhiều SubBytes
, có thể được triển khai như
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];}
Chức năng này không phải là tùy ý; nó là một ánh xạ đảo ngược, bao gồm một đảo ngược trong Trường Galois theo sau là một phép biến đổi affine. Tất cả các chi tiết nằm trong phần Trin-197 5.1.1 hoặc ở đây phần 4.2.1 (dưới một tên hơi khác).
Một vấn đề với việc thực hiện như một bảng là nó mở ra cái gọi là các cuộc tấn công thời gian bộ đệm .
Do đó, nhiệm vụ của bạn là đưa ra một sự thay thế chính xác cho SubBytes()
chức năng trên , thể hiện hành vi không đổi thời gian; chúng tôi sẽ giả định đó là trường hợp khi không có gì phụ thuộc vào đầu vào x
của SubBytes
được sử dụng một trong hai:
- như một chỉ số mảng,
- như kiểm soát toán hạng của
if
,while
,for
,case
, hoặc nhà điều hành?:
; - như bất kỳ toán hạng của các nhà khai thác
&&
,||
,!
,==
,!=
,<
,>
,<=
,>=
,*
,/
,%
; - là toán hạng bên phải của các nhà khai thác
>>
,<<
,*=
,/=
,%=
,<<=
,>>=
.
Thiết kế thắng cuộc sẽ là một với chi phí thấp nhất, thu được từ số lượng khai thác thực hiện trong đường dẫn dữ liệu đầu vào phụ thuộc, với trọng lượng 5 cho các nhà khai thác unary -
và ~
cũng như cho <<1
, >>1
, +1
, -1
; trọng số 7 cho tất cả các nhà khai thác khác, thay đổi với số lượng khác hoặc thêm / phụ của các hằng số khác (loại phôi và chương trình khuyến mãi là miễn phí). Theo nguyên tắc, chi phí đó không thay đổi bằng cách bỏ các vòng lặp (nếu có) và độc lập với đầu vào x
. Là một break-breaker, câu trả lời với mã ngắn nhất sau khi xóa khoảng trắng và các bình luận sẽ thắng.
Tôi dự định chỉ định một mục là câu trả lời sớm nhất có thể trong năm 2013, UTC. Tôi sẽ xem xét các câu trả lời bằng các ngôn ngữ mà tôi có một số kiến thức, xếp hạng chúng là bản dịch thẳng sang C không được tối ưu hóa cho kích thước.
Xin lỗi về sự thiếu sót ban đầu của +1
và -1
trong các nhà khai thác ưa thích, các diễn viên và chương trình khuyến mãi miễn phí, và xếp hạng kích thước. Lưu ý rằng *
bị cấm cả khi unary và nhân.