에듀테크 프로젝트 대시보드
AES 내부 구조
AES(Advanced Encryption Standard)는 오늘날 HTTPS·와이파이·디스크 암호화에 쓰이는 대칭키 블록 암호다. 평문을 128비트(16바이트) 블록으로 자르고, 각 블록을 4×4 바이트 상태 행렬로 놓은 뒤 SubBytes → ShiftRows → MixColumns → AddRoundKey 네 변환을 라운드마다 반복한다. AES-128은 총 10라운드(마지막 라운드는 MixColumns 생략). 아래에서 실제 AES-128 암호화를 한 스텝씩 따라가 보자.
평문·키를 16글자 ASCII로 입력하면 바이트 → 4×4 행렬(열 우선)로 채운다. 다음 단계를 누를 때마다 변환이 하나씩 적용된다. 바뀐 칸은 주황색, 자리만 이동한 칸은 파란색으로 표시된다.
각 바이트를 S-box라는 256칸 룩업 테이블로 바꾼다. S-box는
GF(2⁸) 곱셈 역원 + 어파인 변환으로 만들어져, 입력·출력 사이 선형 관계를 깨뜨린다.
예: 0x53 → 0xED. AES에서 유일하게 비선형인 단계라 차분·선형 공격을 막는 핵심.
0행은 그대로, 1행은 왼쪽 1칸, 2행은 2칸, 3행은 3칸 순환 시프트. 한 열에 몰려 있던 바이트를 네 열로 흩어 확산(diffusion)을 만든다. 바이트 값은 그대로, 위치만 섞인다.
각 열(4바이트)을 GF(2⁸) 위 고정 행렬과 곱한다. 곱셈 계수는 2·3·1·1. 한 바이트가 바뀌면 그 열의 네 바이트가 모두 바뀐다 → 강한 확산. 마지막 10라운드에서는 생략된다.
상태 행렬을 라운드 키와 바이트별 XOR. 라운드 키는 원본 키를 키 확장(Key Expansion)으로 늘려 만든 11개(라운드 0~10) 중 하나. 유일하게 비밀키가 직접 개입하는 단계.
AES의 산술은 8비트를 다항식으로 본다. 곱셈은 x·b(왼쪽 시프트)에
오버플로가 나면 기약다항식 0x11B로 XOR 환원하는 xtime 연산의 조합이다.
# GF(2^8) 곱셈 — AES 기약다항식 x^8+x^4+x^3+x+1 (0x11B) def xtime(b): b <<= 1 if b & 0x100: b ^= 0x11B # 8비트 넘으면 환원 return b & 0xFF def gmul(a, b): p = 0 for _ in range(8): if b & 1: p ^= a a = xtime(a) b >>= 1 return p # MixColumns: 각 열에 [[2,3,1,1],[1,2,3,1],[1,1,2,3],[3,1,1,2]] 곱 def mix_column(c): return [ gmul(c[0],2) ^ gmul(c[1],3) ^ c[2] ^ c[3], c[0] ^ gmul(c[1],2) ^ gmul(c[2],3) ^ c[3], c[0] ^ c[1] ^ gmul(c[2],2) ^ gmul(c[3],3), gmul(c[0],3) ^ c[1] ^ c[2] ^ gmul(c[3],2), ]
AES는 키 길이에 따라 AES-128(10라운드) · AES-192(12) · AES-256(14)가 있다.
2001년 표준 채택 이후 20년 넘게 실용적인 전수 공격보다 빠른 공격이 없다.
가장 알려진 공격도 AES-128을 약 2¹²⁶ 연산으로 깨는 수준으로, 전수 탐색(2¹²⁸)과 사실상 차이가 없다.
초당 10억×10억 개 키를 시험해도 우주의 나이보다 오래 걸린다.
실제 위협은 알고리즘이 아니라 구현(약한 난수·타이밍 부채널·ECB 모드 오용)에서 온다.
GCM·CBC 같은 운용 모드와 안전한 IV 관리가 함께 필요하다.
데모는 표준 AES-128 암호화(ECB, 단일 블록)를 브라우저에서 그대로 계산합니다 · 교육용