# 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): ![](https://i.imgur.com/0DZVB5G.png) ## 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