다음의 공격들을 예방한다.
Authentication과 Integrity를 동시에 제공하는 것 이다.
메시지와 key가 함수에 들어간다.
Message Authentication
M: 메시지 원본, K: Key
송신: [M + MAC(K, M)]를 송신 -> 원본 메시지에 key를 넣은 MAC을 붙여서 전송하는 것
수신: 자기가 가지고 있는 key를 가지고, MAC을 생성해보고, 수신한 것과 결과가 같은지 비교함으로써 Authentication
Message Authentication and Confidentiality
K1: MAC용 key
K2: Encryption을 위한 key
Plaintext에 Authentication 하는 방법
K1을 이용해 MAC을 생성 후, M에 붙인다 (M+MAC(K1, M)) -> output 1
output 1을 K2를 이용해 Encryption 한다. -> output2
output2를 전송한다.
수신자는 K2로 먼저 Decryption 한다 -> output 1
output 1의 M과 K1을 가지고 MAC을 생성한다.
이 MAC 값과 output 1에 붙여져 있는 MAC 값을 비교한다.
Ciphertext에 Authentication 하는 방법
M을 K2를 이용해 Encryption 한다.
그 결과에 K1 이용해 MAC을 생성하여 붙인다. -> output 1
수신자는 output 1의 E(K2, M)을 K2를 이용해 Decryption 하여 M를 얻는다.
output 1에 붙어있는 MAC과 E(K2, M)을 기반으로 자신이 생성한 MAC과 비교한다.
Cryptographic hash function으로부터 MAC을 생성하는 방법이다.
"MD4, SHA같은 hash function이 DES같은 symmetric block cipher보다 빠르다"라는 동기로 HMAC을 사용했었다.
IP security의 MAC이 주로 HMAC을 사용한다.
hash를 2번 사용한다.
DAA(Data Authentication Algorithm)으로부터 CMAC 만들어 진다.
initial vector 없는 CBC mode라고 생각하면 된다.
아래 chain의 결과물을 DAC(Data Authentication Code)라고 한다.
X: plaintext
X가 한 블록 짜리라고 하자. 그러면 initial vector를 안 넣으니까, 결국은 K(key)를 가지고 Encryption 한 번 한 것과 같다.
공격자가 MAC을 만드는 방법 -> MAC의 요구조건에 맞지 않음(불안전)
이러한 문제를 해결하기 위해서 나온 게 CMAC이다.
똑같이 initial vector 없고 피드백해서 진행하다가, 마지막 block에서 또 다른 key를 넣어 xor 한다.
이를 통해, 앞에 언급된 공격이 불가능해진다.
Confidentiality와 Authenticity를 동시에 지키는 암호 시스템
encryption하고 hash 하겠다 -> 안전성 보장되지 않음
Authentication followed by encryption -> Encryption 하고 MAC 하기
Encryption followed by authentication -> MAC하고 Encryption 하기
Encryption 따로, MAC 따로 하기
Counter mode로 Encryption하고 CBC mode로 MAC 함. -> Encryption과 MAC을 독립적으로 연산 (counter로 연관관계 줌)
무선 랜에 보안을 추가하기 위해 나온 NIST 표준
Key algorithmic ingredients
하나의 Key로 encryption과 MAC 알고리즘 둘 다에서 사용한다.
Authentication -> CMAC
Encryption -> Counter
CMAC, CTR 각각 plaintext를 받아 독립적으로 연산을 수행 후, 나중에 합친다.
CMAC을 거쳐서 나온 결과와 Encryption 한 결과는 XOR 한다.
그리고 CTR mode와 두 연산 합치는 부분에서 각각 counter 값이 사용되는데, 이것들의 연관관계를 통해 의존성을 부여한다.
어떤 내용을 숨기면서 Integirty와 Authentication을 보장할 것.
Authentication 하면서 Encryption 할 데이터
예: payload 할 데이터
Encryption 안 하고 없고 Authentication만 할 데이터 -> Associated data
예: Header의 IP address
데이터가 어디서 왔는지 알아야 하니까 암호화할 필요는 없지만, 변조되면 안 되니 인증이 필요한 데이터
nonce
replay 공격을 막아야 하는 데이터
매번 nonce 값을 바꿔서 보냄으로써 데이터가 복제돼도 nonce 값이 과거와 같으면 잘못된 데이터임을 확인할 수 있다.
CCM은 병렬화가 불가능하다는 성능상 문제가 있다.
CTR modes는 병렬화 가능하지만 CMAC은 결과받아서 연산해야 하기 때문에 CCM은 못 한다.
Galois/Counter Mode에서는 병렬화가 가능하다.
Encyption은 똑같이 CTR mode 사용한다.
이렇게 해서 나온 Ciphertext에다가 key material을 이용해 authenticator tag를 만든다.
CCM은 Encryption과 Authentication을 따로 진행하지만, Galois는 Encryption을 먼저 하고 거기에 tag 붙이는 방식.
Encryption 빼고 MAC만 하도록 쓸 수도 있다. -> GMAC
Authentciation에서 Galois field(GF) 사용한다.
GCM은 두 가지 함수를 사용한다
H = E(K, O^128) -> key가 정해지면 hash 값 정해진다.
GF(2^128) 사용한다.
아래 사진에서 (a)를 보면, tag(Ym)를 출력하기 위해, feedback을 계속 받아가며 연산을 해나간다. -> 그럼 병렬화가 안 되는 거 아닌가?
출처
https://hororolol.tistory.com/476?category=897521
[Cryptography and Network Security: Principles and Practices]