# AES 암호 알고리즘 (이론)
블록암호의 한 종류
-**SPN 구조**로 되어 있음
-한 블록 크기가 128 bit이고 블록은 1byte (8bit)인 원소가 4x4 행렬로 이루어져있음
-128/198/256 비트의 비밀키 -->10/12/14라운드
**spn 구조란?**
Substitution Cipher와 Permutation Cipher를 중첩, Input을 여러개의 소블럭으로 나누고, 각 소블럭들을 S-BOX로 입력하여 대치(Substitution)하고 S-BOX에서의 출력을 P-BOX로 전치(Permutation)함
substitution과 permutation을 반복하는 구조를 spn구조라고 함


AES의 한 라운드를 구성하는 네가지 연산
-SubBytes
-ShiftRows
-MixColumns
-AddRoundKey
그림과 같이 0라운드에서는 AddRoundKey만 수행되고 마지막 라운드에서는 MixColumns를 제외한 연산만 수행됨.
**SubBytes**: S-Box를 통해 치환 연산 수행
-block의 각 바이트를 s-box에 입력해 대응되는 출력 값으로 치환함
-비선형 연산으로 혼돈의 기능 수행
-AES는 **GF(2^8^) 에서의 inversion 연산과 아핀연산으로 설계되어 있음.**
**S(t) = Affine(t^-1^) = At^-1^ xor b = At^254^ xor b** (t^255=1 이기 때문)
-->S-Box 함수
-t^-1^은 GF2^8^ (기약다항식: x^8^+x^4^+x^3^+x+1)에서의 t의 역원이다. (Extended Euclidean Algorithm 이용) **이라는데 역원 구하는법 사실 정확히 모르겠음 나눠 떨어지게끔 안나오는 경우도 있고 직접 해보니 잘 안됨 선배들한테 질문 후 수정 예정**

ex) s(0x11)=s(00010001)=s(x^4+1) 이므로 (x^4+1)^(-1)을 구한 후 예를들어 해당 역원이 0x34라면 0x34=00110100 이고 x7에서 부터 대입해주다. x7=0, x6=0, x5=1, x4=1, x3=0, x2=1, x1=0, x0=0 이고 이를 해당 행렬과 계산해준다

해당 그림처럼 첫행의 요소들과 x0~x7까지의 요소들을 서로 곱해주고 xor연산 해준다. 모든 행을 동일 연산 반복 후 그 후 나온 각 행의 요소들을 또 맨 우측 요소들과 xor연산을 해준다. 그 후, 나온 값이 (아래에서 위로 역으로 읽음) S-Box의 출력값이다.
**ShiftRows**: 블록의 위치를 단순 이동시킴, 선형 연산, 블록의 각행을 동일한 칸수만큼 이동시킴
**MixColumns**: 블록 State의 각 열을 섞음
GF(2^8)에서의 곱셈 연산, 덧셈 연산 이용해서 계산, 8차 기약다항식

입력된 블록의 각 요소들을 그림과 같이 가운데의 matrix와 행렬 계산 해줌 (각 요소들을 다항식으로 바꾼 후 곱셈 연산을 하고 다시 2진수로 바꾼 후 xor연산 해줌)
**AddRoundKey**

평문과 라운드키를 xor연산 해줌.
*의문이었던 점이 키의 사이즈가 증가함에 따라 라운드 수가 증가하는데 키 사이즈와 평문의 사이즈는 아무 관련이 없냐는것이었다. 키와 평문을 xor연산 해주는데 사이즈가 다르면 안되지 않겠나. 그래서 선배님께 질문해보니 잘 모르겠는데 라운드키 사이즈는 128비트가 되도록 뽑아야 한다고 하셨다*
**Key Expansion** (라운드키 생성 과정)
-N라운드의 AES인 경우 키는 N+1개 있어야함. (0라운드 부터 시작하기 떄문)

마스터 키가 들어오면 (128, 192, 256 bit) 128비트의 라운드키를 만들어냄. 마스터키의 사이즈가 몇이든 뽑아내는 라운드키는 128비트로 고정인듯 함. 128/192/256bit 키 -->라운드: 10/12/14라운드

위의 그림처럼 마스터키의 사이즈가 128비트일때
32비트로 쪼개진 요소들이 w0, w1, w2, w3과 만나 초기값이 설정되고, 이후에

그림에서 k0~k3이 w0이고, w3을 g funtion에 대입 후 그 결과를 w0과 xor연산하면 w4가 나옴 w4를 w1과 xor연산해서 w5가 나옴 동일연산 반복하면 됨 g-funtion은 위의 G(W4i-1)임 RotWord는 w의 1byte 요소들 (k)을 몇칸 씩 이동시켜주는 함수이다. SubWord는 S-Box를 이용한 치환연산이다. RCons 는 4바이트 상수인데 SubWord에서 나온 값과 xor연산을 거침