본문 바로가기

해킹&보안/암호학

AES (고급 암호화 표준)

AES(Advanced Encryption Standard)는 현재 이 세상에서 가장 많이 쓰이는 암호이다. AES가 표준이 되기 전에는 보안성이 56비트 밖에 안 되는 DES와 Triple DES 또는 3DES가 표준이었다. 3DES는 DES보다는 보안성이 높지만 (112비트), 112비트 보안성을 위해서는 키가 167비트여야 하기 때문에 여전히 보안성이 불충분하다. 그리고 소프트웨어에서 실행 속도가 느리다. 하지만 AES는 이 두 단점 모두 해결한다.

 

AES의 내부

사진1 / AES 내부 상태 (S0 ~ S15)

AES는 128비트 블록들을 128, 192, 256비트 비밀 키 하나를 사용해서 처리한다.

가장 흔하게 쓰이는 건 128비트인데, 128비트가 더 빠를 뿐만 아니라 대부분의 응용 프로그램에서 128비트와 256비트의 보안성 차이는 무의미이다.

 

개별 비트나 64비트 워드를 처리하는 암호들도 있지만, AES는 바이트들을 다룬다. AES는 하나의 16바이트 평문을 위와 같이 2차원 배열로 취급한다. 16바이트(S = S0 ... S15)로 이루어진 이 배열을 AES의 내부상태, 줄여서 상태라고 부른다.

AES는 이 배열의 바이트들과 열들, 행들을 변환해서 최종 값을 산출하는데, 그게 암호문이다.

 

사진 2

AES는 SPN해서 자신의 상태를 변환하는데, 라운드 수는 키가 128, 192, 256비트일때 각각 10, 12, 14이다.

하나의 AES 라운드는 다음 4가지의 연산으로 이루어진다 

  • AddRoundkey:라운드 키와 내부 상태의 XOR
  • SubBytes: 각 바이트(S0 ... S15)를 대입 상자(s-box)에 따라 다른 바이트로 대체한다. 
  • ShiftRows: 0에서 3까지의 i에 대해, i번째 행을 i만큼 순환이동한다(LS)

SPN의 S는 대입(Substitution)이고 P는 치환(Permutation)이다.

이 대입-치환 네트워크(SPN)의 대입층(~layer)은 SubBytes이고 치환층은 ShiftRows와 MixColumns의 조합이다.

 

위 사진2는 AES의 키 스케줄 함수이다. 이 함수는 SubBytes의 것과 동일한 대입 상자와 XOR 연산들의 조합을 이용해서, 하나의 16바이트 키로부터 11개의 16바이트 라운드키(K0 ... K10)를 생성한다.  임의의 라운드 키로부터 주키를 알아낼 수 있다는 것은 일반적으로 부채널 공격에 대한 보호가 불완전하다는 뜻으로 간주된다

(공격자가 부채널 공격을 이용해서 어렵지 않게 라운드 키 하나를 알아낼 수 있다는 점에서)

AddRoundKey

데이터와 키를 가지고 XOR 연산 진행한다

 

 

SubBytes

SubBytes는 각각의 바이트를 S-Box를 참조하여 치환하는 함수이고
각각 바이트의 상위 4bit가 행, 하위 4bit가 열이다.

 

1F는 행과 열을 확인하면 C0, 3C는 행과 열을 확인하면 71로 바뀌는데 이것을 다 해보면 오른쪽과 같은 값이 나온다.

ShiftRows

0행은 0번 LS, 1행은 1번 LS, 2행은 2번 LS, 3행은 3번 LS를 하는 과정

Mixcolumns

Mixcolumns

 

 

 

각각의 바이트에 특정행렬과 곱연산을 가하여 변환하는데 위의 그림에서 왼쪽의 2311 행렬부분이 암호화에서 쓰이는 행열, 오른쪽에 곱해지는 것은 예시로 입력한 임의의 32비트 입력이다.

 

C0[0] =(0285)(0319)(01D3)(01F0)

C0[1] =(0185)(0219)(03D3)(01F0)

C0[2] =(0185)(0119)(02D3)(03F0)

C0[3] =(03⋅85)⊕(01⋅19)⊕(01⋅D3)⊕(02⋅F0)

= C0[0] ... C0[3] 의 값은 각각 6B ... F0

 

이러한 연산들이 없으면 AES의 보안이 완전히 깨질 것이다. 각 연산은 AES의 보안성에 각자 나름의 방식으로 기여한다.

  • KeyExpansion이 없으면 모든 라운드가 동일한 K를 라운드 키로 사용할 것, AES는 슬라이드 공격에 취약해진다.
  • AddRoundKey가 없으면 암호화가 키에 의존하지 않을 것, 누구나 키 없이도 임의의 암호문을 복호화할 수 있다.
  • SubBytes는 비선형 연산들을 도입함으로써 암복호화의 강도를 높인다. 이것이 없으면 AES는 그냥 고등 수준의 대수학으로도 풀 수 있는 커다란 연립일차방정식일 뿐이다.
  • ShiftRows가 없으면 한 열의 변화가 다른 열들에 영향을 미치지 않는다. 그러면 각 열마다 원소가  2^32개인 코드북 네개를 만들어서 AES를 깰 수 있다.
  • MixColumns가 없으면 상태의 한 바이트의 변화가 다른 바이트들에 영향을 미치지 않는다. 그러면 선택된 평문 공격자는 256바이트짜리 참조표 16개를 이용해서 임의의 암호문을 복호화할 수 있다.

 

AES는 안전한가?

AES는 블록 암호가 안전할 수 있을 만큼 안전하고, 절대 깨지지 않는다. AES가 안전한 근본적인 이윤ㄴ 모든 출력 비트가 모든 출력 비트가 모든 입력 비트에 어떤 복잡하고도 의사무작위한 방식으로 의존하기 때문이다. 설계자들은 모든 부류의 암호해독 공격으로부터 AES를 보호해줌을 증명했다.

   하지만 AES가 모든 가능한 공격에 면역이라는 증명은 없다. 우리는 '모든 가능한 공격'을 모두 알지 못한다. 또한, 주어진 한 암호가 주어진 한 공격에 대해 안전함을 증명하는 것이 항상 가능하지도 않다.

 

AES의 안전성(보안성)에 관한 확신을 높이는 유일한 방법은 다수의 공격을 견디게 하는 것.

즉 많은  능력 있는 사람들이 AES를 깨려고 시도하게 하는 것이다. 이렇게 많은 사람들이 AES를 깨지 못한다면, AES는 안전할 것이다.

 

 

 

다음 글에서는 운영 모드를 알아보자.

'해킹&보안 > 암호학' 카테고리의 다른 글

키 관리  (2) 2024.08.02
운영모드  (0) 2024.05.29
블록 암호  (0) 2024.05.24
[아핀 암호 알고리즘]  (0) 2024.05.01
[곱셈 암호 알고리즘]  (0) 2024.04.30