Bức tranh toàn cảnh: đoạn mã này cần tính đa thức nhị phân nghịch đảo modulo bất khả quy $P$ của mọi đa thức nhị phân khác 0 $R$ mức độ thấp hơn so với $P$. Hướng tới điều này, nó đã chọn một đa thức sinh $G=1+x$và lập bảng $Q_i=G^i\bmod P$, đạt được tất cả mong muốn $R$. Nghịch đảo nhân của $R=Q_i$ Là $Q_{255-i}$.
Mã này đánh giá AES S-box và nó nghịch đảo như sau:
(khối mã bắt đầu từ cố gắng) Nó đánh giá p = 0x11b = 283 đại diện cho đa thức nhị phân $P=1+x+x^3+x^4+x^8$ dưới dạng số nguyên: giá trị thu được khi đánh giá đa thức này cho số nguyên $x=2$. Quy ước chung này được sử dụng trong AES để ánh xạ đa thức nhị phân thành số nguyên.
(khối mã bắt đầu từ để t) Nó tính bảng t[tôi] đại diện cho đa thức nhị phân $Q_i=(1+x)^i\bmod P$ theo quy ước này. Điều đó $Q_i$ được tính cho mỗi lần lặp lại $Q_{i+1}=Q_i\,(1+x)\bmod P$ với $Q_0=1$, dịch¹ sang t[i+1] = t[i] ^ ((t[i] << 1) ^ ((t[i] >>> 7) * p)) với t[0] = 1 theo quy ước nói trên.
Ví dụ: $Q_0$ là đa thức (nhị phân) $1$, đại diện bởi t[0] = 1. $Q_1=1+x$, đại diện bởi t[1] = 3. $Q_2=(1+x)^2=1+x^2$, đại diện bởi t[2] = 5. $Q_7=(1+x)^7=1+x+x^2+x^3+x^4+x^5+x^6+x^7$, đại diện bởi t[2] = 0xff = 255. $Q_8=(1+x)^8\bmod P=(1+x^8)\bmod P=x+x^3+x^4$, đại diện bởi t[8] = 0x1a = 26.
(khối mã bắt đầu từ hãy để Sbox) Lập bảng $Q_i=(1+x)^i\bmod P$ hữu ích vì $(1+x)^{255}\bmod P=1$, vì thế $Q_{255-i}$ là nghịch đảo nhân của $Q_i$. Và $Q_i$ tiến tới tất cả các đa thức nhị phân khác 0 có bậc $<8$ (đó là $1+x$ là máy phát điện). Do đó số nguyên t[255 - tôi] đại diện cho nghịch đảo nhân của đa thức mà số nguyên t[tôi] đại diện. Và khi ở trong vòng lặp tôi đi từ 0 đến 254 tạo ra nghịch đảo nhân của mỗi trong số 255 đa thức khác không của bậc $<8$. Sau đó, vòng lặp chỉ áp dụng² phép biến đổi affine được chỉ định trong phần còn lại của định nghĩa của AES S-box. Đa thức bằng 0 là trường hợp đặc biệt.
Ví dụ: khi ở trong vòng lặp tôi = 8, t[tôi] Là t[8] = 0x1a = 26 đại diện $Q_8=x+x^3+x^4$, và t[255-i] (sẽ x, không liên quan đến $x$) Là t[247] = 0xfd = 253 đại diện cho đa thức $Q_{247}=1+x^2+x^3+x^4+x^5+x^6+x^7$. Điều đó $Q_{247}$ là nghịch đảo nhân của $Q_8$. Theo định nghĩa của AES S-box, chỉ còn cách áp dụng phép biến đổi affine² cho x, sau đó đặt kết quả vào Sbox[t[i]] = Sbox[26].
(hàm ngược) Bảng nghịch đảo được tính bằng cách tìm kiếm từng mục trong bảng. Điều đó hoạt động nhưng không hiệu quả. InvSbox[i] = sbox.indexOf(i); có thể được thay thế bằng cách đơn giản và hiệu quả hơn InvSbox[sbox[i]] = i;.
¹ Biện minh: trong t[i+1] = t[i] ^ ((t[i] << 1) ^ ((t[i] >>> 7) * p))
t[tôi] là một số nguyên trong $[0,2^8)$ và đại diện $Q_i$ bằng cấp $<8$
t[i] << 1 là số nguyên chẵn trong $[0,2^9)$ và đại diện $Q_i\,x$.
t[i] >>> 7 là một trong hai 0 hoặc 1. Đó là hệ số của thời hạn đặt hàng $x^7$ Trong $Q_i$.
(t[i] >>> 7) * p tương ứng là một trong hai 0 hoặc 0x11b = 283, đại diện $0$ hoặc $P$.
(t[i] << 1) ^ ((t[i] >>> 7) * p) đại diện tương ứng $(Q_i\,x)$ hoặc $(Q_i\,x)+P$, và (bằng cách kiểm tra hai trường hợp) là một số nguyên trong $[0,2^8)$, do đó đại diện cho một đa thức nhị phân bậc $<8$, do đó là $(Q_i\,x)\bmod P$.
t[i] ^ ((t[i] << 1) ^ ((t[i] >>> 7) * p)) do đó là một số nguyên trong $[0,2^8)$ và đại diện $Q_i+(Q_i\,x)\bmod P)=Q_i\,(1+x)\bmod P=Q_{i+1}$, bằng cấp $<8$.
Trong C, thành ngữ thời gian không đổi có khả năng tiêu chuẩn cho biểu thức này sẽ là (về cơ bản với & - được sử dụng thay cho phép nhân):
t[i+1] = t[i] ^ ((t[i] << 1) ^ (p & -(t[i] >> 7))).
Lưu ý: một số trình biên dịch C quá nhiệt tình sẽ sủa sai -, khiến họ im lặng.
² Tuyên bố x |= x << 8;nhân đôi các bit trong biến x (đại diện cho nghịch đảo mô-đun của $Q_i$) sao cho các lần dịch phải tiếp theo trở nên tương đương với phép quay khi nói đến 8 bit bậc thấp. tuyên bố x ^= (x >> 4) ^ (x >> 5) ^ (x >> 6) ^ (x >> 7); thực hiện các ma trận tuần hoàn phép nhân. sau đó ^ 0x63 (đại diện cho đa thức $1+x+x^5+x^6$) là phép cộng không đổi, và & 0xFF giữ 8 bit bậc thấp (về mức độ $<8$), hoàn tác trùng lặp.