# Differential Fault Attack Against AES Cryptosystem
## 1. Định nghĩa
- **Differential Fault Attack** (DFA) là một kĩ thuật tấn công vào thuật toán AES chuẩn của **NIST** tuy nhiên có thêm 1 hàm mã hóa và ở round thứ 9 thì cứ 1 byte bất kì mỗi 4 bytes sẽ bị lỗi (xor với 1 số random):

## 2. Attack Method
- Bây giờ mình sẽ biểu diễn lại ma trận state của AES trước khi trải qua **MixColumn** của round thứ 9 của cả ciphertext gốc $FFC_i$ (Fault Free Ciphertext) và ciphertext bị lỗi $FC_i$ (Fault Ciphertext)
$$
\begin{equation*}
\begin{pmatrix}
A_1 & B_1 & C_1 & D_1 \\
A_2 & B_2 & C_2 & D_2 \\
A_3 & B_3 & C_3 & D_3 \\
A_4 & B_4 & C_4 & D_4
\end{pmatrix} \text{and}
\begin{pmatrix}
A_1 + e & B_1 & C_1 & D_1 \\
A_2 & B_2 & C_2 & D_2 \\
A_3 & B_3 & C_3 & D_3 \\
A_4 & B_4 & C_4 & D_4
\end{pmatrix}
\end{equation*}
$$
- Lưu ý là mình sẽ chỉ biểu diễn duy nhất 1 việc bị lỗi trên 1 cột để dễ hình dung (Đề bài bị lỗi trên cả 4 cột và cứ 4 bytes của 1 block là 1 cột)
- Sau khi **MixColumn** ở round 9:
$$
\begin{equation*}
\begin{pmatrix}
2A_1+3A_2+A_3+A_4 & \cdots & \cdots & \cdots \\
A_1+2A_2+3A_3+A_4 & \cdots & \cdots & \cdots \\
A_1+A_2+2A_3+3A_4 & \cdots & \cdots & \cdots \\
3A_1+A_2+A_3+2A_4 & \cdots & \cdots & \cdots
\end{pmatrix}
\text{and}
\begin{pmatrix}
2A_1+2e+3A_2+A_3+A_4 & \cdots & \cdots & \cdots \\
A_1+e+2A_2+3A_3+A_4 & \cdots & \cdots & \cdots \\
A_1+e+A_2+2A_3+3A_4 & \cdots & \cdots & \cdots \\
3A_1+3e+A_2+A_3+2A_4 & \cdots & \cdots & \cdots
\end{pmatrix}
\end{equation*}
$$
- Sau khi trải qua **AddRoundKey** ở $K_9$:
$$
\begin{equation*}
\begin{pmatrix}
2A_1+3A_2+A_3+A_4+K_{9,0} & \cdots & \cdots & \cdots \\
A_1+2A_2+3A_3+A_4+K_{9,1} & \cdots & \cdots & \cdots \\
A_1+A_2+2A_3+3A_4+K_{9,2} & \cdots & \cdots & \cdots \\
3A_1+A_2+A_3+2A_4+K_{9,3} & \cdots & \cdots & \cdots
\end{pmatrix}
\text{and}
\begin{pmatrix}
2A_1+2e+3A_2+A_3+A_4+K_{9,0} & \cdots & \cdots & \cdots \\
A_1+e+2A_2+3A_3+A_4+K_{9,1} & \cdots & \cdots & \cdots \\
A_1+e+A_2+2A_3+3A_4+K_{9,2} & \cdots & \cdots & \cdots \\
3A_1+3e+A_2+A_3+2A_4+K_{9,3} & \cdots & \cdots & \cdots
\end{pmatrix}
\end{equation*}
$$
- Sau khi trải qua **SubBytes** (viết tắt là $S$), **ShiftRows** và **AddRoundKey** $K_{10}$:
$$
\begin{equation*}
\begin{pmatrix}
S(2A_1+3A_2+A_3+A_4+K_{9,0})+ K_{10,0} \qquad \cdots \qquad \cdots \qquad \cdots \\
\cdots \qquad \cdots \qquad \cdots \qquad S(A_1+2A_2+3A_3+A_4+K_{9,1})+K_{10,13} \\
\cdots \qquad \cdots \qquad S(A_1+A_2+2A_3+3A_4+K_{9,2})+K_{10,10} \qquad \cdots \\
\cdots \qquad S(3A_1+A_2+A_3+2A_4+K_{9,3})+K_{10,17} \qquad \cdots \qquad \cdots
\end{pmatrix}
\text{and}
\begin{pmatrix}
S(2A_1+2e+3A_2+A_3+A_4+K_{9,0})+ K_{10,0} \qquad \cdots \qquad \cdots \qquad \cdots \\
\cdots \qquad \cdots \qquad \cdots \qquad S(A_1+e+2A_2+3A_3+A_4+K_{9,1})+K_{10,13} \\
\cdots \qquad \cdots \qquad S(A_1+e+A_2+2A_3+3A_4+K_{9,2})+K_{10,10} \qquad \cdots \\
\cdots \qquad S(3A_1+3e+A_2+A_3+2A_4+K_{9,3})+K_{10,7} \qquad \cdots \qquad \cdots
\end{pmatrix}
\end{equation*}
$$
- Ta có:
$$
\begin{equation*}
FC_0 = S(2A_1+2e+3A_2+A_3+A_4+K_{9,0})+K_{10,0} \\
FC_{13} = S(A_1+e+2A_2+3A_3+A_4+K_{9,1})+K_{10,13} \\
FC_{10} = S(A_1+e+A_2+2A_3+3A_4+K_{9,2})+K_{10,10} \\
FC_7 = S(3A_1+3e+A_2+A_3+2A_4+K_{9,3})+K_{10,7} \\
\end{equation*}
$$
$$
\begin{equation*}
FFC_0 = S(2A_1+3A_2+A_3+A_4+K_{9,0})+K_{10,0} \\
FFC_{13} = S(A_1+2A_2+3A_3+A_4+K_{9,1})+K_{10,13} \\
FFC_{10} = S(A_1+A_2+2A_3+3A_4+K_{9,2})+K_{10,10} \\
FFC_7 = S(3A_1+A_2+A_3+2A_4+K_{9,3})+K_{10,7} \\
\end{equation*}
$$
$$
\begin{align}
FC_0 + FFC_0 = S(2A_1+2e+3A_2+A_3+A_4+K_{9,0}) + S(2A_1+3A_2+A_3+A_4+K_{9,0})
\end{align}
$$
- Tương tự:
$$
FC_{13} + FFC_{13} = S(A_1+e+2A_2+3A_3+A_4+K_{9,1})+ S(A_1+2A_2+3A_3+A_4+K_{9,1})\\
FC_{10} + FFC_{10} = S(A_1+e+A_2+2A_3+3A_4+K_{9,2})+S(A_1+A_2+2A_3+3A_4+K_{9,2})\\
FC_{7} + FFC_{7} = S(3A_1+3e+A_2+A_3+2A_4+K_{9,3})+S(3A_1+A_2+A_3+2A_4+K_{9,3})
$$
Nếu ta đặt $I_i$
là giá trị thứ i của cột đầu tiên của block sau khi kết thúc round 9 (trong hàm mã hóa bình thường) thì ta có 4 phương trình sau:
$$
FC_0 + FFC_0 = S(I_0+2e) + S(I_0)\\
FC_{13} + FFC_{13} = S(I_1+e) + S(I_1)\\
FC_{10} + FFC_{10} = S(I_2+e) + S(I_2)\\
FC_{7} + FFC_{7} = S(I_3+3e) + S(I_3)
$$
- Ta sẽ tìm giá trị $I_0$ tương ứng thỏa phương trình thứ nhất, từ những thẳng thỏa trước đó ta sẽ tìm tiếp những giá trị $I_1$ thỏa tiếp phương trình thứ 2… Cứ như vậy ta sẽ tìm được các tập 4 giá trị $I_i$ thỏa đc 4 phương trình trên với thằng **$e$** tương ứng (vì $e$ là random nên ta sẽ lấy toàn bộ nghiệm).
- Ngoài ra việc chúng ta có nhiều hơn 1 cặp $FFC$ và $FC$ sẽ giúp chúng ta giao các đáp án lại với nhau giúp giảm 2 tập nghiệm lại với nhau giúp giảm bớt trường hợp.
- Sau khi có được các thằng $I_i$ thì nhớ lại 4 phương trình ta có ở trước đó:
$$
\begin{equation*}
FFC_0 = S(I_0)+K_{10,0} \\
FFC_{13} = S(I_1)+K_{10,13} \\
FFC_{10} = S(I_2)+K_{10,10} \\
FFC_7 = S(I_3)+K_{10,7} \\
\end{equation*}
$$
- Như vậy là chúng ta sẽ kiếm được những thằng có thể là $K_{10,0},K_{10,13},K_{10,10},K_{10,7}$. Đề bài cũng cho chúng ta bị lỗi ở cả 4 cột do đó ta có thể hoàn toàn khôi phục các bộ còn lại $(K_{10,4},K_{10,1},K_{10,14},K_{10,11}),(K_{10,8},K_{10,5},K_{10,2},K_{10,15}),(K_{10,12},K_{10,9},K_{10,6},K_{10,3})$ $=>$ $K_{10}$ dùng ở **AddRoundKey** thứ 10. Vì hàm để mở rộng key (hay **key_schedule_128**) là hàm 2 chiều nên ta có thể khôi phục lại key bí mật ban đầu 1 cách dễ dàng
- **Reference:**
- https://iacr.org/archive/ches2006/08/08.pdf
- https://blog.quarkslab.com/differential-fault-analysis-on-white-box-aes-implementations.html