반응형

AEAD란?

Authenticated Encryption with Associated Data (AEAD) 의 약자입니다.

즉, Associated Data 관련 데이터와 인증된 암호화 라는 뜻인데,

이런 이름을 갖는 이유는 관련 알고리즘인 CCM이나 GCM을 분석하면 이해하기가 쉽습니다.

그전에 간단하게 이해를 해보면 AE는 인증 암호화(암호화 + 인증)을 의미합니다.

데이터 암호화를 통한 기밀성과 MAC 계산을 통한 무결성 및 인증을 동시에 제공하는 것입니다.

이러한 AE가 있는 이유는 Encryption + MAC 방식을 안전하게 결합하는 것이 어렵기 때문입니다.

그럼 AD는 무엇일까요? 관련 데이터라는 뜻인데,

암호화될 데이터는 무결성과 인증을 필요로 합니다.

하지만, 일반적인 AE 방식으로는 Encryption + MAC 의 구성인데

유효한 Encryption 데이터를 단순하게 잘라내어 붙여넣기하는 공격

(cut and paste attack)에 대한 방지가 불가능합니다. (Confused deputy problem 의 일종)

그래서 AD (관련 데이터)를 MAC 계산에 추가하여 인증을 강화한 형태라고 볼 수 있습니다.

이 AD를 일반적으로 AAD(Addtional Associated Data)라고도 부릅니다.

또한, 이런 AAD를 활용하여 MAC 의 부인방지가 불가능한 점 등을 보완할 수 있습니다.

(AAD를 개인키와 같이 각 클라이언트별로 개별 값을 사용하면)

AEAD Cipher가 최근 화두되고 있는 이유는

TLS 1.3 에서부터 Cipher suite로 AEAD Cipher가 추가 되었기 때문입니다.

AEAD Cipher가 추가된 이유는 앞서 말한 강화된 인증방식과

안전하게 Encryption과 MAC 계산을 결합하는 것에 많은 문제들이 발생되었기 때문입니다.

또한, 일반적인 CBC 암호화 모드에 취약점이 발견되기도 했습니다.

IV와 서버의 응답을 이용한 padding oracle attack 방식때문이죠.

그래서 아래 설명할 CCM, GCM 알고리즘의 경우 암호화 방식으로 모두 패딩이 없는 CTR mode를 사용합니다.

TLS 1.3 Cipher suite

실제로 위 표와 같이 TLS 1.3 부터 지원하는 블록암호 Cipher suite는 AEAD Cipher로 통일되었습니다.

참고 자료 :

위 내용은 제가 아는 내용과 조사한 내용을 기반으로 작성되었습니다.

혹시나 틀린내용이나 피드백이 필요한 내용이 있으면 댓글 부탁드리겠습니다.

그럼 이제 AEAD Cipher의 대표적인 알고리즘인 CCM과 GCM에 대해 알아보겠습니다.

CCM mode (Counter with CBC-MAC)

CCM mode는 오로지 블록 길이가 128bit인 블록 암호로만 정의됩니다.

이름대로 Counter mode(CTR mode)와 CBC-MAC이 결합된 형태입니다.

그래서 먼저 CTR mode와 CBC-MAC에 대해 알아야합니다.

CTR mode와 CBC mode는 사실 지난 블록 암호 운영 모드 포스팅에서 다뤘습니다.

https://blog.naver.com/vjhh0712v/221442832752

그렇다면 CBC-MAC은 무엇일까요?

CBC mode를 이용해서 암호화가 아닌 MAC을 만드는 것입니다.

위 그림을 보시면 차이점이 이해가 가실겁니다.. 뭐 대단한 차이는 아닙니다.

단순하게 마지막 과정의 블록만 MAC으로 뽑아낸다고 보면됩니다.

자 그럼 CCM 알고리즘 전체를 한번 살펴보겠습니다.

출처 : TTA

출처 : TTA

보기만 해도 엄청 복잡해보입니다.

하지만 분리해서 생각하면 단순하게 생각이 가능합니다.

암호화부터 살펴보겠습니다.

출처 : TTA

왼쪽은 CTR mode 연산, 오른쪽은 CBC-MAC 연산입니다.

이렇게 보니 조금은 간단해보입니다.

이렇게 기본 베이스는 CTR + CBC-MAC 이라는 점입니다.

나머지는 관련 규격을 좀 더 자세히 살펴보도록 하겠습니다.

먼저 CCM mode의 입력 요소 3가지에 대해 알아보겠습니다.

1. Payload

2. Associated data

3. Nonce

P는 Payload로 암호화나 MAC 계산에 쓰이는 데이터를 의미합니다.

A는 AD로 위에서 설명한 추가 관련(인증) 데이터를 의미합니다.

N은 Nonce로 Payload나 AD에 할당되는 유일한 값을 의미합니다.

여기서 CTR mode로 암호화하는데 사용되는 데이터는 P와 N입니다.

CTR mode에 대해 알고 있다면 당연하겠죠?

CTR 블록들은 규격에서 정의한대로 포맷팅 됩니다.

자세한 포맷팅 내용은 NIST 규격이나 TTA 규격을 참고하시면 됩니다.

(규격을 분석하는 포스팅은 아니므로,, 이러한 포맷팅 함수들과 디테일한 구현내용은 생략하도록 하겠습니다.)

여기서 주의할점은 바로 CTR0 블록은 암호화 데이터로 사용되지 않는다는 점입니다.

왜 이렇게 설계했는지 까지는 모르겠습니다만..

그리고 N과 P, A는 모두 MAC 계산에 사용됩니다.

B0 블록에 Nonce가 사용되어 포맷팅 되는 것이 특징입니다.

그리고 그뒤에 A(AD)가 포맷팅되어 붙게되고

