
💡 우리는 S-box 대체가 어떻게 혼란을 일으키는지 보았습니다. Shannon이 설명한 다른 중요한 속성은 "확산"입니다. 이것은 암호 입력의 모든 부분이 출력의 모든 부분으로 확산되어야 하는 방식과 관련이 있습니다.
이번에는 shiftRows와 mixColumns를 설명해주고 있다. shiftRows는 행에서 자리를 옮겨주는 거라고 볼 수 있고, mixColumns는 각 열에 특정 값을 곱(in 갈루아 필드)하는 것이라고 볼 수 있다.

주어진 코드를 보면 shiftRows, mixColumns, inv_mixColumns가 함수로 구현되고 있고, 이들을 참고해서 inv_shift_rows
함수를 구현해야 한다.
def inv_shift_rows(s):
s[0][1], s[1][1], s[2][1], s[3][1] = s[3][1], s[0][1], s[1][1], s[2][1]
s[0][2], s[1][2], s[2][2], s[3][2] = s[2][2], s[3][2], s[0][2], s[1][2]
s[0][3], s[1][3], s[2][3], s[3][3] = s[1][3], s[2][3], s[3][3], s[0][3]
긴 설명이 필요 없다. 그냥 거꾸로 되돌리면 된다.
flag를 얻기 위해서는 주어진 state를 inv_mix_columns
, inv_shift_rows
, matrix2bytes
함수에 순서대로 넣어주면 된다.

flag를 얻어냈다.

🚩 flag: crypto{d1ffUs3R}