
💡 키 없이 반전할 수 없는 키 순열을 달성하기 위해 AES는 입력에 많은 임시 혼합 작업을 적용합니다. 이것은 우아한 개별 수학적 문제를 기반으로 하는 RSA와 같은 공개 키 암호 시스템과 극명한 대조를 이룹니다. AES는 훨씬 덜 우아하지만 매우 빠릅니다.
높은 수준에서 AES-128은 “핵심 일정”으로 시작한 다음 상태에서 10회를 실행합니다. 시작 상태는 암호화하려는 일반 텍스트 블록이며 4×4 바이트 매트릭스로 표시됩니다. 10라운드 동안 상태는 여러 반전 변환에 의해 반복적으로 수정됩니다.
각 변환 단계에는 1940년대에 Claude Shannon이 확립한 보안 암호의 이론적 속성을 기반으로 정의된 목적이 있습니다. 다음 과제에서 이들 각각에 대해 자세히 살펴보겠습니다.
다음은 AES 암호화 단계에 대한 개요입니다.

- 키 확장
또는 키 일정
128비트 키에서 11개의 개별 128비트 “라운드 키”가 파생됩니다. 하나는 각 AddRoundKey 단계에서 사용됩니다.
2. 초기 키 추가
AddRoundKey
- 첫 번째 라운드 키의 바이트는 상태의 바이트와 XOR’d됩니다.
3. 라운드
- 이 단계는 9개의 메인 라운드와 하나의 “최종 라운드”에 대해 10번 반복됩니다.
a)하위 바이트
- 조회 테이블(“S-박스”)에 따라 상태의 각 바이트가 다른 바이트로 대체됩니다.
b) ShiftRows
- 상태 행렬의 마지막 3개 행이 전치됩니다.
c) MixColumns
- 상태의 열에서 행렬 곱셈이 수행되어 각 열의 4바이트를 결합합니다. 이것은 최종 라운드에서 건너뜁니다.
d) AddRoundKey
- 현재 라운드 키의 바이트가 상태의 바이트와 XOR’d됩니다. 초기 일반 텍스트 블록을 상태 행렬로 변환하는 기능이 포함되어 있습니다 .
bytes2matrix
해당 행렬을 다시 바이트로 변환하는 함수를 작성
matrix2bytes
하고 결과 일반 텍스트를 플래그로 제출합니다.
AES의 한 라운드가 어떻게 구성되어 있는지에 대해 설명해주고 있다.

python 파일을 다운로드하면 다음과 같다. matrix2bytes
함수를 잘 작성하여 주어진 matrix로 flag를 얻으면 될 것 같다.
def matrix2bytes(matrix):
""" Converts a 4x4 matrix into a 16-byte array. """
flag=[]
for i in matrix:
for j in i:
flag.append(j)
key=''
for i in flag:
key+=chr(i)
return key
bytes2matrix
함수를 보면 간단하게 배열의 순서대로 행렬을 구성하고 있기에, 이를 다시 바꿔주는 과정도 순서대로 반복문을 돌면서 되돌려주면 된다.

실행하면 바로 flag를 알려준다.

🚩 flag: crypto{inmatrix}