그 뒤에 P(Payload)가 포맷팅되어 연속적으로 형성됩니다.

그 이후, 해당 데이터들을 이용해서 CBC-MAC 연산을 수행하면됩니다.

그렇게 되면 최종적으로 나온 MAC 값이 규격에서 말하는 T(TAG)값이 됩니다.

마지막으로 이 T값과 CTR0 블록을 이용해서 계산한 S0 값을 XOR 해줍니다.

그리고 Payload를 CTR mode로 암호화한 값 뒤에 붙이면 최종적으로

Encryption data + Tag 값으로 구성된 CCM mode 암호화 데이터가 나옵니다.

대충 요약하면 위와 같다고 볼 수 있습니다..

복호화도 거의 똑같습니다. 왼쪽이 복호화과정 오른쪽이 MAC 연산과정..

마찬가지로 N(Nonce)를 이용해서 암호화된 데이터에 CTR mode 복호화를 수행합니다.

여기서도 CTR0 블록을 이용한 결과 S0는 따로~

자 근데 여기서 CCM mode 복호화 특징입니다.

앞서 MAC 연산에 대한 포맷팅을 적용할때 P(Payload)를 이용해서 CBC-MAC 연산을 했습니다.

그렇다는건,, 무조건 복호화가 먼저 수행된 후에 CBC-MAC 연산이 이루어져야 한다는 점입니다.

(암호화에서는 어떤것이 먼저 수행되도 상관이 없었습니다.)

그리고 한가지 더! AEAD Cipher는 CCM의 경우 복호화가 먼저 수행되어도

사실 Tag 값이 검증되기 전까지는 이 복호화 데이터를 신뢰할 수 없습니다.

그렇기 때문에 Tag 값을 먼저 검증(일치하는지 확인 후) 복호화 데이터를 사용하는 것이 맞습니다.

그 외의 내용들은 사실 Encryption 내용과 거의 동일하기 때문에

어려울 점이 없다고 생각합니다.

CCM의 경우 좀 복잡한 편이라고 생각이 듭니다. CCM은 여기까지 살펴보도록 하겠습니다.

GCM mode (Galois/Counter Mode)

GCM mode는 GF(Galois Field) 상에서 정의된 GHASH 함수를 이용하여 인증을 보장합니다.

CCM mode와 비교했을때 데이터 암호화는 CTR mode를 사용하는 것은 같지만

CBC-MAC 대신 GMAC이라고 불리는 연산을 사용합니다.

GMAC을 그럼 살펴볼까요?

출처 : NIST Special Publication 800-38D

GCM mode는 CCM mode에 비해서 새로운 개념의 MAC 계산이 수행되지만

자질구레(?)한 포맷팅하는 것들이 없어 오히려 간단합니다.

GHASH 함수에 대해 알아보도록 합시다.

먼저 HASH subkey 라고 불리는 H를 구해야합니다.

H를 구하는 방법은 간단합니다.

0으로 채워진 블록을 블록 암호화 하면 끝입니다.

· 연산은 GF(2^128) 상의 곱셈연산입니다.

해당 곱셈연산은 아래와 같이 정의됩니다.( 수학적인 내용이므로 그냥 그대로 따르시는게 정신건강에 좋습니다.)

출처 : TTA

세부 연산내용까지는 설명하지 않겠습니다.(귀찮아서가 아니라.. 규격분석 포스팅이 아니므로..)

출처 : TTA

출처 : TTA

전체 알고리즘입니다. 뭔가 CCM과 전혀 다른느낌으로 보이지만 사실 거의 똑같습니다.

그림이 좀 불친절하게 나왔습니다.

그래서 TTA에서 정의한 다른 문서에서 좀더 보기 쉬운형태의 알고리즘으로 가져와보겠습니다.

암호화부터 살펴보면

더어렵게 보이시면 어쩔수 없지만,, 저는 이게 더 보기 편하더라구요..

위 그림과 비교해서 보면 더 헷갈릴 수 도있겟지만,,

세부 알고리즘을 그림으로 나타내준 형태입니다.

위의 계산이 CTR mode 연산이고 아래 계산이 GHASH(GMAC) 연산입니다.

CCM과 비슷하게 첫번째 CTR0 블록을 따로 만듭니다.

그리고 다른점 한가지는 MAC 연산시에 Encryption 된 데이터를 사용합니다.

이점은 Decryption을 살펴볼 때 CCM에 비해 이점이 되는 부분이 있습니다.

그리고 한가지 더 주의할점은

N (Nonce) 값을 이용해서 CTR0 블록을 만드는데

Nonce의 길이에 따라서 CTR0 블록을 만드는 방식이 달라진다는 점!

자세한 내용은 규격을 참조하세요~!

다음으로 복호화를 살펴보겠습니다.

출처 : TTA

복호화도 비슷한데요

다른점이 있다면 바로 GMAC 연산이 Encryption data로 계산이 되기 때문에

먼저 수행이 될 수 있습니다.

그래서 Tag 값을 계산하여 일치하는지 여부를 먼저 판단한 후에 복호화를 진행할 수 있습니다.

CCM은 Decryption 후에 MAC 계산을 하는 번거로움이 있었지만

GCM은 그러지 않아도 된다는 것이지요~

이외에도 포맷팅이 간단한 편입니다.

실제 구현을 하시는 입장이라면 자세한 세부사항들을 꼭 빠짐없이 보고

규격을 숙지하신 후 구현을 하셔야합니다.

이 포스팅은 규격을 기반으로 하였지만 세부 분석까지는 하지 않았으니 참고만 바랍니다!

이상으로 AEAD Cipher (CCM, GCM) 을 알아보았습니다

[출처] AEAD Cipher(CCM, GCM)|작성자 jhh0712

728x90

+ Recent posts